Skylark: Remove static type checks
--
MOS_MIGRATED_REVID=91175430
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
index dc97212..aa97af9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
@@ -287,135 +287,8 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- SkylarkType ltype = SkylarkType.typeForInference(lhs.validate(env));
- SkylarkType rtype = SkylarkType.typeForInference(rhs.validate(env));
-
- switch (operator) {
- case AND: {
- return ltype.infer(rtype, "and operator", rhs.getLocation(), lhs.getLocation());
- }
-
- case OR: {
- return ltype.infer(rtype, "or operator", rhs.getLocation(), lhs.getLocation());
- }
-
- case PLUS: {
- // int + int
- if (ltype == SkylarkType.INT && rtype == SkylarkType.INT) {
- return SkylarkType.INT;
- }
-
- // string + string
- if (ltype == SkylarkType.STRING && rtype == SkylarkType.STRING) {
- return SkylarkType.STRING;
- }
-
- // list + list
- if (ltype.isList() && rtype.isList()) {
- return ltype.infer(rtype, "list concatenation", rhs.getLocation(), lhs.getLocation());
- }
-
- // dict + dict
- if (ltype.isDict() && rtype.isDict()) {
- return ltype.infer(rtype, "dict concatenation", rhs.getLocation(), lhs.getLocation());
- }
-
- // struct + struct
- if (ltype.isStruct() && rtype.isStruct()) {
- return SkylarkType.STRUCT;
- }
-
- if (ltype.isNset()) {
- if (rtype.isNset()) {
- return ltype.infer(rtype, "nested set", rhs.getLocation(), lhs.getLocation());
- } else if (rtype.isList()) {
- return ltype.infer(SkylarkType.of(SkylarkType.SET, rtype.getArgType()),
- "nested set", rhs.getLocation(), lhs.getLocation());
- }
- if (rtype != SkylarkType.UNKNOWN) {
- throw new EvalException(getLocation(), String.format("can only concatenate nested sets "
- + "with other nested sets or list of items, not '%s'", rtype));
- }
- }
-
- break;
- }
-
- case MULT: {
- // int * int
- if (ltype == SkylarkType.INT && rtype == SkylarkType.INT) {
- return SkylarkType.INT;
- }
-
- // string * int
- if (ltype == SkylarkType.STRING && rtype == SkylarkType.INT) {
- return SkylarkType.STRING;
- }
-
- // int * string
- if (ltype == SkylarkType.INT && rtype == SkylarkType.STRING) {
- return SkylarkType.STRING;
- }
- break;
- }
-
- case MINUS: {
- if (ltype == SkylarkType.INT && rtype == SkylarkType.INT) {
- return SkylarkType.INT;
- }
- break;
- }
-
- case PERCENT: {
- // int % int
- if (ltype == SkylarkType.INT && rtype == SkylarkType.INT) {
- return SkylarkType.INT;
- }
-
- // string % tuple, string % dict, string % anything-else
- if (ltype == SkylarkType.STRING) {
- return SkylarkType.STRING;
- }
- break;
- }
-
- case EQUALS_EQUALS:
- case NOT_EQUALS:
- case LESS:
- case LESS_EQUALS:
- case GREATER:
- case GREATER_EQUALS: {
- if (ltype != SkylarkType.UNKNOWN && !(Comparable.class.isAssignableFrom(ltype.getType()))) {
- throw new EvalException(getLocation(), ltype + " is not comparable");
- }
- ltype.infer(rtype, "comparison", lhs.getLocation(), rhs.getLocation());
- return SkylarkType.BOOL;
- }
-
- case IN: {
- if (rtype.isList()
- || rtype.isSet()
- || rtype.isNset()
- || rtype.isDict()
- || rtype == SkylarkType.STRING) {
- return SkylarkType.BOOL;
- } else {
- if (rtype != SkylarkType.UNKNOWN) {
- throw new EvalException(getLocation(), String.format("operand 'in' only works on "
- + "strings, dictionaries, lists, sets or tuples, not on a(n) %s", rtype));
- }
- }
- }
- } // endswitch
-
- // NB: this message format is identical to that used by CPython 2.7.6 or 3.4.0,
- // though python raises a TypeError at runtime, whereas we issue an EvalException a bit earlier.
- if (ltype != SkylarkType.UNKNOWN && rtype != SkylarkType.UNKNOWN) {
- throw new EvalException(getLocation(),
- String.format("unsupported operand type(s) for %s: '%s' and '%s'",
- operator, ltype, rtype));
- }
- return SkylarkType.UNKNOWN;
+ void validate(ValidationEnvironment env) throws EvalException {
+ lhs.validate(env);
+ rhs.validate(env);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
index 46471b3..1c43bae 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
@@ -62,9 +62,9 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
+ void validate(ValidationEnvironment env) throws EvalException {
condition.validate(env);
- return thenCase.validate(env)
- .infer(elseCase.validate(env), "else case", thenCase.getLocation(), elseCase.getLocation());
+ thenCase.validate(env);
+ elseCase.validate(env);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
index a2d05ea..e3f813c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
@@ -65,20 +65,10 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- SkylarkType elementsType = listExpression.validate(env);
+ void validate(ValidationEnvironment env) throws EvalException {
+ listExpression.validate(env);
loopVar.validate(env, getLocation());
- SkylarkType keyType = keyExpression.validate(env);
- if (!keyType.isSimple()) {
- // TODO(bazel-team): this is most probably dead code but it's better to have it here
- // in case we enable e.g. list of lists or we validate function calls on Java objects
- throw new EvalException(getLocation(), "Dict comprehension key must be of a simple type");
- }
- valueExpression.validate(env);
- if (elementsType != SkylarkType.UNKNOWN && !elementsType.isList()) {
- throw new EvalException(getLocation(), "Dict comprehension elements must be a list");
- }
- return SkylarkType.of(SkylarkType.MAP, keyType);
+ keyExpression.validate(env);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
index e991504..5d12140 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
@@ -106,17 +106,10 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- SkylarkType type = SkylarkType.UNKNOWN;
+ void validate(ValidationEnvironment env) throws EvalException {
for (DictionaryEntryLiteral entry : entries) {
- SkylarkType nextType = entry.key.validate(env);
+ entry.key.validate(env);
entry.value.validate(env);
- if (!nextType.isSimple()) {
- throw new EvalException(getLocation(),
- String.format("Dict cannot contain composite type '%s' as key", nextType));
- }
- type = type.infer(nextType, "dict literal", entry.getLocation(), getLocation());
}
- return SkylarkType.of(SkylarkType.MAP, type);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
index 65f75e9..b09371a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -102,9 +102,7 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
+ void validate(ValidationEnvironment env) throws EvalException {
obj.validate(env);
- // TODO(bazel-team): check existance of field
- return SkylarkType.UNKNOWN;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java b/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
index 1659eb0..b7842d4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
@@ -47,5 +47,5 @@
*
* @see Statement
*/
- abstract SkylarkType validate(ValidationEnvironment env) throws EvalException;
+ abstract void validate(ValidationEnvironment env) throws EvalException;
}
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 0f6cf14..79f2efa 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
@@ -550,7 +550,7 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
+ void validate(ValidationEnvironment env) throws EvalException {
for (Argument.Passed arg : args) {
arg.getValue().validate(env);
}
@@ -561,6 +561,5 @@
throw new EvalException(getLocation(),
String.format("function '%s' does not exist", func.getName()));
}
- return SkylarkType.UNKNOWN;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index 56ad4b6..57239f3 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -19,7 +19,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.Map;
/**
* Syntax node for a function definition.
@@ -92,30 +91,17 @@
int namedOnly = shape.getNamedOnly();
int mandatoryNamedOnly = shape.getMandatoryNamedOnly();
boolean starArg = shape.hasStarArg();
- boolean hasStar = starArg || (namedOnly > 0);
boolean kwArg = shape.hasKwArg();
int named = positionals + namedOnly;
int args = named + (starArg ? 1 : 0) + (kwArg ? 1 : 0);
int startOptionals = mandatoryPositionals;
int endOptionals = named - mandatoryNamedOnly;
- int iStarArg = named;
- int iKwArg = args - 1;
int j = 0; // index for the defaultExpressions
for (int i = 0; i < args; i++) {
String name = names.get(i);
- SkylarkType argType = SkylarkType.UNKNOWN;
- if (hasStar && i == iStarArg) {
- argType = SkylarkType.of(SkylarkList.class, Object.class);
- } else if (kwArg && i == iKwArg) {
- argType = SkylarkType.of(Map.class, Object.class);
- } else {
- if (startOptionals <= i && i < endOptionals) {
- argType = defaultExpressions.get(j++).validate(env);
- if (argType.equals(SkylarkType.NONE)) {
- argType = SkylarkType.UNKNOWN;
- }
- }
+ if (startOptionals <= i && i < endOptionals) {
+ defaultExpressions.get(j++).validate(env);
}
localEnv.declare(name, getLocation());
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java b/src/main/java/com/google/devtools/build/lib/syntax/Ident.java
index 62ad77b..9bc58b1 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Ident.java
@@ -63,13 +63,13 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- if (env.hasSymbolInEnvironment(name)) {
- return env.getVartype(name);
- } else if (name.equals("$error$")) {
- throw new EvalException(getLocation(), "contains syntax error(s)", true);
- } else {
- throw new EvalException(getLocation(), "name '" + name + "' is not defined");
+ void validate(ValidationEnvironment env) throws EvalException {
+ if (!env.hasSymbolInEnvironment(name)) {
+ if (name.equals("$error$")) {
+ throw new EvalException(getLocation(), "contains syntax error(s)", true);
+ } else {
+ throw new EvalException(getLocation(), "name '" + name + "' is not defined");
+ }
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
index e6852e6b..99c82da 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
@@ -28,7 +28,6 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- return SkylarkType.INT;
+ void validate(ValidationEnvironment env) throws EvalException {
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
index 90cbddd..fde3b28 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
@@ -120,12 +120,11 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
+ void validate(ValidationEnvironment env) throws EvalException {
for (Map.Entry<LValue, Expression> list : lists) {
list.getValue().validate(env);
list.getKey().validate(env, getLocation());
}
elementExpression.validate(env);
- return SkylarkType.LIST;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
index 4d1a838..d9be907 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
@@ -121,14 +121,9 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- SkylarkType type = SkylarkType.UNKNOWN;
- if (!isTuple()) {
- for (Expression expr : exprs) {
- SkylarkType nextType = expr.validate(env);
- type = type.infer(nextType, "list literal", expr.getLocation(), getLocation());
- }
+ void validate(ValidationEnvironment env) throws EvalException {
+ for (Expression expr : exprs) {
+ expr.validate(env);
}
- return SkylarkType.of(SkylarkType.LIST, type);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/NotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/NotExpression.java
index 5a13e79..2fc3fe0 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/NotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/NotExpression.java
@@ -44,9 +44,7 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- // Don't need type check here since EvalUtils.toBoolean() converts everything.
+ void validate(ValidationEnvironment env) throws EvalException {
expression.validate(env);
- return SkylarkType.BOOL;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
index 07032c2..0ecf582 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.syntax;
import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.syntax.SkylarkType.SkylarkFunctionType;
/**
* A wrapper Statement class for return expressions.
@@ -64,12 +63,9 @@
@Override
void validate(ValidationEnvironment env) throws EvalException {
- // TODO(bazel-team): save the return type in the environment, to type-check functions.
- SkylarkFunctionType fct = env.getCurrentFunction();
- if (fct == null) {
+ if (env.getCurrentFunction() == null) {
throw new EvalException(getLocation(), "Return statements must be inside a function");
}
- SkylarkType resultType = returnExpression.validate(env);
- fct.setReturnType(resultType, getLocation());
+ returnExpression.validate(env);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
index 0d3fae7..78ab975 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
@@ -172,12 +172,6 @@
public static final Simple NONE = Simple.of(Environment.NoneType.class);
private static final class Global {}
- /**
- * placeholder type for the namespace that global methods are relative to,
- * used in the validation environment only.
- */
- public static final Simple GLOBAL = Simple.of(Global.class);
-
/** The STRING type, for strings */
public static final Simple STRING = Simple.of(String.class);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
index 2193f36..ae3633b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
@@ -46,7 +46,6 @@
}
@Override
- SkylarkType validate(ValidationEnvironment env) throws EvalException {
- return SkylarkType.STRING;
+ void validate(ValidationEnvironment env) throws EvalException {
}
}