aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-09-20 14:35:11 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-20 16:37:06 +0200
commit17214ac78ffaec369d5d5bafe62a39730473cfaa (patch)
tree783cb524169b1ef2dfe2634be6bb5e52b00e2eae /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
parent30adfbf30b509bdcf5befaf2abd77addb89c8e69 (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.java23
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;
+ }
}
/**