diff options
author | dslomov <dslomov@google.com> | 2017-09-20 14:35:11 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-09-20 16:37:06 +0200 |
commit | 17214ac78ffaec369d5d5bafe62a39730473cfaa (patch) | |
tree | 783cb524169b1ef2dfe2634be6bb5e52b00e2eae /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | |
parent | 30adfbf30b509bdcf5befaf2abd77addb89c8e69 (diff) |
Check parameter types for methods when multiple types are allowed.
Fixes #3714
RELNOTES: None.
PiperOrigin-RevId: 169382686
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 | 23 |
1 files changed, 18 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 f3019e471a..fbb4ef11ce 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,23 @@ 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; + } } /** |