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 { } }