diff options
author | 2015-08-11 16:47:31 +0000 | |
---|---|---|
committer | 2015-08-12 15:22:13 +0000 | |
commit | ee5e5e17d1ab9b1f2bb10115b23ff1a70fccd014 (patch) | |
tree | 84c72c5fa1c507c4351962bc2d72053bb26c82fd /src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java | |
parent | 78c0cc73d3fec13add33b3ac811748647d76b38f (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.java | 32 |
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); } |