diff options
author | 2015-04-13 12:15:04 +0000 | |
---|---|---|
committer | 2015-04-13 12:42:44 +0000 | |
commit | 964d8d55f26341b4e81b38bf0b652d3a8d6a0fac (patch) | |
tree | 506023d056ca5dbc64af5cb7f1da806a2133f53b /src/main/java/com/google/devtools/build/lib | |
parent | c07d9e462a0be4215582eeb95134e0b38b416736 (diff) |
Skylark: Remove static type checking of variables/functions.
There are still some static checks (check existence of variable/function,
readonly variables, etc.). More cleanup will come later.
--
MOS_MIGRATED_REVID=90979748
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
10 files changed, 24 insertions, 85 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java index 601f128aa3..6994231ea1 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java @@ -63,6 +63,7 @@ public final class AssignmentStatement extends Statement { @Override void validate(ValidationEnvironment env) throws EvalException { - lvalue.validate(env, getLocation(), expression.validate(env)); + expression.validate(env); + lvalue.validate(env, getLocation()); } } 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 4c7278be94..a2d05eaba2 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 @@ -67,8 +67,7 @@ public class DictComprehension extends Expression { @Override SkylarkType validate(ValidationEnvironment env) throws EvalException { SkylarkType elementsType = listExpression.validate(env); - SkylarkType listElementType = SkylarkType.getGenericArgType(elementsType); - loopVar.validate(env, getLocation(), listElementType); + 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 diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvaluationContext.java b/src/main/java/com/google/devtools/build/lib/syntax/EvaluationContext.java index c361bb3fca..8ccca055d5 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/EvaluationContext.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/EvaluationContext.java @@ -191,8 +191,7 @@ public final class EvaluationContext { public EvaluationContext update(String varname, Object value) throws EvalException { env.update(varname, value); if (validationEnv != null) { - validationEnv.update( - varname, SkylarkType.typeForInference(SkylarkType.of(value.getClass())), null); + validationEnv.declare(varname, null); } return this; } diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java index 2faf06c857..054b21f1e6 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java @@ -87,9 +87,8 @@ public final class ForStatement extends Statement { "'For' is not allowed as a top level statement"); } // TODO(bazel-team): validate variable. Maybe make it temporarily readonly. - SkylarkType type = collection.validate(env); - env.checkIterable(type, getLocation()); - variable.validate(env, getLocation(), SkylarkType.UNKNOWN); + collection.validate(env); + variable.validate(env, getLocation()); for (Statement stmt : block) { stmt.validate(env); } 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 41fe33238f..0f6cf14af1 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 @@ -556,15 +556,11 @@ public final class FuncallExpression extends Expression { } if (obj != null) { - // TODO(bazel-team): validate function calls on objects too. - return env.getReturnType(obj.validate(env), func.getName(), getLocation()); - } else { - // TODO(bazel-team): Imported functions are not validated properly. - if (!env.hasSymbolInEnvironment(func.getName())) { - throw new EvalException(getLocation(), - String.format("function '%s' does not exist", func.getName())); - } - return env.getReturnType(func.getName(), getLocation()); + obj.validate(env); + } else if (!env.hasSymbolInEnvironment(func.getName())) { + 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 5b0119ee88..56ad4b60cf 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 @@ -117,7 +117,7 @@ public class FunctionDefStatement extends Statement { } } } - localEnv.update(name, argType, getLocation()); + localEnv.declare(name, getLocation()); } for (Statement stmts : statements) { stmts.validate(localEnv); diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java index e7f15d7d5b..846c5b58fc 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java @@ -107,21 +107,20 @@ public class LValue implements Serializable { env.update(ident.getName(), result); } - void validate(ValidationEnvironment env, Location loc, SkylarkType rvalueType) - throws EvalException { - validate(env, loc, expr, rvalueType); + void validate(ValidationEnvironment env, Location loc) throws EvalException { + validate(env, loc, expr); } - private static void validate(ValidationEnvironment env, Location loc, Expression expr, - SkylarkType rvalueType) throws EvalException { + private static void validate(ValidationEnvironment env, Location loc, Expression expr) + throws EvalException { if (expr instanceof Ident) { Ident ident = (Ident) expr; - env.update(ident.getName(), rvalueType, loc); + env.declare(ident.getName(), loc); return; } if (expr instanceof ListLiteral) { for (Expression e : ((ListLiteral) expr).getElements()) { - validate(env, loc, e, SkylarkType.UNKNOWN); + validate(env, loc, e); } return; } 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 26cbfc0e0b..90cbddd41a 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 @@ -122,10 +122,8 @@ public final class ListComprehension extends Expression { @Override SkylarkType validate(ValidationEnvironment env) throws EvalException { for (Map.Entry<LValue, Expression> list : lists) { - // TODO(bazel-team): Get the type of elements - SkylarkType type = list.getValue().validate(env); - env.checkIterable(type, getLocation()); - list.getKey().validate(env, getLocation(), SkylarkType.UNKNOWN); + 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/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java index 9c59989415..414429ebd2 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java @@ -75,9 +75,8 @@ public final class LoadStatement extends Statement { if (!importPath.isAbsolute() && importPath.segmentCount() > 1) { throw new EvalException(getLocation(), String.format(PATH_ERROR_MSG, importPath)); } - // TODO(bazel-team): implement semantical check. for (Ident symbol : symbols) { - env.update(symbol.getName(), SkylarkType.UNKNOWN, getLocation()); + env.declare(symbol.getName(), getLocation()); } } } diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java index 95d7f30847..668688e264 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java @@ -104,11 +104,9 @@ public class ValidationEnvironment { } /** - * Updates the variable type if the new type is "stronger" then the old one. - * The old and the new vartype has to be compatible, otherwise an EvalException is thrown. - * The new type is stronger if the old one doesn't exist or is unknown. + * Declare a variable and add it to the environment. */ - public void update(String varname, SkylarkType newVartype, Location location) + public void declare(String varname, Location location) throws EvalException { checkReadonly(varname, location); if (parent == null) { // top-level values are immutable @@ -118,12 +116,7 @@ public class ValidationEnvironment { futureReadOnlyVariables.peek().add(varname); } } - SkylarkType oldVartype = variableTypes.get(SkylarkType.GLOBAL).get(varname); - if (oldVartype != null) { - newVartype = oldVartype.infer(newVartype, "variable '" + varname + "'", - location, variableLocations.get(varname)); - } - variableTypes.get(SkylarkType.GLOBAL).put(varname, newVartype); + variableTypes.get(SkylarkType.GLOBAL).put(varname, SkylarkType.UNKNOWN); variableLocations.put(varname, location); clonable = false; } @@ -134,19 +127,6 @@ public class ValidationEnvironment { } } - public void checkIterable(SkylarkType type, Location loc) throws EvalException { - if (type == SkylarkType.UNKNOWN) { - // Until all the language is properly typed, we ignore Object types. - return; - } - if (!Iterable.class.isAssignableFrom(type.getType()) - && !Map.class.isAssignableFrom(type.getType()) - && !String.class.equals(type.getType())) { - throw new EvalException(loc, - "type '" + EvalUtils.getDataTypeNameFromClass(type.getType()) + "' is not iterable"); - } - } - /** * Returns true if the symbol exists in the validation environment. */ @@ -171,37 +151,6 @@ public class ValidationEnvironment { return currentFunction; } - /** - * Returns the return type of the function. - */ - public SkylarkType getReturnType(String funcName, Location loc) throws EvalException { - return getReturnType(SkylarkType.GLOBAL, funcName, loc); - } - - /** - * Returns the return type of the object function. - */ - public SkylarkType getReturnType(SkylarkType objectType, String funcName, Location loc) - throws EvalException { - // All functions are registered in the top level ValidationEnvironment. - Map<String, SkylarkType> functions = topLevel().variableTypes.get(objectType); - // TODO(bazel-team): eventually not finding the return type should be a validation error, - // because it means the function doesn't exist. First we have to make sure that we register - // every possible function before. - if (functions != null) { - SkylarkType functionType = functions.get(funcName); - if (functionType != null && functionType != SkylarkType.UNKNOWN) { - if (!(functionType instanceof SkylarkFunctionType)) { - throw new EvalException(loc, String.format("%s%s is not a function but a(n) %s", - (objectType == SkylarkType.GLOBAL ? "" : objectType + "."), - funcName, functionType)); - } - return ((SkylarkFunctionType) functionType).getReturnType(); - } - } - return SkylarkType.UNKNOWN; - } - private ValidationEnvironment topLevel() { return Preconditions.checkNotNull(parent == null ? this : parent); } |