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