diff options
author | Dmitry Lomov <dslomov@google.com> | 2017-09-25 08:53:50 -0400 |
---|---|---|
committer | John Cater <jcater@google.com> | 2017-09-25 09:40:11 -0400 |
commit | d22e1dea7aa6135baceee18c6eac23a7d1b3c18e (patch) | |
tree | 12e48ae9474fbe686ffd5d6b15c44be0e1255ad4 /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | |
parent | 7084156b634acfe55a8e2a536665f85d4963efec (diff) |
Check parameter types for methods when multiple types are allowed.
Relanding
https://github.com/bazelbuild/bazel/commit/17214ac78ffaec369d5d5bafe62a39730473cfaa
with fixes to 'repository_ctx.download()' and
'repository_ctx.download_and_extract()'.
I reviewed other usages of @ParamType annotation - I do not think there
are more issues.
Fixes #3714.
Change-Id: I17087ef3fc2d28ab99224740a2164675a49847d3
PiperOrigin-RevId: 169896223
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java index a6d45972c2..de65acefd1 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java @@ -25,6 +25,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.skylarkinterface.Param; +import com.google.devtools.build.lib.skylarkinterface.ParamType; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; @@ -388,11 +389,24 @@ public final class FuncallExpression extends Expression { } private static SkylarkType getType(Param param) { - SkylarkType type = - param.generic1() != Object.class - ? SkylarkType.of(param.type(), param.generic1()) - : SkylarkType.of(param.type()); - return type; + if (param.allowedTypes().length > 0) { + Preconditions.checkState(Object.class.equals(param.type())); + SkylarkType result = SkylarkType.BOTTOM; + for (ParamType paramType : param.allowedTypes()) { + SkylarkType t = + paramType.generic1() != Object.class + ? SkylarkType.of(paramType.type(), paramType.generic1()) + : SkylarkType.of(paramType.type()); + result = SkylarkType.Union.of(result, t); + } + return result; + } else { + SkylarkType type = + param.generic1() != Object.class + ? SkylarkType.of(param.type(), param.generic1()) + : SkylarkType.of(param.type()); + return type; + } } /** |