diff options
author | Francois-Rene Rideau <tunes@google.com> | 2015-02-23 21:20:58 +0000 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-23 21:20:58 +0000 |
commit | 9ac42efb8acb80890e40186ae419de3d86dec2f2 (patch) | |
tree | c7a1d1deb6ce555f96af10d10f7296f33ff2b844 /src | |
parent | 60f809b760599bd92eeae725f909a8ddddc2e852 (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.java | 17 |
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) { |