diff options
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; + } } /** |