aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
diff options
context:
space:
mode:
authorGravatar Florian Weikert <fwe@google.com>2015-08-11 16:47:31 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-08-12 15:22:13 +0000
commitee5e5e17d1ab9b1f2bb10115b23ff1a70fccd014 (patch)
tree84c72c5fa1c507c4351962bc2d72053bb26c82fd /src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
parent78c0cc73d3fec13add33b3ac811748647d76b38f (diff)
Improved error messages for builtin Skylark functions that are invoked with invalid arguments.
-- MOS_MIGRATED_REVID=100386706
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
index 3c041b73c9..7fc85baa3f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
@@ -164,21 +164,25 @@ public class BuiltinFunction extends BaseFunction {
throw badCallException(loc, e, args);
}
} catch (IllegalArgumentException e) {
- // Either this was thrown by Java itself, or it's a bug
- // To cover the first case, let's manually check the arguments.
- final int len = args.length - ((extraArgs == null) ? 0 : extraArgs.length);
- final Class<?>[] types = invokeMethod.getParameterTypes();
- for (int i = 0; i < args.length; i++) {
- if (args[i] != null && !types[i].isAssignableFrom(args[i].getClass())) {
- String paramName = i < len
- ? signature.getSignature().getNames().get(i) : extraArgs[i - len].name();
- throw new EvalException(loc, String.format(
- "expected %s for '%s' while calling %s but got %s instead",
- EvalUtils.getDataTypeNameFromClass(types[i]), paramName, getName(),
- EvalUtils.getDataTypeName(args[i])));
- }
+ // Either this was thrown by Java itself, or it's a bug
+ // To cover the first case, let's manually check the arguments.
+ final int len = args.length - ((extraArgs == null) ? 0 : extraArgs.length);
+ final Class<?>[] types = invokeMethod.getParameterTypes();
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] != null && !types[i].isAssignableFrom(args[i].getClass())) {
+ String paramName =
+ i < len ? signature.getSignature().getNames().get(i) : extraArgs[i - len].name();
+ int extraArgsCount = (extraArgs == null) ? 0 : extraArgs.length;
+ throw new EvalException(
+ loc,
+ String.format(
+ "Method %s is not applicable for arguments %s: '%s' is %s, but should be %s",
+ getShortSignature(), printTypeString(args, args.length - extraArgsCount),
+ paramName, EvalUtils.getDataTypeName(args[i]),
+ EvalUtils.getDataTypeNameFromClass(types[i])));
}
- throw badCallException(loc, e, args);
+ }
+ throw badCallException(loc, e, args);
} catch (IllegalAccessException e) {
throw badCallException(loc, e, args);
}