aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-04-13 12:15:04 +0000
committerGravatar Lukacs Berki <lberki@google.com>2015-04-13 12:42:44 +0000
commit964d8d55f26341b4e81b38bf0b652d3a8d6a0fac (patch)
tree506023d056ca5dbc64af5cb7f1da806a2133f53b /src/main/java/com/google/devtools/build/lib
parentc07d9e462a0be4215582eeb95134e0b38b416736 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/EvaluationContext.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/LValue.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java57
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);
}