aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2017-09-25 08:53:50 -0400
committerGravatar John Cater <jcater@google.com>2017-09-25 09:40:11 -0400
commitd22e1dea7aa6135baceee18c6eac23a7d1b3c18e (patch)
tree12e48ae9474fbe686ffd5d6b15c44be0e1255ad4 /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
parent7084156b634acfe55a8e2a536665f85d4963efec (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.java24
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;
+ }
}
/**