aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Francois-Rene Rideau <tunes@google.com>2015-02-23 21:20:58 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-02-23 21:20:58 +0000
commit9ac42efb8acb80890e40186ae419de3d86dec2f2 (patch)
treec7a1d1deb6ce555f96af10d10f7296f33ff2b844 /src
parent60f809b760599bd92eeae725f909a8ddddc2e852 (diff)
Make an error message more robust.
Make it not depend on the iteration order on the hash table of **kwargs. -- MOS_MIGRATED_REVID=86986044
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
index 4116328071..31f2d2d083 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
@@ -13,12 +13,15 @@
// limitations under the License.
package com.google.devtools.build.lib.syntax;
+import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Type.ConversionException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -109,6 +112,14 @@ public abstract class MixedModeFunction extends AbstractFunction {
this(name, FunctionSignature.WithValues.<Object, SkylarkType>create(signature), null);
}
+ // TODO(bazel-team): find a home for this function, maybe a better implementation.
+ private static <E> ArrayList<E> listDifference (List<E> plus, List<E> minus) {
+ final ArrayList<E> list = new ArrayList<>();
+ list.addAll(plus);
+ list.removeAll(minus);
+ return list;
+ }
+
@Override
public Object call(List<Object> args,
Map<String, Object> kwargs,
@@ -147,8 +158,12 @@ public abstract class MixedModeFunction extends AbstractFunction {
String keyword = entry.getKey();
int pos = parameters.indexOf(keyword);
if (pos == -1) {
+ List<String> unexpected =
+ listDifference(new ArrayList<>(kwargs.keySet()), parameters);
+ Collections.sort(unexpected); // issue stable error messages.
throw new EvalException(loc,
- "unexpected keyword '" + keyword
+ "unexpected keyword" + (unexpected.size() > 1 ? "s" : "") + " '"
+ + Joiner.on("', '").join(unexpected)
+ "' in call to " + getSignature());
} else {
if (namedArguments[pos] != null) {