diff --git a/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/ThreadHandler.java b/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/ThreadHandler.java
index 7f662f3..b25522b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/ThreadHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/ThreadHandler.java
@@ -26,13 +26,9 @@
 import com.google.devtools.build.lib.skylarkdebugging.SkylarkDebuggingProtos.Value;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.EvalUtils;
-import com.google.devtools.build.lib.syntax.Expression;
-import com.google.devtools.build.lib.syntax.LoadStatement;
 import com.google.devtools.build.lib.syntax.ParserInput;
 import com.google.devtools.build.lib.syntax.Runtime;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collection;
@@ -288,11 +284,11 @@
   }
 
   /**
-   * Evaluate the given expression in the environment defined by the provided {@link
-   * StarlarkThread}. The "expression" may be a sequence of statements, in which case it is executed
-   * for its side effects, such as assignments.
+   * Executes the Starlark statements code in the environment defined by the provided {@link
+   * StarlarkThread}. If the last statement is an expression, doEvaluate returns its value,
+   * otherwise it returns null.
    *
-   * <p>The caller is responsible for ensuring that the associated skylark thread isn't currently
+   * <p>The caller is responsible for ensuring that the associated Starlark thread isn't currently
    * running.
    */
   private Object doEvaluate(StarlarkThread thread, String content)
@@ -300,45 +296,14 @@
     try {
       servicingEvalRequest.set(true);
 
-      // doEvaluate used to be vague about what part of syntax 'content' must be.
-      // Historically it was a "list of statements optionally followed by an expression",
-      // such as "x+1" or "x=2" or "x=2; x+1", but lib.syntax no longer supports that,
-      // and its API revolves around expressions and files (sequence of statements).
-      // Ideally the caller of doEvaluate would explicitly choose so we could simplify
-      // the logic below.
-      // The result of evaluating a Statement is None.
-
       ParserInput input = ParserInput.create(content, PathFragment.create("<debug eval>"));
-
-      // Try parsing as an expression.
-      try {
-        Expression expr = Expression.parse(input);
-        return thread.debugEval(expr);
-      } catch (SyntaxError unused) {
-        // Assume it is a file and execute it.
-        exec(input, thread);
-        return Runtime.NONE;
-      }
+      Object x = EvalUtils.execAndEvalOptionalFinalExpression(input, thread);
+      return x != null ? x : Runtime.NONE;
     } finally {
       servicingEvalRequest.set(false);
     }
   }
 
-  /** Parses, validates, and executes a Skylark file (sequence of statements) in this thread. */
-  private static void exec(ParserInput input, StarlarkThread thread)
-      throws SyntaxError, EvalException, InterruptedException {
-    StarlarkFile file = EvalUtils.parseAndValidateSkylark(input, thread);
-    if (!file.ok()) {
-      throw new SyntaxError(file.errors());
-    }
-    for (Statement stmt : file.getStatements()) {
-      if (stmt instanceof LoadStatement) {
-        throw new EvalException(stmt.getLocation(), "cannot execute load statements in debugger");
-      }
-    }
-    EvalUtils.exec(file, thread);
-  }
-
   /**
    * Pauses the current thread's execution, blocking until it's resumed via a
    * ContinueExecutionRequest.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index 8ee3592..2232a0c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -1109,12 +1109,6 @@
     }
   }
 
-  /** Executes a parsed, validated Starlark file in a given StarlarkThread. */
-  public static void exec(StarlarkFile file, StarlarkThread thread)
-      throws EvalException, InterruptedException {
-    Eval.execFile(thread, file);
-  }
-
   /**
    * Parses the input as a file, validates it in the {@code thread.getGlobals} environment using
    * options defined by {@code thread.getSemantics}, and returns the syntax tree. It uses Starlark
@@ -1131,15 +1125,55 @@
   }
 
   /**
-   * Executes the validated file and returns the value of the last statement if it's an Expression,
-   * null otherwise.
+   * Parses the input as a file, validates it in the {@code thread.getGlobals} environment using
+   * options defined by {@code thread.getSemantics}, and executes it. It uses Starlark (not BUILD)
+   * validation semantics.
    */
-  // TODO(adonovan): Split into two APIs, eval(expr) and exec(file).
-  // Abolish "statement" and "file+expr" as primary API concepts and
-  // make callers decide whether they want to execute a file or evaluate an expression.
-  @Nullable
-  public static Object execOrEval(StarlarkFile file, StarlarkThread thread)
+  public static void exec(ParserInput input, StarlarkThread thread)
+      throws SyntaxError, EvalException, InterruptedException {
+    StarlarkFile file = parseAndValidateSkylark(input, thread);
+    if (!file.ok()) {
+      throw new SyntaxError(file.errors());
+    }
+    // TODO(adonovan): turn toplevel statements into a StarlarkFunction, and call it.
+    // This ensures we have an entry in the call stack even for the toplevel.
+    exec(file, thread);
+  }
+
+  /** Executes a parsed, validated Starlark file in a given StarlarkThread. */
+  public static void exec(StarlarkFile file, StarlarkThread thread)
       throws EvalException, InterruptedException {
+    Eval.execFile(thread, file);
+  }
+
+  /**
+   * Parses the input as an expression, validates it in the {@code thread.getGlobals} environment
+   * using options defined by {@code thread.getSemantics}, and evaluates it. It uses Starlark (not
+   * BUILD) validation semantics.
+   */
+  public static Object eval(ParserInput input, StarlarkThread thread)
+      throws SyntaxError, EvalException, InterruptedException {
+    Expression expr = Expression.parse(input);
+    ValidationEnvironment.validateExpr(expr, thread.getGlobals(), thread.getSemantics());
+    // TODO(adonovan): turn expr into a StarlarkFunction, and call it.
+    // This ensures we have an entry in the call stack even for the toplevel.
+    return Eval.eval(thread, expr);
+  }
+
+  /**
+   * Parses the input as a file, validates it in the {@code thread.getGlobals} environment using
+   * options defined by {@code thread.getSemantics}, and executes it. The function uses Starlark
+   * (not BUILD) validation semantics. If the final statement is an expression statement, it returns
+   * the value of that expression, otherwise it returns null.
+   *
+   * <p>The function's name is intentionally unattractive. Don't call it unless you're accepting
+   * strings from an interactive user interface such as a REPL or debugger; use {@link #exec} or
+   * {@link #eval} instead.
+   */
+  @Nullable
+  public static Object execAndEvalOptionalFinalExpression(ParserInput input, StarlarkThread thread)
+      throws SyntaxError, EvalException, InterruptedException {
+    StarlarkFile file = StarlarkFile.parse(input);
     List<Statement> stmts = file.getStatements();
     Expression expr = null;
     int n = stmts.size();
@@ -1147,25 +1181,12 @@
       expr = ((ExpressionStatement) stmts.get(n - 1)).getExpression();
       stmts = stmts.subList(0, n - 1);
     }
-    Eval.execStatements(thread, stmts);
-    return expr == null ? null : Eval.eval(thread, expr);
-  }
-
-  /**
-   * Parses, resolves and evaluates the input as a file and returns the value of the last statement
-   * if it's an Expression, null otherwise. In case of scan/parse/resolver error, it throws a
-   * SyntaxError containing one or more specific errors. If evaluation fails, it throws an
-   * EvalException or InterruptedException. The return value is as for eval(StarlarkThread).
-   */
-  // Note: uses Starlark (not BUILD) validation semantics.
-  // TODO(adonovan): see comments at other execOrEval function.
-  @Nullable
-  public static Object execOrEval(ParserInput input, StarlarkThread thread)
-      throws SyntaxError, EvalException, InterruptedException {
-    StarlarkFile file = parseAndValidateSkylark(input, thread);
+    ValidationEnvironment.validateFile(
+        file, thread.getGlobals(), thread.getSemantics(), /*isBuildFile=*/ false);
     if (!file.ok()) {
       throw new SyntaxError(file.errors());
     }
-    return execOrEval(file, thread);
+    Eval.execStatements(thread, stmts);
+    return expr != null ? Eval.eval(thread, expr) : null;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSignatureProcessor.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSignatureProcessor.java
index 89f8efb..db45a0b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSignatureProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSignatureProcessor.java
@@ -331,7 +331,7 @@
                   .setGlobals(StarlarkThread.CONSTANTS_ONLY)
                   .build()
                   .update("unbound", Runtime.UNBOUND);
-          defaultValue = EvalUtils.execOrEval(ParserInput.fromLines(paramDefaultValue), thread);
+          defaultValue = EvalUtils.eval(ParserInput.fromLines(paramDefaultValue), thread);
           defaultValueCache.put(paramDefaultValue, defaultValue);
           return defaultValue;
         }
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 73051ae..0dcff06 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
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.util.SpellChecker;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -487,6 +488,25 @@
     Preconditions.checkState(venv.block.parent == null);
   }
 
+  /**
+   * Performs static checks, including resolution of identifiers in {@code expr} in the environment
+   * defined by {@code module}. This operation mutates the Expression.
+   */
+  public static void validateExpr(Expression expr, Module module, StarlarkSemantics semantics)
+      throws SyntaxError {
+    List<Event> errors = new ArrayList<>();
+    ValidationEnvironment venv =
+        new ValidationEnvironment(errors, module, semantics, /*isBuildFile=*/ false);
+
+    venv.openBlock(Scope.Local); // needed?
+    venv.visit(expr);
+    venv.closeBlock();
+
+    if (!errors.isEmpty()) {
+      throw new SyntaxError(errors);
+    }
+  }
+
   /** Open a new lexical block that will contain the future declarations. */
   private void openBlock(Scope scope) {
     block = new Block(scope, block);
diff --git a/src/main/java/com/google/devtools/starlark/Starlark.java b/src/main/java/com/google/devtools/starlark/Starlark.java
index 9053eb2..f5d6dbe 100644
--- a/src/main/java/com/google/devtools/starlark/Starlark.java
+++ b/src/main/java/com/google/devtools/starlark/Starlark.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.syntax.ParserInput;
 import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
+import com.google.devtools.build.lib.syntax.SyntaxError;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -89,14 +90,28 @@
   @SuppressWarnings("CatchAndPrintStackTrace")
   public void readEvalPrintLoop() {
     String line;
+
+    // TODO(adonovan): parse a compound statement, like the Python and
+    // go.starlark.net REPLs. This requires a new grammar production, and
+    // integration with the lexer so that it consumes new
+    // lines only until the parse is complete.
+
     while ((line = prompt()) != null) {
+      ParserInput input = ParserInput.fromLines(line);
       try {
-        Object result = EvalUtils.execOrEval(ParserInput.fromLines(line), thread);
+        Object result = EvalUtils.execAndEvalOptionalFinalExpression(input, thread);
         if (result != null) {
           System.out.println(Printer.repr(result));
         }
-      } catch (Exception e) {
-        e.printStackTrace();
+      } catch (SyntaxError ex) {
+        for (Event ev : ex.errors()) {
+          System.err.println(ev);
+        }
+      } catch (EvalException ex) {
+        // TODO(adonovan): show Starlark (not Java) stack.
+        ex.printStackTrace();
+      } catch (InterruptedException ex) {
+        System.err.println("Interrupted");
       }
     }
   }
@@ -113,12 +128,17 @@
     }
   }
 
-  /** Execute a Starlark command. */
+  /** Execute a Starlark file. */
   public int execute(String content) {
+    ParserInput input = ParserInput.create(content, null);
     try {
-      ParserInput input = ParserInput.create(content, null);
-      EvalUtils.execOrEval(input, thread);
+      EvalUtils.exec(input, thread);
       return 0;
+    } catch (SyntaxError ex) {
+      for (Event ev : ex.errors()) {
+        System.err.println(ev);
+      }
+      return 1;
     } catch (EvalException e) {
       System.err.println(e.print());
       return 1;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
index e26b403..381f66e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
@@ -29,23 +29,23 @@
   @Test
   public void testSplitEscaped() throws Exception {
     newTest()
-        .testStatement("split_escaped('a:b:c', ':')", MutableList.of(thread, "a", "b", "c"))
-        .testStatement("split_escaped('a%:b', ':')", MutableList.of(thread, "a:b"))
-        .testStatement("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
-        .testStatement("split_escaped('a:::b', ':')", MutableList.of(thread, "a", "", "", "b"))
-        .testStatement("split_escaped('a:b%:c', ':')", MutableList.of(thread, "a", "b:c"))
-        .testStatement("split_escaped('a%%:b:c', ':')", MutableList.of(thread, "a%", "b", "c"))
-        .testStatement("split_escaped(':a', ':')", MutableList.of(thread, "", "a"))
-        .testStatement("split_escaped('a:', ':')", MutableList.of(thread, "a", ""))
-        .testStatement("split_escaped('::a::', ':')", MutableList.of(thread, "", "", "a", "", ""))
-        .testStatement("split_escaped('%%%:a%%%%:b', ':')", MutableList.of(thread, "%:a%%", "b"))
-        .testStatement("split_escaped('', ':')", MutableList.of(thread))
-        .testStatement("split_escaped('%', ':')", MutableList.of(thread, "%"))
-        .testStatement("split_escaped('%%', ':')", MutableList.of(thread, "%"))
-        .testStatement("split_escaped('%:', ':')", MutableList.of(thread, ":"))
-        .testStatement("split_escaped(':', ':')", MutableList.of(thread, "", ""))
-        .testStatement("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
-        .testStatement("split_escaped('a%:', ':')", MutableList.of(thread, "a:"));
+        .testExpression("split_escaped('a:b:c', ':')", MutableList.of(thread, "a", "b", "c"))
+        .testExpression("split_escaped('a%:b', ':')", MutableList.of(thread, "a:b"))
+        .testExpression("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
+        .testExpression("split_escaped('a:::b', ':')", MutableList.of(thread, "a", "", "", "b"))
+        .testExpression("split_escaped('a:b%:c', ':')", MutableList.of(thread, "a", "b:c"))
+        .testExpression("split_escaped('a%%:b:c', ':')", MutableList.of(thread, "a%", "b", "c"))
+        .testExpression("split_escaped(':a', ':')", MutableList.of(thread, "", "a"))
+        .testExpression("split_escaped('a:', ':')", MutableList.of(thread, "a", ""))
+        .testExpression("split_escaped('::a::', ':')", MutableList.of(thread, "", "", "a", "", ""))
+        .testExpression("split_escaped('%%%:a%%%%:b', ':')", MutableList.of(thread, "%:a%%", "b"))
+        .testExpression("split_escaped('', ':')", MutableList.of(thread))
+        .testExpression("split_escaped('%', ':')", MutableList.of(thread, "%"))
+        .testExpression("split_escaped('%%', ':')", MutableList.of(thread, "%"))
+        .testExpression("split_escaped('%:', ':')", MutableList.of(thread, ":"))
+        .testExpression("split_escaped(':', ':')", MutableList.of(thread, "", ""))
+        .testExpression("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
+        .testExpression("split_escaped('a%:', ':')", MutableList.of(thread, "a:"));
   }
 
   private ModalTestCase newTest(String... skylarkOptions) throws IOException {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
index db5d3af..4671ba2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
@@ -95,7 +95,7 @@
 
   @Test
   public void starlarkConstructor() throws Exception {
-    eval(
+    exec(
         "info = PyInfo(",
         "    transitive_sources = depset(direct=[dummy_file]),",
         "    uses_shared_libraries = True,",
@@ -116,7 +116,7 @@
 
   @Test
   public void starlarkConstructorDefaults() throws Exception {
-    eval("info = PyInfo(transitive_sources = depset(direct=[dummy_file]))");
+    exec("info = PyInfo(transitive_sources = depset(direct=[dummy_file]))");
     PyInfo info = (PyInfo) lookup("info");
     assertThat(info.getCreationLoc().getStartOffset()).isEqualTo(7);
     assertHasOrderAndContainsExactly(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
index 38c2086..d2d5d9a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
@@ -84,7 +84,7 @@
 
   @Test
   public void starlarkConstructor_InBuildRuntime() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(",
         "    interpreter = dummy_interpreter,",
         "    files = depset([dummy_file]),",
@@ -100,7 +100,7 @@
 
   @Test
   public void starlarkConstructor_PlatformRuntime() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(", //
         "    interpreter_path = '/system/interpreter',",
         "    python_version = 'PY2',",
@@ -115,7 +115,7 @@
 
   @Test
   public void starlarkConstructor_FilesDefaultsToEmpty() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(", //
         "    interpreter = dummy_interpreter,",
         "    python_version = 'PY2',",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 43bdbc7..f9dc053 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -136,7 +136,7 @@
   }
 
   private void registerDummyStarlarkFunction() throws Exception {
-    eval("def impl():", "  pass");
+    exec("def impl():", "  pass");
   }
 
   @Test
@@ -689,6 +689,7 @@
     assertThat(c.hasAttr("a1", Type.STRING)).isTrue();
   }
 
+  // TODO(adonovan): rename execAndExport
   private void evalAndExport(String... lines) throws Exception {
     ParserInput input = ParserInput.fromLines(lines);
     StarlarkFile file = EvalUtils.parseAndValidateSkylark(input, ev.getStarlarkThread());
@@ -1071,14 +1072,14 @@
   @Test
   public void testStructCreation() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)");
+    exec("x = struct(a = 1, b = 2)");
     assertThat(lookup("x")).isInstanceOf(ClassObject.class);
   }
 
   @Test
   public void testStructFields() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)");
+    exec("x = struct(a = 1, b = 2)");
     ClassObject x = (ClassObject) lookup("x");
     assertThat(x.getValue("a")).isEqualTo(1);
     assertThat(x.getValue("b")).isEqualTo(2);
@@ -1090,14 +1091,15 @@
     assertThat((Boolean) eval("struct(a = 1) == struct(a = 1, b = 2)")).isFalse();
     assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1)")).isFalse();
     // Compare a recursive object to itself to make sure reference equality is checked
-    assertThat((Boolean) eval("s = (struct(a = 1, b = [])); s.b.append(s); s == s")).isTrue();
+    exec("s = struct(a = 1, b = []); s.b.append(s)");
+    assertThat((Boolean) eval("s == s")).isTrue();
     assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1, b = 3)")).isFalse();
     assertThat((Boolean) eval("struct(a = 1) == [1]")).isFalse();
     assertThat((Boolean) eval("[1] == struct(a = 1)")).isFalse();
     assertThat((Boolean) eval("struct() == struct()")).isTrue();
     assertThat((Boolean) eval("struct() == struct(a = 1)")).isFalse();
 
-    eval("foo = provider(); bar = provider()");
+    exec("foo = provider(); bar = provider()");
     assertThat((Boolean) eval("struct(a = 1) == foo(a = 1)")).isFalse();
     assertThat((Boolean) eval("foo(a = 1) == struct(a = 1)")).isFalse();
     assertThat((Boolean) eval("foo(a = 1) == bar(a = 1)")).isFalse();
@@ -1114,7 +1116,7 @@
 
   @Test
   public void testStructAccessingFieldsFromSkylark() throws Exception {
-    eval("x = struct(a = 1, b = 2)", "x1 = x.a", "x2 = x.b");
+    exec("x = struct(a = 1, b = 2)", "x1 = x.a", "x2 = x.b");
     assertThat(lookup("x1")).isEqualTo(1);
     assertThat(lookup("x2")).isEqualTo(2);
   }
@@ -1141,7 +1143,7 @@
 
   @Test
   public void testStructAccessingFunctionFieldWithArgs() throws Exception {
-    eval("def f(x): return x+5", "x = struct(a = f, b = 2)", "x1 = x.a(1)");
+    exec("def f(x): return x+5", "x = struct(a = f, b = 2)", "x1 = x.a(1)");
     assertThat(lookup("x1")).isEqualTo(6);
   }
 
@@ -1154,7 +1156,8 @@
   @Test
   public void testStructConcatenationFieldNames() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)",
+    exec(
+        "x = struct(a = 1, b = 2)", //
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     StructImpl z = (StructImpl) lookup("z");
@@ -1164,7 +1167,8 @@
   @Test
   public void testStructConcatenationFieldValues() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)",
+    exec(
+        "x = struct(a = 1, b = 2)", //
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     StructImpl z = (StructImpl) lookup("z");
@@ -1186,7 +1190,8 @@
   @Test
   public void testConditionalStructConcatenation() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("def func():",
+    exec(
+        "def func():",
         "  x = struct(a = 1, b = 2)",
         "  if True:",
         "    x += struct(c = 1, d = 2)",
@@ -1209,14 +1214,15 @@
 
   @Test
   public void testGetattr() throws Exception {
-    eval("s = struct(a='val')", "x = getattr(s, 'a')", "y = getattr(s, 'b', 'def')");
+    exec("s = struct(a='val')", "x = getattr(s, 'a')", "y = getattr(s, 'b', 'def')");
     assertThat(lookup("x")).isEqualTo("val");
     assertThat(lookup("y")).isEqualTo("def");
   }
 
   @Test
   public void testHasattr() throws Exception {
-    eval("s = struct(a=1)",
+    exec(
+        "s = struct(a=1)", //
         "x = hasattr(s, 'a')",
         "y = hasattr(s, 'b')\n");
     assertThat(lookup("x")).isEqualTo(true);
@@ -1231,12 +1237,12 @@
 
   @Test
   public void testStructsInSets() throws Exception {
-    eval("depset([struct(a='a')])");
+    exec("depset([struct(a='a')])");
   }
 
   @Test
   public void testStructsInDicts() throws Exception {
-    eval("d = {struct(a = 1): 'aa', struct(b = 2): 'bb'}");
+    exec("d = {struct(a = 1): 'aa', struct(b = 2): 'bb'}");
     assertThat(eval("d[struct(a = 1)]")).isEqualTo("aa");
     assertThat(eval("d[struct(b = 2)]")).isEqualTo("bb");
     assertThat(eval("str([d[k] for k in d])")).isEqualTo("[\"aa\", \"bb\"]");
@@ -1246,15 +1252,15 @@
 
   @Test
   public void testStructDictMembersAreMutable() throws Exception {
-    eval(
-        "s = struct(x = {'a' : 1})",
+    exec(
+        "s = struct(x = {'a' : 1})", //
         "s.x['b'] = 2\n");
     assertThat(((StructImpl) lookup("s")).getValue("x")).isEqualTo(ImmutableMap.of("a", 1, "b", 2));
   }
 
   @Test
   public void testNsetGoodCompositeItem() throws Exception {
-    eval("def func():", "  return depset([struct(a='a')])", "s = func()");
+    exec("def func():", "  return depset([struct(a='a')])", "s = func()");
     Collection<?> result = ((SkylarkNestedSet) lookup("s")).toCollection();
     assertThat(result).hasSize(1);
     assertThat(result.iterator().next()).isInstanceOf(StructImpl.class);
@@ -1808,7 +1814,7 @@
 
   @Test
   public void testTypeOfStruct() throws Exception {
-    eval("p = type(struct)", "s = type(struct())");
+    exec("p = type(struct)", "s = type(struct())");
 
     assertThat(lookup("p")).isEqualTo("Provider");
     assertThat(lookup("s")).isEqualTo("struct");
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index f336712..59b4b9a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -692,7 +692,7 @@
   public void testCreateSpawnActionArgumentsWithExecutableFilesToRunProvider() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:androidlib");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -709,7 +709,7 @@
   public void testCreateStarlarkActionArgumentsWithUnusedInputsList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -729,7 +729,7 @@
   public void testCreateStarlarkActionArgumentsWithoutUnusedInputsList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -905,8 +905,7 @@
   @Test
   public void testDeriveTreeArtifactType() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result = eval("b = ruleContext.actions.declare_directory('a/b')\n" + "type(b)");
-    assertThat(result).isInstanceOf(String.class);
+    String result = (String) eval("type(ruleContext.actions.declare_directory('a/b'))");
     assertThat(result).isEqualTo("File");
   }
 
@@ -914,11 +913,11 @@
   @Test
   public void testDeriveTreeArtifactNextToSibling() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "b = ruleContext.actions.declare_directory('a/b')\n"
-                + "ruleContext.actions.declare_directory('c', sibling=b)");
-    Artifact artifact = (Artifact) result;
+    Artifact artifact =
+        (Artifact)
+            eval(
+                "ruleContext.actions.declare_directory('c',"
+                    + " sibling=ruleContext.actions.declare_directory('a/b'))");
     PathFragment fragment = artifact.getRootRelativePath();
     assertThat(fragment.getPathString()).isEqualTo("foo/a/c");
     assertThat(artifact.isTreeArtifact()).isTrue();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index c7c5909..99425da 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -203,7 +203,7 @@
             .getDeclaredField("mockFunc")
             .getAnnotation(SkylarkSignature.class));
     update("mock", mockFunc);
-    eval(line);
+    exec(line);
   }
 
   private void checkSkylarkFunctionError(String errorMsg, String line) throws Exception {
@@ -303,7 +303,7 @@
   public void testCreateSpawnActionArgumentsWithExecutable() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -323,7 +323,7 @@
     // Same test as above, with depset as inputs.
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = depset(ruleContext.files.srcs),",
         "  outputs = ruleContext.files.srcs,",
@@ -355,7 +355,7 @@
   public void testCreateSpawnActionShellCommandList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run_shell(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -375,7 +375,7 @@
   public void testCreateSpawnActionEnvAndExecInfo() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run_shell(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -535,7 +535,7 @@
   public void testCreateFileAction() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.write(",
         "  output = ruleContext.files.srcs[0],",
         "  content = 'hello world',",
@@ -666,7 +666,7 @@
   @Test
   public void testResolveCommandMakeVariables() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, manifests = ruleContext.resolve_command(",
         "  command='I got the $(HELLO) on a $(DAVE)', ",
         "  make_variables={'HELLO': 'World', 'DAVE': type('')})");
@@ -681,7 +681,7 @@
   @Test
   public void testResolveCommandInputs() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, input_manifests = ruleContext.resolve_command(",
         "   tools=ruleContext.attr.tools)");
     @SuppressWarnings("unchecked")
@@ -701,7 +701,7 @@
   @Test
   public void testResolveCommandExpandLocations() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "def foo():", // no for loops at top-level
         "  label_dict = {}",
         "  all = []",
@@ -724,7 +724,7 @@
   public void testResolveCommandExecutionRequirements() throws Exception {
     // Tests that requires-darwin execution requirements result in the usage of /bin/bash.
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, manifests = ruleContext.resolve_command(",
         "  execution_requirements={'requires-darwin': ''})");
     @SuppressWarnings("unchecked")
@@ -735,7 +735,7 @@
   @Test
   public void testResolveCommandScript() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "def foo():", // no for loops at top-level
         "  s = 'a'",
         "  for i in range(1,17): s = s + s", // 2**17 > CommandHelper.maxCommandLength (=64000)
@@ -753,7 +753,7 @@
   public void testResolveTools() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:resolve_me");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "inputs, input_manifests = ruleContext.resolve_tools(tools=ruleContext.attr.tools)",
         "ruleContext.actions.run(",
         "    outputs = [ruleContext.actions.declare_file('x.out')],",
@@ -799,7 +799,7 @@
   public void testCreateTemplateAction() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.expand_template(",
         "  template = ruleContext.files.srcs[0],",
         "  output = ruleContext.files.srcs[1],",
@@ -836,7 +836,7 @@
     Charset utf8 = StandardCharsets.UTF_8;
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.expand_template(",
         "  template = ruleContext.files.srcs[0],",
         "  output = ruleContext.files.srcs[1],",
@@ -894,16 +894,14 @@
   @Test
   public void testRunfilesArtifactsFromArtifact() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval("artifacts = ruleContext.files.tools", "ruleContext.runfiles(files = artifacts)");
+    Object result = eval("ruleContext.runfiles(files = ruleContext.files.tools)");
     assertThat(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result))).contains("t.exe");
   }
 
   @Test
   public void testRunfilesArtifactsFromIterableArtifacts() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval("artifacts = ruleContext.files.srcs", "ruleContext.runfiles(files = artifacts)");
+    Object result = eval("ruleContext.runfiles(files = ruleContext.files.srcs)");
     assertThat(ImmutableList.of("a.txt", "b.img"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -911,9 +909,7 @@
   @Test
   public void testRunfilesArtifactsFromNestedSetArtifacts() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "ftb = depset(ruleContext.files.srcs)", "ruleContext.runfiles(transitive_files = ftb)");
+    Object result = eval("ruleContext.runfiles(transitive_files = depset(ruleContext.files.srcs))");
     assertThat(ImmutableList.of("a.txt", "b.img"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -921,12 +917,10 @@
   @Test
   public void testRunfilesArtifactsFromDefaultAndFiles() throws Exception {
     setRuleContext(createRuleContext("//foo:bar"));
+    // It would be nice to write [DEFAULT] + ruleContext.files.srcs, but artifacts
+    // is an ImmutableList and Skylark interprets it as a tuple.
     Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            // It would be nice to write [DEFAULT] + artifacts, but artifacts
-            // is an ImmutableList and Skylark interprets it as a tuple.
-            "ruleContext.runfiles(collect_default = True, files = artifacts)");
+        eval("ruleContext.runfiles(collect_default = True, files = ruleContext.files.srcs)");
     // From DEFAULT only libjl.jar comes, see testRunfilesAddFromDependencies().
     assertThat(ImmutableList.of("libjl.jar", "gl.a", "gl.gcgox"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
@@ -935,10 +929,7 @@
   @Test
   public void testRunfilesArtifactsFromSymlink() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            "ruleContext.runfiles(symlinks = {'sym1': artifacts[0]})");
+    Object result = eval("ruleContext.runfiles(symlinks = {'sym1': ruleContext.files.srcs[0]})");
     assertThat(ImmutableList.of("a.txt"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -947,9 +938,7 @@
   public void testRunfilesArtifactsFromRootSymlink() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
     Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            "ruleContext.runfiles(root_symlinks = {'sym1': artifacts[0]})");
+        eval("ruleContext.runfiles(root_symlinks = {'sym1': ruleContext.files.srcs[0]})");
     assertThat(ImmutableList.of("a.txt"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -958,13 +947,12 @@
   public void testRunfilesSymlinkConflict() throws Exception {
     // Two different artifacts mapped to same path in runfiles
     setRuleContext(createRuleContext("//foo:foo"));
+    exec("prefix = ruleContext.workspace_name + '/' if ruleContext.workspace_name else ''");
     Object result =
         eval(
-            "artifacts = ruleContext.files.srcs",
-            "prefix = ruleContext.workspace_name + '/' if ruleContext.workspace_name else ''",
             "ruleContext.runfiles(",
-            "root_symlinks = {prefix + 'sym1': artifacts[0]},",
-            "symlinks = {'sym1': artifacts[1]})");
+            "  root_symlinks = {prefix + 'sym1': ruleContext.files.srcs[0]},",
+            "  symlinks = {'sym1': ruleContext.files.srcs[1]})");
     Runfiles runfiles = (Runfiles) result;
     reporter.removeHandler(failFastHandler); // So it doesn't throw an exception.
     runfiles.getRunfilesInputs(reporter, null, ArtifactPathResolver.IDENTITY);
@@ -993,7 +981,7 @@
   @Test
   public void testCmdJoinPaths() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result = eval("f = depset(ruleContext.files.srcs)", "cmd_helper.join_paths(':', f)");
+    Object result = eval("cmd_helper.join_paths(':', depset(ruleContext.files.srcs))");
     assertThat(result).isEqualTo("foo/a.txt:foo/b.img");
   }
 
@@ -2032,7 +2020,7 @@
   public void testArgsScalarAdd() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "args.add('-')",
@@ -2074,7 +2062,7 @@
   public void testArgsAddAll() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add_all([1, 2])",
         "args.add('-')",
@@ -2133,7 +2121,7 @@
   public void testArgsAddAllWithMapEach() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "def expand_to_many(val): return ['hey', 'hey']",
         "args = ruleContext.actions.args()",
@@ -2159,7 +2147,7 @@
   public void testOmitIfEmpty() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "def filter(val): return None",
         "args = ruleContext.actions.args()",
@@ -2202,7 +2190,7 @@
   public void testUniquify() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "args = ruleContext.actions.args()",
         "args.add_all(['a', 'b', 'a'])",
@@ -2227,7 +2215,7 @@
   public void testArgsAddJoined() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "args = ruleContext.actions.args()",
         "args.add_joined([1, 2], join_with=':')",
@@ -2273,7 +2261,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def map_scalar(val): return 'mapped' + val",
         "def map_vector(vals): return [x + 1 for x in vals]",
         "args = ruleContext.actions.args()",
@@ -2328,7 +2316,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(args): return [0]",
         "args.add([1, 2], map_fn=bad_fn)",
@@ -2353,7 +2341,7 @@
   public void testMultipleLazyArgsMixedWithStrings() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "foo_args = ruleContext.actions.args()",
         "foo_args.add('--foo')",
         "bar_args = ruleContext.actions.args()",
@@ -2401,7 +2389,7 @@
   public void testWriteArgsToParamFile() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "output=ruleContext.actions.declare_file('out')",
@@ -2481,7 +2469,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('foo', format='format/%s%s')", // Expects two args, will only be given one
         "ruleContext.actions.run(",
@@ -2536,7 +2524,7 @@
   public void testLazyArgMapEachThrowsError() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(val): 'hello'.nosuchmethod()",
         "args.add_all([1, 2], map_each=bad_fn)",
@@ -2559,7 +2547,7 @@
   public void testLazyArgMapEachReturnsNone() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def none_fn(val): return None if val == 'nokeep' else val",
         "args.add_all(['keep', 'nokeep'], map_each=none_fn)",
@@ -2580,7 +2568,7 @@
   public void testLazyArgMapEachReturnsWrongType() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(val): return 1",
         "args.add_all([1, 2], map_each=bad_fn)",
@@ -2604,7 +2592,7 @@
   public void createShellWithLazyArgs() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "ruleContext.actions.run_shell(",
@@ -2927,81 +2915,64 @@
 
     ImmutableList.Builder<SkylarkCustomCommandLine> commandLines = ImmutableList.builder();
 
-    commandLines.add(getCommandLine("ruleContext.actions.args()"));
+    commandLines.add(getCommandLine("args = ruleContext.actions.args()"));
+    commandLines.add(getCommandLine("args = ruleContext.actions.args()", "args.add('foo')"));
     commandLines.add(
-        getCommandLine("args = ruleContext.actions.args()", "args.add('foo')", "args"));
+        getCommandLine("args = ruleContext.actions.args()", "args.add('--foo', 'foo')"));
     commandLines.add(
-        getCommandLine("args = ruleContext.actions.args()", "args.add('--foo', 'foo')", "args"));
+        getCommandLine("args = ruleContext.actions.args()", "args.add('foo', format='--foo=%s')"));
+    commandLines.add(
+        getCommandLine("args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'])"));
     commandLines.add(
         getCommandLine(
-            "args = ruleContext.actions.args()", "args.add('foo', format='--foo=%s')", "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'])", "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()", "args.add_all('-foo', ['foo', 'bar'])", "args"));
+            "args = ruleContext.actions.args()", "args.add_all('-foo', ['foo', 'bar'])"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], format_each='format%s')",
-            "args"));
+            "args.add_all(['foo', 'bar'], format_each='format%s')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'], before_each='-I')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_all(['boing', 'boing', 'boing'])"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], before_each='-I')",
-            "args"));
+            "args.add_all(['boing', 'boing', 'boing'], uniquify=True)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['boing', 'boing', 'boing'])",
-            "args"));
+            "args.add_all(['foo', 'bar'], terminate_with='baz')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_joined(['foo', 'bar'], join_with=',')"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['boing', 'boing', 'boing'], uniquify=True)",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], terminate_with='baz')",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_joined(['foo', 'bar'], join_with=',')",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_joined(['foo', 'bar'], join_with=',', format_joined='--foo=%s')",
-            "args"));
+            "args.add_joined(['foo', 'bar'], join_with=',', format_joined='--foo=%s')"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped'",
-            "args.add_all(['foo', 'bar'], map_each=_map_each)",
-            "args"));
+            "args.add_all(['foo', 'bar'], map_each=_map_each)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "values = depset(['a', 'b'])",
-            "args.add_all(values)",
-            "args"));
+            "args.add_all(values)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped'",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_map_each)",
-            "args"));
+            "args.add_all(values, map_each=_map_each)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped_again'",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_map_each)",
-            "args"));
+            "args.add_all(values, map_each=_map_each)"));
 
     // Ensure all these command lines have distinct keys
     ActionKeyContext actionKeyContext = new ActionKeyContext();
@@ -3027,23 +2998,22 @@
             "args = ruleContext.actions.args()",
             "def _bad_fn(s): return s.doesnotexist()",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_bad_fn)",
-            "args");
+            "args.add_all(values, map_each=_bad_fn)");
     assertThrows(
         CommandLineExpansionException.class,
         () -> commandLine.addToFingerprint(actionKeyContext, new Fingerprint()));
   }
 
   private SkylarkCustomCommandLine getCommandLine(String... lines) throws Exception {
-    return ((SkylarkActionFactory.Args) eval(lines)).build();
+    exec(lines);
+    return ((SkylarkActionFactory.Args) eval("args")).build();
   }
 
   @Test
   public void testPrintArgs() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Args args =
-        (Args)
-            eval("args = ruleContext.actions.args()", "args.add_all(['--foo', '--bar'])", "args");
+    exec("args = ruleContext.actions.args()", "args.add_all(['--foo', '--bar'])");
+    Args args = (Args) eval("args");
     assertThat(Printer.debugPrint(args)).isEqualTo("--foo --bar");
   }
 
@@ -3051,14 +3021,12 @@
   public void testDirectoryInArgs() throws Exception {
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3080,14 +3048,12 @@
   public void testDirectoryInArgsIncompatibleFlagOff() throws Exception {
     setSkylarkSemanticsOptions("--noincompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3105,15 +3071,13 @@
   public void testDirectoryInArgsExpandDirectories() throws Exception {
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path, expand_directories=True)",
-                "args.add_all([directory], map_each=_short_path, expand_directories=False)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path, expand_directories=True)",
+        "args.add_all([directory], map_each=_short_path, expand_directories=False)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3143,13 +3107,11 @@
   public void testDirectoryInScalarArgsIsOkWithoutIncompatibleFlag() throws Exception {
     setSkylarkSemanticsOptions("--noincompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    Args args =
-        (Args)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "args.add(directory)",
-                "args");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "args.add(directory)");
+    Args args = (Args) eval("args");
     assertThat(Iterables.getOnlyElement(args.build().arguments())).endsWith("foo/dir");
   }
 
@@ -3158,15 +3120,13 @@
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     SkylarkRuleContext ctx = createRuleContext("//foo:foo");
     setRuleContext(ctx);
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "args.add_all([directory])",
-                "params = ruleContext.actions.declare_file('params')",
-                "ruleContext.actions.write(params, args)",
-                "params, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "args.add_all([directory])",
+        "params = ruleContext.actions.declare_file('params')",
+        "ruleContext.actions.write(params, args)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("params, directory");
     Artifact params = (Artifact) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     ActionAnalysisMetadata action =
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index 9490885..27fda47 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -91,6 +91,10 @@
     return ev.eval(input);
   }
 
+  protected final void exec(String... lines) throws Exception {
+    ev.exec(lines);
+  }
+
   protected final void update(String name, Object value) throws Exception {
     ev.update(name, value);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
index 7e71328..79eeaa7 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
@@ -130,7 +130,7 @@
   @SuppressWarnings("unchecked")
   @Test
   public void testKwParam() throws Exception {
-    eval(
+    exec(
         "def foo(a, b, c=3, d=4, g=7, h=8, *args, **kwargs):\n"
             + "  return (a, b, c, d, g, h, args, kwargs)\n"
             + "v1 = foo(1, 2)\n"
@@ -159,7 +159,7 @@
   public void testTrailingCommas() throws Exception {
     // Test that trailing commas are allowed in function definitions and calls
     // even after last *args or **kwargs expressions, like python3
-    eval(
+    exec(
         "def f(*args, **kwargs): pass\n"
             + "v1 = f(1,)\n"
             + "v2 = f(*(1,2),)\n"
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index db3ac9c..afdb1cf 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -64,7 +64,7 @@
             .build();
     ParserInput input = ParserInput.fromLines("print('hello'); x = 1//0; print('goodbye')");
     try {
-      EvalUtils.execOrEval(input, thread);
+      EvalUtils.exec(input, thread);
       throw new AssertionError("execution succeeded unexpectedly");
     } catch (EvalException ex) {
       // ok, division by zero
@@ -80,14 +80,14 @@
   @Test
   public void testExprs() throws Exception {
     newTest()
-        .testStatement("'%sx' % 'foo' + 'bar1'", "fooxbar1")
-        .testStatement("('%sx' % 'foo') + 'bar2'", "fooxbar2")
-        .testStatement("'%sx' % ('foo' + 'bar3')", "foobar3x")
-        .testStatement("123 + 456", 579)
-        .testStatement("456 - 123", 333)
-        .testStatement("8 % 3", 2)
+        .testExpression("'%sx' % 'foo' + 'bar1'", "fooxbar1")
+        .testExpression("('%sx' % 'foo') + 'bar2'", "fooxbar2")
+        .testExpression("'%sx' % ('foo' + 'bar3')", "foobar3x")
+        .testExpression("123 + 456", 579)
+        .testExpression("456 - 123", 333)
+        .testExpression("8 % 3", 2)
         .testIfErrorContains("unsupported operand type(s) for %: 'int' and 'string'", "3 % 'foo'")
-        .testStatement("-5", -5)
+        .testExpression("-5", -5)
         .testIfErrorContains("unsupported unary operation: -string", "-'foo'");
   }
 
@@ -98,38 +98,35 @@
 
   @Test
   public void testStringFormatMultipleArgs() throws Exception {
-    newTest().testStatement("'%sY%s' % ('X', 'Z')", "XYZ");
+    newTest().testExpression("'%sY%s' % ('X', 'Z')", "XYZ");
   }
 
   @Test
   public void testConditionalExpressions() throws Exception {
     newTest()
-        .testStatement("1 if True else 2", 1)
-        .testStatement("1 if False else 2", 2)
-        .testStatement("1 + 2 if 3 + 4 else 5 + 6", 3);
+        .testExpression("1 if True else 2", 1)
+        .testExpression("1 if False else 2", 2)
+        .testExpression("1 + 2 if 3 + 4 else 5 + 6", 3);
   }
 
   @Test
   public void testListComparison() throws Exception {
     newTest()
-        .testStatement("[] < [1]", true)
-        .testStatement("[1] < [1, 1]", true)
-        .testStatement("[1, 1] < [1, 2]", true)
-        .testStatement("[1, 2] < [1, 2, 3]", true)
-        .testStatement("[1, 2, 3] <= [1, 2, 3]", true)
-
-        .testStatement("['a', 'b'] > ['a']", true)
-        .testStatement("['a', 'b'] >= ['a']", true)
-        .testStatement("['a', 'b'] < ['a']", false)
-        .testStatement("['a', 'b'] <= ['a']", false)
-
-        .testStatement("('a', 'b') > ('a', 'b')", false)
-        .testStatement("('a', 'b') >= ('a', 'b')", true)
-        .testStatement("('a', 'b') < ('a', 'b')", false)
-        .testStatement("('a', 'b') <= ('a', 'b')", true)
-
-        .testStatement("[[1, 1]] > [[1, 1], []]", false)
-        .testStatement("[[1, 1]] < [[1, 1], []]", true);
+        .testExpression("[] < [1]", true)
+        .testExpression("[1] < [1, 1]", true)
+        .testExpression("[1, 1] < [1, 2]", true)
+        .testExpression("[1, 2] < [1, 2, 3]", true)
+        .testExpression("[1, 2, 3] <= [1, 2, 3]", true)
+        .testExpression("['a', 'b'] > ['a']", true)
+        .testExpression("['a', 'b'] >= ['a']", true)
+        .testExpression("['a', 'b'] < ['a']", false)
+        .testExpression("['a', 'b'] <= ['a']", false)
+        .testExpression("('a', 'b') > ('a', 'b')", false)
+        .testExpression("('a', 'b') >= ('a', 'b')", true)
+        .testExpression("('a', 'b') < ('a', 'b')", false)
+        .testExpression("('a', 'b') <= ('a', 'b')", true)
+        .testExpression("[[1, 1]] > [[1, 1], []]", false)
+        .testExpression("[[1, 1]] < [[1, 1], []]", true);
   }
 
   @Test
@@ -155,15 +152,20 @@
           }
         };
 
-    newTest().update(sum.getName(), sum).testStatement("sum(1, 2, 3, 4, 5, 6)", 21)
-        .testStatement("sum", sum).testStatement("sum(a=1, b=2)", 0);
+    newTest()
+        .update(sum.getName(), sum)
+        .testExpression("sum(1, 2, 3, 4, 5, 6)", 21)
+        .testExpression("sum", sum)
+        .testExpression("sum(a=1, b=2)", 0);
   }
 
   @Test
   public void testNotCallInt() throws Exception {
-    newTest().setUp("sum = 123456").testLookup("sum", 123456)
+    newTest()
+        .setUp("sum = 123456")
+        .testLookup("sum", 123456)
         .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
-        .testStatement("sum", 123456);
+        .testExpression("sum", 123456);
   }
 
   @Test
@@ -201,24 +203,24 @@
   @Test
   public void testModulo() throws Exception {
     newTest()
-        .testStatement("6 % 2", 0)
-        .testStatement("6 % 4", 2)
-        .testStatement("3 % 6", 3)
-        .testStatement("7 % -4", -1)
-        .testStatement("-7 % 4", 1)
-        .testStatement("-7 % -4", -3)
+        .testExpression("6 % 2", 0)
+        .testExpression("6 % 4", 2)
+        .testExpression("3 % 6", 3)
+        .testExpression("7 % -4", -1)
+        .testExpression("-7 % 4", 1)
+        .testExpression("-7 % -4", -3)
         .testIfExactError("integer modulo by zero", "5 % 0");
   }
 
   @Test
   public void testMult() throws Exception {
     newTest()
-        .testStatement("6 * 7", 42)
-        .testStatement("3 * 'ab'", "ababab")
-        .testStatement("0 * 'ab'", "")
-        .testStatement("'1' + '0' * 5", "100000")
-        .testStatement("'ab' * -4", "")
-        .testStatement("-1 * ''", "");
+        .testExpression("6 * 7", 42)
+        .testExpression("3 * 'ab'", "ababab")
+        .testExpression("0 * 'ab'", "")
+        .testExpression("'1' + '0' * 5", "100000")
+        .testExpression("'ab' * -4", "")
+        .testExpression("-1 * ''", "");
   }
 
   @Test
@@ -229,13 +231,13 @@
   @Test
   public void testFloorDivision() throws Exception {
     newTest()
-        .testStatement("6 // 2", 3)
-        .testStatement("6 // 4", 1)
-        .testStatement("3 // 6", 0)
-        .testStatement("7 // -2", -4)
-        .testStatement("-7 // 2", -4)
-        .testStatement("-7 // -2", 3)
-        .testStatement("2147483647 // 2", 1073741823)
+        .testExpression("6 // 2", 3)
+        .testExpression("6 // 4", 1)
+        .testExpression("3 // 6", 0)
+        .testExpression("7 // -2", -4)
+        .testExpression("-7 // 2", -4)
+        .testExpression("-7 // -2", 3)
+        .testExpression("2147483647 // 2", 1073741823)
         .testIfErrorContains("unsupported operand type(s) for //: 'string' and 'int'", "'str' // 2")
         .testIfExactError("integer division by zero", "5 // 0");
   }
@@ -255,14 +257,14 @@
   @Test
   public void testOperatorPrecedence() throws Exception {
     newTest()
-        .testStatement("2 + 3 * 4", 14)
-        .testStatement("2 + 3 // 4", 2)
-        .testStatement("2 * 3 + 4 // -2", 4);
+        .testExpression("2 + 3 * 4", 14)
+        .testExpression("2 + 3 // 4", 2)
+        .testExpression("2 * 3 + 4 // -2", 4);
   }
 
   @Test
   public void testConcatStrings() throws Exception {
-    newTest().testStatement("'foo' + 'bar'", "foobar");
+    newTest().testExpression("'foo' + 'bar'", "foobar");
   }
 
   @SuppressWarnings("unchecked")
@@ -327,10 +329,12 @@
   @Test
   public void testNestedListComprehensions() throws Exception {
     newTest()
-        .testExactOrder("li = [[1, 2], [3, 4]]\n" + "[j for i in li for j in i]", 1, 2, 3, 4)
+        .setUp("li = [[1, 2], [3, 4]]")
+        .testExactOrder("[j for i in li for j in i]", 1, 2, 3, 4);
+    newTest()
+        .setUp("input = [['abc'], ['def', 'ghi']]\n")
         .testExactOrder(
-            "input = [['abc'], ['def', 'ghi']]\n"
-                + "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
+            "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
             "abc a", "abc b", "abc c", "def d", "def e", "def f", "ghi g", "ghi h", "ghi i");
   }
 
@@ -426,15 +430,16 @@
   @Test
   public void testDictComprehensions() throws Exception {
     newTest()
-        .testStatement("{a : a for a in []}", Collections.emptyMap())
-        .testStatement("{b : b for b in [1, 2]}", ImmutableMap.of(1, 1, 2, 2))
-        .testStatement("{c : 'v_' + c for c in ['a', 'b']}",
-            ImmutableMap.of("a", "v_a", "b", "v_b"))
-        .testStatement("{'k_' + d : d for d in ['a', 'b']}",
-            ImmutableMap.of("k_a", "a", "k_b", "b"))
-        .testStatement("{'k_' + e : 'v_' + e for e in ['a', 'b']}",
+        .testExpression("{a : a for a in []}", Collections.emptyMap())
+        .testExpression("{b : b for b in [1, 2]}", ImmutableMap.of(1, 1, 2, 2))
+        .testExpression(
+            "{c : 'v_' + c for c in ['a', 'b']}", ImmutableMap.of("a", "v_a", "b", "v_b"))
+        .testExpression(
+            "{'k_' + d : d for d in ['a', 'b']}", ImmutableMap.of("k_a", "a", "k_b", "b"))
+        .testExpression(
+            "{'k_' + e : 'v_' + e for e in ['a', 'b']}",
             ImmutableMap.of("k_a", "v_a", "k_b", "v_b"))
-        .testStatement("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
+        .testExpression("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
   }
 
   @Test
@@ -444,23 +449,25 @@
 
   @Test
   public void testDictComprehension_ManyClauses() throws Exception {
-    new SkylarkTest().testStatement(
-        "{x : x * y for x in range(1, 10) if x % 2 == 0 for y in range(1, 10) if y == x}",
-        ImmutableMap.of(2, 4, 4, 16, 6, 36, 8, 64));
+    new SkylarkTest()
+        .testExpression(
+            "{x : x * y for x in range(1, 10) if x % 2 == 0 for y in range(1, 10) if y == x}",
+            ImmutableMap.of(2, 4, 4, 16, 6, 36, 8, 64));
   }
 
   @Test
   public void testDictComprehensions_MultipleKey() throws Exception {
-    newTest().testStatement("{x : x for x in [1, 2, 1]}", ImmutableMap.of(1, 1, 2, 2))
-        .testStatement("{y : y for y in ['ab', 'c', 'a' + 'b']}",
-            ImmutableMap.of("ab", "ab", "c", "c"));
+    newTest()
+        .testExpression("{x : x for x in [1, 2, 1]}", ImmutableMap.of(1, 1, 2, 2))
+        .testExpression(
+            "{y : y for y in ['ab', 'c', 'a' + 'b']}", ImmutableMap.of("ab", "ab", "c", "c"));
   }
 
   @Test
   public void testListConcatenation() throws Exception {
     newTest()
-        .testStatement("[1, 2] + [3, 4]", MutableList.of(thread, 1, 2, 3, 4))
-        .testStatement("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
+        .testExpression("[1, 2] + [3, 4]", MutableList.of(thread, 1, 2, 3, 4))
+        .testExpression("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
         .testIfExactError(
             "unsupported operand type(s) for +: 'list' and 'tuple'", "[1, 2] + (3, 4)")
         .testIfExactError(
@@ -470,35 +477,35 @@
   @Test
   public void testListMultiply() throws Exception {
     newTest()
-        .testStatement("[1, 2, 3] * 1", MutableList.of(thread, 1, 2, 3))
-        .testStatement("[1, 2] * 2", MutableList.of(thread, 1, 2, 1, 2))
-        .testStatement("[1, 2] * 3", MutableList.of(thread, 1, 2, 1, 2, 1, 2))
-        .testStatement("[1, 2] * 4", MutableList.of(thread, 1, 2, 1, 2, 1, 2, 1, 2))
-        .testStatement("[8] * 5", MutableList.of(thread, 8, 8, 8, 8, 8))
-        .testStatement("[    ] * 10", MutableList.empty())
-        .testStatement("[1, 2] * 0", MutableList.empty())
-        .testStatement("[1, 2] * -4", MutableList.empty())
-        .testStatement("2 * [1, 2]", MutableList.of(thread, 1, 2, 1, 2))
-        .testStatement("10 * []", MutableList.empty())
-        .testStatement("0 * [1, 2]", MutableList.empty())
-        .testStatement("-4 * [1, 2]", MutableList.empty());
+        .testExpression("[1, 2, 3] * 1", MutableList.of(thread, 1, 2, 3))
+        .testExpression("[1, 2] * 2", MutableList.of(thread, 1, 2, 1, 2))
+        .testExpression("[1, 2] * 3", MutableList.of(thread, 1, 2, 1, 2, 1, 2))
+        .testExpression("[1, 2] * 4", MutableList.of(thread, 1, 2, 1, 2, 1, 2, 1, 2))
+        .testExpression("[8] * 5", MutableList.of(thread, 8, 8, 8, 8, 8))
+        .testExpression("[    ] * 10", MutableList.empty())
+        .testExpression("[1, 2] * 0", MutableList.empty())
+        .testExpression("[1, 2] * -4", MutableList.empty())
+        .testExpression("2 * [1, 2]", MutableList.of(thread, 1, 2, 1, 2))
+        .testExpression("10 * []", MutableList.empty())
+        .testExpression("0 * [1, 2]", MutableList.empty())
+        .testExpression("-4 * [1, 2]", MutableList.empty());
   }
 
   @Test
   public void testTupleMultiply() throws Exception {
     newTest()
-        .testStatement("(1, 2, 3) * 1", Tuple.of(1, 2, 3))
-        .testStatement("(1, 2) * 2", Tuple.of(1, 2, 1, 2))
-        .testStatement("(1, 2) * 3", Tuple.of(1, 2, 1, 2, 1, 2))
-        .testStatement("(1, 2) * 4", Tuple.of(1, 2, 1, 2, 1, 2, 1, 2))
-        .testStatement("(8,) * 5", Tuple.of(8, 8, 8, 8, 8))
-        .testStatement("(    ) * 10", Tuple.empty())
-        .testStatement("(1, 2) * 0", Tuple.empty())
-        .testStatement("(1, 2) * -4", Tuple.empty())
-        .testStatement("2 * (1, 2)", Tuple.of(1, 2, 1, 2))
-        .testStatement("10 * ()", Tuple.empty())
-        .testStatement("0 * (1, 2)", Tuple.empty())
-        .testStatement("-4 * (1, 2)", Tuple.empty());
+        .testExpression("(1, 2, 3) * 1", Tuple.of(1, 2, 3))
+        .testExpression("(1, 2) * 2", Tuple.of(1, 2, 1, 2))
+        .testExpression("(1, 2) * 3", Tuple.of(1, 2, 1, 2, 1, 2))
+        .testExpression("(1, 2) * 4", Tuple.of(1, 2, 1, 2, 1, 2, 1, 2))
+        .testExpression("(8,) * 5", Tuple.of(8, 8, 8, 8, 8))
+        .testExpression("(    ) * 10", Tuple.empty())
+        .testExpression("(1, 2) * 0", Tuple.empty())
+        .testExpression("(1, 2) * -4", Tuple.empty())
+        .testExpression("2 * (1, 2)", Tuple.of(1, 2, 1, 2))
+        .testExpression("10 * ()", Tuple.empty())
+        .testExpression("0 * (1, 2)", Tuple.empty())
+        .testExpression("-4 * (1, 2)", Tuple.empty());
   }
 
   @SuppressWarnings("unchecked")
@@ -546,7 +553,7 @@
 
   @Test
   public void testListComprehensionOnDictionary() throws Exception {
-    newTest().testExactOrder("val = ['var_' + n for n in {'a':1,'b':2}] ; val", "var_a", "var_b");
+    newTest().testExactOrder("['var_' + n for n in {'a':1,'b':2}]", "var_a", "var_b");
   }
 
   @Test
@@ -602,29 +609,29 @@
   @Test
   public void testInOperator() throws Exception {
     newTest()
-        .testStatement("'b' in ['a', 'b']", Boolean.TRUE)
-        .testStatement("'c' in ['a', 'b']", Boolean.FALSE)
-        .testStatement("'b' in ('a', 'b')", Boolean.TRUE)
-        .testStatement("'c' in ('a', 'b')", Boolean.FALSE)
-        .testStatement("'b' in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("'c' in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("1 in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("'b' in 'abc'", Boolean.TRUE)
-        .testStatement("'d' in 'abc'", Boolean.FALSE);
+        .testExpression("'b' in ['a', 'b']", Boolean.TRUE)
+        .testExpression("'c' in ['a', 'b']", Boolean.FALSE)
+        .testExpression("'b' in ('a', 'b')", Boolean.TRUE)
+        .testExpression("'c' in ('a', 'b')", Boolean.FALSE)
+        .testExpression("'b' in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("'c' in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("1 in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("'b' in 'abc'", Boolean.TRUE)
+        .testExpression("'d' in 'abc'", Boolean.FALSE);
   }
 
   @Test
   public void testNotInOperator() throws Exception {
     newTest()
-        .testStatement("'b' not in ['a', 'b']", Boolean.FALSE)
-        .testStatement("'c' not in ['a', 'b']", Boolean.TRUE)
-        .testStatement("'b' not in ('a', 'b')", Boolean.FALSE)
-        .testStatement("'c' not in ('a', 'b')", Boolean.TRUE)
-        .testStatement("'b' not in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("'c' not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("1 not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("'b' not in 'abc'", Boolean.FALSE)
-        .testStatement("'d' not in 'abc'", Boolean.TRUE);
+        .testExpression("'b' not in ['a', 'b']", Boolean.FALSE)
+        .testExpression("'c' not in ['a', 'b']", Boolean.TRUE)
+        .testExpression("'b' not in ('a', 'b')", Boolean.FALSE)
+        .testExpression("'c' not in ('a', 'b')", Boolean.TRUE)
+        .testExpression("'b' not in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("'c' not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("1 not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("'b' not in 'abc'", Boolean.FALSE)
+        .testExpression("'d' not in 'abc'", Boolean.TRUE);
   }
 
   @Test
@@ -637,7 +644,7 @@
 
   @Test
   public void testInCompositeForPrecedence() throws Exception {
-    newTest().testStatement("not 'a' in ['a'] or 0", 0);
+    newTest().testExpression("not 'a' in ['a'] or 0", 0);
   }
 
   private SkylarkValue createObjWithStr() {
@@ -651,22 +658,20 @@
 
   @Test
   public void testPercOnObject() throws Exception {
-    newTest()
-        .update("obj", createObjWithStr())
-        .testStatement("'%s' % obj", "<str marker>");
+    newTest().update("obj", createObjWithStr()).testExpression("'%s' % obj", "<str marker>");
     newTest()
         .update("unknown", new Object())
-        .testStatement("'%s' % unknown", "<unknown object java.lang.Object>");
+        .testExpression("'%s' % unknown", "<unknown object java.lang.Object>");
   }
 
   @Test
   public void testPercOnObjectList() throws Exception {
     newTest()
         .update("obj", createObjWithStr())
-        .testStatement("'%s %s' % (obj, obj)", "<str marker> <str marker>");
+        .testExpression("'%s %s' % (obj, obj)", "<str marker> <str marker>");
     newTest()
         .update("unknown", new Object())
-        .testStatement(
+        .testExpression(
             "'%s %s' % (unknown, unknown)",
             "<unknown object java.lang.Object> <unknown object java.lang.Object>");
   }
@@ -680,7 +685,7 @@
 
   @Test
   public void testDictKeys() throws Exception {
-    newTest().testExactOrder("v = {'a': 1}.keys() + ['b', 'c'] ; v", "a", "b", "c");
+    newTest().testExactOrder("{'a': 1}.keys() + ['b', 'c']", "a", "b", "c");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
index 4443dde..4bd118b 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
@@ -32,7 +32,8 @@
 
   @Test
   public void testFunctionDef() throws Exception {
-    eval("def func(a,b,c):",
+    exec(
+        "def func(a,b,c):", //
         "  a = 1",
         "  b = a\n");
     StarlarkFunction stmt = (StarlarkFunction) lookup("func");
@@ -58,7 +59,8 @@
   public void testFunctionDefCallOuterFunc() throws Exception {
     List<Object> params = new ArrayList<>();
     createOuterFunction(params);
-    eval("def func(a):",
+    exec(
+        "def func(a):", //
         "  outer_func(a)",
         "func(1)",
         "func(2)");
@@ -85,7 +87,8 @@
   @Test
   public void testFunctionDefNoEffectOutsideScope() throws Exception {
     update("a", 1);
-    eval("def func():",
+    exec(
+        "def func():", //
         "  a = 2",
         "func()\n");
     assertThat(lookup("a")).isEqualTo(1);
@@ -93,7 +96,8 @@
 
   @Test
   public void testFunctionDefGlobalVaribleReadInFunction() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  b = a",
         "  return b",
@@ -103,7 +107,8 @@
 
   @Test
   public void testFunctionDefLocalGlobalScope() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  a = 2",
         "  b = a",
@@ -139,7 +144,8 @@
 
   @Test
   public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  a = 2",
         "  b = a",
@@ -152,13 +158,14 @@
   @SuppressWarnings("unchecked")
   @Test
   public void testSkylarkGlobalComprehensionIsAllowed() throws Exception {
-    eval("a = [i for i in [1, 2, 3]]\n");
+    exec("a = [i for i in [1, 2, 3]]\n");
     assertThat((Iterable<Object>) lookup("a")).containsExactly(1, 2, 3).inOrder();
   }
 
   @Test
   public void testFunctionReturn() throws Exception {
-    eval("def func():",
+    exec(
+        "def func():", //
         "  return 2",
         "b = func()\n");
     assertThat(lookup("b")).isEqualTo(2);
@@ -166,7 +173,8 @@
 
   @Test
   public void testFunctionReturnFromALoop() throws Exception {
-    eval("def func():",
+    exec(
+        "def func():", //
         "  for i in [1, 2, 3, 4, 5]:",
         "    return i",
         "b = func()\n");
@@ -175,7 +183,8 @@
 
   @Test
   public void testFunctionExecutesProperly() throws Exception {
-    eval("def func(a):",
+    exec(
+        "def func(a):",
         "  b = 1",
         "  if a:",
         "    b = 2",
@@ -190,7 +199,8 @@
   public void testFunctionCallFromFunction() throws Exception {
     final List<Object> params = new ArrayList<>();
     createOuterFunction(params);
-    eval("def func2(a):",
+    exec(
+        "def func2(a):",
         "  outer_func(a)",
         "def func1(b):",
         "  func2(b)",
@@ -201,7 +211,8 @@
 
   @Test
   public void testFunctionCallFromFunctionReadGlobalVar() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func2():",
         "  return a",
         "def func1():",
@@ -212,7 +223,8 @@
 
   @Test
   public void testFunctionParamCanShadowGlobalVarAfterGlobalVarIsRead() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1",
         "def func2(a):",
         "  return 0",
         "def func1():",
@@ -224,14 +236,16 @@
 
   @Test
   public void testSingleLineFunction() throws Exception {
-    eval("def func(): return 'a'",
+    exec(
+        "def func(): return 'a'", //
         "s = func()\n");
     assertThat(lookup("s")).isEqualTo("a");
   }
 
   @Test
   public void testFunctionReturnsDictionary() throws Exception {
-    eval("def func(): return {'a' : 1}",
+    exec(
+        "def func(): return {'a' : 1}", //
         "d = func()",
         "a = d['a']\n");
     assertThat(lookup("a")).isEqualTo(1);
@@ -239,7 +253,8 @@
 
   @Test
   public void testFunctionReturnsList() throws Exception {
-    eval("def func(): return [1, 2, 3]",
+    exec(
+        "def func(): return [1, 2, 3]", //
         "d = func()",
         "a = d[1]\n");
     assertThat(lookup("a")).isEqualTo(2);
@@ -247,7 +262,8 @@
 
   @Test
   public void testFunctionNameAliasing() throws Exception {
-    eval("def func(a):",
+    exec(
+        "def func(a):", //
         "  return a + 1",
         "alias = func",
         "r = alias(1)");
@@ -256,7 +272,8 @@
 
   @Test
   public void testCallingFunctionsWithMixedModeArgs() throws Exception {
-    eval("def func(a, b, c):",
+    exec(
+        "def func(a, b, c):", //
         "  return a + b + c",
         "v = func(1, c = 2, b = 3)");
     assertThat(lookup("v")).isEqualTo(6);
@@ -274,7 +291,8 @@
 
   @Test
   public void testWhichOptionalArgsAreDefinedForFunctions() throws Exception {
-    eval(functionWithOptionalArgs(),
+    exec(
+        functionWithOptionalArgs(),
         "v1 = func('1', 1, 1)",
         "v2 = func(b = 2, a = '2', c = 2)",
         "v3 = func('3')",
@@ -287,7 +305,8 @@
 
   @Test
   public void testDefaultArguments() throws Exception {
-    eval("def func(a, b = 'b', c = 'c'):",
+    exec(
+        "def func(a, b = 'b', c = 'c'):",
         "  return a + b + c",
         "v1 = func('a', 'x', 'y')",
         "v2 = func(b = 'x', a = 'a', c = 'y')",
@@ -363,7 +382,8 @@
 
   @Test
   public void testDefaultArguments2() throws Exception {
-    eval("a = 2",
+    exec(
+        "a = 2",
         "def foo(x=a): return x",
         "def bar():",
         "  a = 3",
@@ -374,14 +394,16 @@
 
   @Test
   public void testMixingPositionalOptional() throws Exception {
-    eval("def f(name, value = '', optional = ''): return value",
-        "v = f('name', 'value')\n");
+    exec(
+        "def f(name, value = '', optional = ''):", //
+        "  return value",
+        "v = f('name', 'value')");
     assertThat(lookup("v")).isEqualTo("value");
   }
 
   @Test
   public void testStarArg() throws Exception {
-    eval(
+    exec(
         "def f(name, value = '1', optional = '2'): return name + value + optional",
         "v1 = f(*['name', 'value'])",
         "v2 = f('0', *['name', 'value'])",
@@ -395,7 +417,8 @@
 
   @Test
   public void testStarParam() throws Exception {
-    eval("def f(name, value = '1', optional = '2', *rest):",
+    exec(
+        "def f(name, value = '1', optional = '2', *rest):",
         "  r = name + value + optional + '|'",
         "  for x in rest: r += x",
         "  return r",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index b6bc1bb..5ca992a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -159,10 +159,10 @@
   @Test
   public void testHasAttr() throws Exception {
     new SkylarkTest()
-        .testStatement("hasattr(depset(), 'union')", Boolean.TRUE)
-        .testStatement("hasattr('test', 'count')", Boolean.TRUE)
-        .testStatement("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
-        .testStatement("hasattr({}, 'items')", Boolean.TRUE);
+        .testExpression("hasattr(depset(), 'union')", Boolean.TRUE)
+        .testExpression("hasattr('test', 'count')", Boolean.TRUE)
+        .testExpression("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
+        .testExpression("hasattr({}, 'items')", Boolean.TRUE);
   }
 
   @Test
@@ -171,8 +171,8 @@
         .testIfExactError(
             "object of type 'string' has no attribute 'not_there'",
             "getattr('a string', 'not_there')")
-        .testStatement("getattr('a string', 'not_there', 'use this')", "use this")
-        .testStatement("getattr('a string', 'not there', None)", Runtime.NONE);
+        .testExpression("getattr('a string', 'not_there', 'use this')", "use this")
+        .testExpression("getattr('a string', 'not there', None)", Runtime.NONE);
   }
 
   @SkylarkModule(name = "AStruct", documented = false, doc = "")
@@ -212,13 +212,13 @@
     String msg = "object of type 'string' has no attribute 'cnt'";
     new SkylarkTest()
         .testIfExactError(msg, "getattr('a string', 'cnt')")
-        .testStatement("getattr('a string', 'cnt', 'default')", "default");
+        .testExpression("getattr('a string', 'cnt', 'default')", "default");
   }
 
   @Test
   public void testDir() throws Exception {
     new SkylarkTest()
-        .testStatement(
+        .testExpression(
             "str(dir({}))",
             "[\"clear\", \"get\", \"items\", \"keys\","
                 + " \"pop\", \"popitem\", \"setdefault\", \"update\", \"values\"]");
@@ -226,7 +226,7 @@
 
   @Test
   public void testBoolean() throws Exception {
-    new BothModesTest().testStatement("False", Boolean.FALSE).testStatement("True", Boolean.TRUE);
+    new BothModesTest().testExpression("False", Boolean.FALSE).testExpression("True", Boolean.TRUE);
   }
 
   @Test
@@ -276,13 +276,13 @@
   public void testDictionaryAccess() throws Exception {
     new BothModesTest()
         .testEval("{1: ['foo']}[1]", "['foo']")
-        .testStatement("{'4': 8}['4']", 8)
-        .testStatement("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
+        .testExpression("{'4': 8}['4']", 8)
+        .testExpression("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
   }
 
   @Test
   public void testDictionaryVariableAccess() throws Exception {
-    new BothModesTest().setUp("d = {'a' : 1}", "a = d['a']\n").testLookup("a", 1);
+    new BothModesTest().setUp("d = {'a' : 1}", "a = d['a']").testLookup("a", 1);
   }
 
   @Test
@@ -364,11 +364,11 @@
   @Test
   public void testDictionaryGet() throws Exception {
     new BuildTest()
-        .testStatement("{1: 'foo'}.get(1)", "foo")
-        .testStatement("{1: 'foo'}.get(2)", Runtime.NONE)
-        .testStatement("{1: 'foo'}.get(2, 'a')", "a")
-        .testStatement("{1: 'foo'}.get(2, default='a')", "a")
-        .testStatement("{1: 'foo'}.get(2, default=None)", Runtime.NONE);
+        .testExpression("{1: 'foo'}.get(1)", "foo")
+        .testExpression("{1: 'foo'}.get(2)", Runtime.NONE)
+        .testExpression("{1: 'foo'}.get(2, 'a')", "a")
+        .testExpression("{1: 'foo'}.get(2, default='a')", "a")
+        .testExpression("{1: 'foo'}.get(2, default=None)", Runtime.NONE);
   }
 
   @Test
@@ -383,12 +383,11 @@
   @Test
   public void testDictionaryClear() throws Exception {
     new SkylarkTest()
-        .testEval(
-            "d = {1: 'foo', 2: 'bar', 3: 'baz'}\n"
-                + "len(d) == 3 or fail('clear 1')\n"
-                + "d.clear() == None or fail('clear 2')\n"
-                + "d",
-            "{}");
+        .setUp(
+            "d = {1: 'foo', 2: 'bar', 3: 'baz'}",
+            "len(d) == 3 or fail('clear 1')",
+            "d.clear() == None or fail('clear 2')")
+        .testEval("d", "{}");
   }
 
   @Test
@@ -423,36 +422,35 @@
   @Test
   public void testDictionaryUpdate() throws Exception {
     new BothModesTest()
-        .setUp("foo = {'a': 2}")
-        .testEval("foo.update({'b': 4}); foo", "{'a': 2, 'b': 4}");
+        .setUp("foo = {'a': 2}", "foo.update({'b': 4})")
+        .testEval("foo", "{'a': 2, 'b': 4}");
     new BothModesTest()
-        .setUp("foo = {'a': 2}")
-        .testEval("foo.update({'a': 3, 'b': 4}); foo", "{'a': 3, 'b': 4}");
+        .setUp("foo = {'a': 2}", "foo.update({'a': 3, 'b': 4})")
+        .testEval("foo", "{'a': 3, 'b': 4}");
   }
 
   @Test
   public void testDictionarySetDefault() throws Exception {
     new SkylarkTest()
-        .testEval(
-            "d = {2: 'bar', 1: 'foo'}\n"
-                + "len(d) == 2 or fail('setdefault 0')\n"
-                + "d.setdefault(1, 'a') == 'foo' or fail('setdefault 1')\n"
-                + "d.setdefault(2) == 'bar' or fail('setdefault 2')\n"
-                + "d.setdefault(3) == None or fail('setdefault 3')\n"
-                + "d.setdefault(4, 'b') == 'b' or fail('setdefault 4')\n"
-                + "d",
-            "{1: 'foo', 2: 'bar', 3: None, 4: 'b'}");
+        .setUp(
+            "d = {2: 'bar', 1: 'foo'}",
+            "len(d) == 2 or fail('setdefault 0')",
+            "d.setdefault(1, 'a') == 'foo' or fail('setdefault 1')",
+            "d.setdefault(2) == 'bar' or fail('setdefault 2')",
+            "d.setdefault(3) == None or fail('setdefault 3')",
+            "d.setdefault(4, 'b') == 'b' or fail('setdefault 4')")
+        .testEval("d", "{1: 'foo', 2: 'bar', 3: None, 4: 'b'}");
   }
 
   @Test
   public void testListIndexMethod() throws Exception {
     new BothModesTest()
-        .testStatement("['a', 'b', 'c'].index('a')", 0)
-        .testStatement("['a', 'b', 'c'].index('b')", 1)
-        .testStatement("['a', 'b', 'c'].index('c')", 2)
-        .testStatement("[2, 4, 6].index(4)", 1)
-        .testStatement("[2, 4, 6].index(4)", 1)
-        .testStatement("[0, 1, [1]].index([1])", 2)
+        .testExpression("['a', 'b', 'c'].index('a')", 0)
+        .testExpression("['a', 'b', 'c'].index('b')", 1)
+        .testExpression("['a', 'b', 'c'].index('c')", 2)
+        .testExpression("[2, 4, 6].index(4)", 1)
+        .testExpression("[2, 4, 6].index(4)", 1)
+        .testExpression("[0, 1, [1]].index([1])", 2)
         .testIfErrorContains("item \"a\" not found in list", "[1, 2].index('a')")
         .testIfErrorContains("item 0 not found in list", "[].index(0)");
   }
@@ -461,8 +459,8 @@
   public void testHash() throws Exception {
     // We specify the same string hashing algorithm as String.hashCode().
     new SkylarkTest()
-        .testStatement("hash('skylark')", "skylark".hashCode())
-        .testStatement("hash('google')", "google".hashCode())
+        .testExpression("hash('skylark')", "skylark".hashCode())
+        .testExpression("hash('google')", "google".hashCode())
         .testIfErrorContains(
             "expected value of type 'string' for parameter 'value', "
                 + "for call to function hash(value)",
@@ -473,61 +471,61 @@
   public void testRangeType() throws Exception {
     new BothModesTest()
         .setUp("a = range(3)")
-        .testStatement("len(a)", 3)
-        .testStatement("str(a)", "range(0, 3)")
-        .testStatement("str(range(1,2,3))", "range(1, 2, 3)")
-        .testStatement("repr(a)", "range(0, 3)")
-        .testStatement("repr(range(1,2,3))", "range(1, 2, 3)")
-        .testStatement("type(a)", "range")
+        .testExpression("len(a)", 3)
+        .testExpression("str(a)", "range(0, 3)")
+        .testExpression("str(range(1,2,3))", "range(1, 2, 3)")
+        .testExpression("repr(a)", "range(0, 3)")
+        .testExpression("repr(range(1,2,3))", "range(1, 2, 3)")
+        .testExpression("type(a)", "range")
         .testIfErrorContains("unsupported operand type(s) for +: 'range' and 'range'", "a + a")
         .testIfErrorContains("type 'range' has no method append()", "a.append(3)")
-        .testStatement("str(list(range(5)))", "[0, 1, 2, 3, 4]")
-        .testStatement("str(list(range(0)))", "[]")
-        .testStatement("str(list(range(1)))", "[0]")
-        .testStatement("str(list(range(-2)))", "[]")
-        .testStatement("str(list(range(-3, 2)))", "[-3, -2, -1, 0, 1]")
-        .testStatement("str(list(range(3, 2)))", "[]")
-        .testStatement("str(list(range(3, 3)))", "[]")
-        .testStatement("str(list(range(3, 4)))", "[3]")
-        .testStatement("str(list(range(3, 5)))", "[3, 4]")
-        .testStatement("str(list(range(-3, 5, 2)))", "[-3, -1, 1, 3]")
-        .testStatement("str(list(range(-3, 6, 2)))", "[-3, -1, 1, 3, 5]")
-        .testStatement("str(list(range(5, 0, -1)))", "[5, 4, 3, 2, 1]")
-        .testStatement("str(list(range(5, 0, -10)))", "[5]")
-        .testStatement("str(list(range(0, -3, -2)))", "[0, -2]")
-        .testStatement("range(3)[-1]", 2)
+        .testExpression("str(list(range(5)))", "[0, 1, 2, 3, 4]")
+        .testExpression("str(list(range(0)))", "[]")
+        .testExpression("str(list(range(1)))", "[0]")
+        .testExpression("str(list(range(-2)))", "[]")
+        .testExpression("str(list(range(-3, 2)))", "[-3, -2, -1, 0, 1]")
+        .testExpression("str(list(range(3, 2)))", "[]")
+        .testExpression("str(list(range(3, 3)))", "[]")
+        .testExpression("str(list(range(3, 4)))", "[3]")
+        .testExpression("str(list(range(3, 5)))", "[3, 4]")
+        .testExpression("str(list(range(-3, 5, 2)))", "[-3, -1, 1, 3]")
+        .testExpression("str(list(range(-3, 6, 2)))", "[-3, -1, 1, 3, 5]")
+        .testExpression("str(list(range(5, 0, -1)))", "[5, 4, 3, 2, 1]")
+        .testExpression("str(list(range(5, 0, -10)))", "[5]")
+        .testExpression("str(list(range(0, -3, -2)))", "[0, -2]")
+        .testExpression("range(3)[-1]", 2)
         .testIfErrorContains(
             "index out of range (index is 3, but sequence has 3 elements)", "range(3)[3]")
-        .testStatement("str(range(5)[1:])", "range(1, 5)")
-        .testStatement("len(range(5)[1:])", 4)
-        .testStatement("str(range(5)[:2])", "range(0, 2)")
-        .testStatement("str(range(10)[1:9:2])", "range(1, 9, 2)")
-        .testStatement("str(list(range(10)[1:9:2]))", "[1, 3, 5, 7]")
-        .testStatement("str(range(10)[1:10:2])", "range(1, 10, 2)")
-        .testStatement("str(range(10)[1:11:2])", "range(1, 10, 2)")
-        .testStatement("str(range(0, 10, 2)[::2])", "range(0, 10, 4)")
-        .testStatement("str(range(0, 10, 2)[::-2])", "range(8, -2, -4)")
-        .testStatement("str(range(5)[1::-1])", "range(1, -1, -1)")
+        .testExpression("str(range(5)[1:])", "range(1, 5)")
+        .testExpression("len(range(5)[1:])", 4)
+        .testExpression("str(range(5)[:2])", "range(0, 2)")
+        .testExpression("str(range(10)[1:9:2])", "range(1, 9, 2)")
+        .testExpression("str(list(range(10)[1:9:2]))", "[1, 3, 5, 7]")
+        .testExpression("str(range(10)[1:10:2])", "range(1, 10, 2)")
+        .testExpression("str(range(10)[1:11:2])", "range(1, 10, 2)")
+        .testExpression("str(range(0, 10, 2)[::2])", "range(0, 10, 4)")
+        .testExpression("str(range(0, 10, 2)[::-2])", "range(8, -2, -4)")
+        .testExpression("str(range(5)[1::-1])", "range(1, -1, -1)")
         .testIfErrorContains("step cannot be 0", "range(2, 3, 0)")
         .testIfErrorContains("unsupported operand type(s) for *: 'range' and 'int'", "range(3) * 3")
         .testIfErrorContains("Cannot compare range objects", "range(3) < range(5)")
         .testIfErrorContains("Cannot compare range objects", "range(4) > [1]")
-        .testStatement("4 in range(1, 10)", true)
-        .testStatement("4 in range(1, 3)", false)
-        .testStatement("4 in range(0, 8, 2)", true)
-        .testStatement("4 in range(1, 8, 2)", false)
-        .testStatement("range(0, 5, 10) == range(0, 5, 11)", true)
-        .testStatement("range(0, 5, 2) == [0, 2, 4]", false);
+        .testExpression("4 in range(1, 10)", true)
+        .testExpression("4 in range(1, 3)", false)
+        .testExpression("4 in range(0, 8, 2)", true)
+        .testExpression("4 in range(1, 8, 2)", false)
+        .testExpression("range(0, 5, 10) == range(0, 5, 11)", true)
+        .testExpression("range(0, 5, 2) == [0, 2, 4]", false);
   }
 
   @Test
   public void testEnumerate() throws Exception {
     new BothModesTest()
-        .testStatement("str(enumerate([]))", "[]")
-        .testStatement("str(enumerate([5]))", "[(0, 5)]")
-        .testStatement("str(enumerate([5, 3]))", "[(0, 5), (1, 3)]")
-        .testStatement("str(enumerate(['a', 'b', 'c']))", "[(0, \"a\"), (1, \"b\"), (2, \"c\")]")
-        .testStatement("str(enumerate(['a']) + [(1, 'b')])", "[(0, \"a\"), (1, \"b\")]");
+        .testExpression("str(enumerate([]))", "[]")
+        .testExpression("str(enumerate([5]))", "[(0, 5)]")
+        .testExpression("str(enumerate([5, 3]))", "[(0, 5), (1, 3)]")
+        .testExpression("str(enumerate(['a', 'b', 'c']))", "[(0, \"a\"), (1, \"b\"), (2, \"c\")]")
+        .testExpression("str(enumerate(['a']) + [(1, 'b')])", "[(0, \"a\"), (1, \"b\")]");
   }
 
   @Test
@@ -546,17 +544,17 @@
 
   @Test
   public void testLenOnString() throws Exception {
-    new BothModesTest().testStatement("len('abc')", 3);
+    new BothModesTest().testExpression("len('abc')", 3);
   }
 
   @Test
   public void testLenOnList() throws Exception {
-    new BothModesTest().testStatement("len([1,2,3])", 3);
+    new BothModesTest().testExpression("len([1,2,3])", 3);
   }
 
   @Test
   public void testLenOnDict() throws Exception {
-    new BothModesTest().testStatement("len({'a' : 1, 'b' : 2})", 2);
+    new BothModesTest().testExpression("len({'a' : 1, 'b' : 2})", 2);
   }
 
   @Test
@@ -574,40 +572,40 @@
   @Test
   public void testBool() throws Exception {
     new BothModesTest()
-        .testStatement("bool(1)", Boolean.TRUE)
-        .testStatement("bool(0)", Boolean.FALSE)
-        .testStatement("bool([1, 2])", Boolean.TRUE)
-        .testStatement("bool([])", Boolean.FALSE)
-        .testStatement("bool(None)", Boolean.FALSE);
+        .testExpression("bool(1)", Boolean.TRUE)
+        .testExpression("bool(0)", Boolean.FALSE)
+        .testExpression("bool([1, 2])", Boolean.TRUE)
+        .testExpression("bool([])", Boolean.FALSE)
+        .testExpression("bool(None)", Boolean.FALSE);
   }
 
   @Test
   public void testStr() throws Exception {
     new BothModesTest()
-        .testStatement("str(1)", "1")
-        .testStatement("str(-2)", "-2")
-        .testStatement("str([1, 2])", "[1, 2]")
-        .testStatement("str(True)", "True")
-        .testStatement("str(False)", "False")
-        .testStatement("str(None)", "None")
-        .testStatement("str(str)", "<built-in function str>");
+        .testExpression("str(1)", "1")
+        .testExpression("str(-2)", "-2")
+        .testExpression("str([1, 2])", "[1, 2]")
+        .testExpression("str(True)", "True")
+        .testExpression("str(False)", "False")
+        .testExpression("str(None)", "None")
+        .testExpression("str(str)", "<built-in function str>");
   }
 
   @Test
   public void testStrFunction() throws Exception {
-    new SkylarkTest().testStatement("def foo(x): return x\nstr(foo)", "<function foo>");
+    new SkylarkTest().setUp("def foo(x): pass").testExpression("str(foo)", "<function foo>");
   }
 
   @Test
   public void testType() throws Exception {
     new SkylarkTest()
-        .testStatement("type(1)", "int")
-        .testStatement("type('a')", "string")
-        .testStatement("type([1, 2])", "list")
-        .testStatement("type((1, 2))", "tuple")
-        .testStatement("type(True)", "bool")
-        .testStatement("type(None)", "NoneType")
-        .testStatement("type(str)", "function");
+        .testExpression("type(1)", "int")
+        .testExpression("type('a')", "string")
+        .testExpression("type([1, 2])", "list")
+        .testExpression("type((1, 2))", "tuple")
+        .testExpression("type(True)", "bool")
+        .testExpression("type(None)", "NoneType")
+        .testExpression("type(str)", "function");
   }
 
   // TODO(bazel-team): Move this into a new BazelLibraryTest.java file, or at least out of
@@ -615,7 +613,7 @@
   @Test
   public void testSelectFunction() throws Exception {
     enableSkylarkMode();
-    eval("a = select({'a': 1})");
+    exec("a = select({'a': 1})");
     SelectorList result = (SelectorList) lookup("a");
     assertThat(((SelectorValue) Iterables.getOnlyElement(result.getElements())).getDictionary())
         .containsExactly("a", 1);
@@ -624,13 +622,13 @@
   @Test
   public void testZipFunction() throws Exception {
     new BothModesTest()
-        .testStatement("str(zip())", "[]")
-        .testStatement("str(zip([1, 2]))", "[(1,), (2,)]")
-        .testStatement("str(zip([1, 2], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
-        .testStatement("str(zip([1, 2, 3], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
-        .testStatement("str(zip([1], [2], [3]))", "[(1, 2, 3)]")
-        .testStatement("str(zip([1], {2: 'a'}))", "[(1, 2)]")
-        .testStatement("str(zip([1], []))", "[]")
+        .testExpression("str(zip())", "[]")
+        .testExpression("str(zip([1, 2]))", "[(1,), (2,)]")
+        .testExpression("str(zip([1, 2], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
+        .testExpression("str(zip([1, 2, 3], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
+        .testExpression("str(zip([1], [2], [3]))", "[(1, 2, 3)]")
+        .testExpression("str(zip([1], {2: 'a'}))", "[(1, 2)]")
+        .testExpression("str(zip([1], []))", "[]")
         .testIfErrorContains("type 'int' is not iterable", "zip(123)")
         .testIfErrorContains("type 'int' is not iterable", "zip([1], 1)");
   }
@@ -645,16 +643,16 @@
     if (chars == null) {
       new BothModesTest()
           .update("s", input)
-          .testStatement("s.lstrip()", expLeft)
-          .testStatement("s.rstrip()", expRight)
-          .testStatement("s.strip()", expBoth);
+          .testExpression("s.lstrip()", expLeft)
+          .testExpression("s.rstrip()", expRight)
+          .testExpression("s.strip()", expBoth);
     } else {
       new BothModesTest()
           .update("s", input)
           .update("chars", chars)
-          .testStatement("s.lstrip(chars)", expLeft)
-          .testStatement("s.rstrip(chars)", expRight)
-          .testStatement("s.strip(chars)", expBoth);
+          .testExpression("s.lstrip(chars)", expLeft)
+          .testExpression("s.rstrip(chars)", expRight)
+          .testExpression("s.strip(chars)", expBoth);
     }
   }
 
@@ -694,9 +692,9 @@
   @Test
   public void testTupleCoercion() throws Exception {
     new BothModesTest()
-        .testStatement("tuple([1, 2]) == (1, 2)", true)
+        .testExpression("tuple([1, 2]) == (1, 2)", true)
         // Depends on current implementation of dict
-        .testStatement("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
+        .testExpression("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
   }
 
   // Verifies some legacy functionality that should be deprecated and removed via
@@ -706,8 +704,8 @@
   public void testLegacyNamed() throws Exception {
     new SkylarkTest("--incompatible_restrict_named_params=false")
         // Parameters which may be specified by keyword but are not explicitly 'named'.
-        .testStatement("all(elements=[True, True])", Boolean.TRUE)
-        .testStatement("any(elements=[True, False])", Boolean.TRUE)
+        .testExpression("all(elements=[True, True])", Boolean.TRUE)
+        .testExpression("any(elements=[True, False])", Boolean.TRUE)
         .testEval("sorted(self=[3, 0, 2], key=None, reverse=False)", "[0, 2, 3]")
         .testEval("reversed(sequence=[3, 2, 0])", "[0, 2, 3]")
         .testEval("tuple(x=[1, 2])", "(1, 2)")
@@ -715,16 +713,16 @@
         .testEval("len(x=(1, 2))", "2")
         .testEval("str(x=(1, 2))", "'(1, 2)'")
         .testEval("repr(x=(1, 2))", "'(1, 2)'")
-        .testStatement("bool(x=3)", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
         .testEval("int(x=3)", "3")
         .testEval("dict(args=[(1, 2)])", "{1 : 2}")
-        .testStatement("bool(x=3)", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
         .testEval("enumerate(list=[40, 41])", "[(0, 40), (1, 41)]")
-        .testStatement("hash(value='hello')", "hello".hashCode())
+        .testExpression("hash(value='hello')", "hello".hashCode())
         .testEval("range(start_or_stop=3, stop_or_none=9, step=2)", "range(3, 9, 2)")
-        .testStatement("hasattr(x=depset(), name='union')", Boolean.TRUE)
-        .testStatement("bool(x=3)", Boolean.TRUE)
-        .testStatement("getattr(x='hello', name='cnt', default='default')", "default")
+        .testExpression("hasattr(x=depset(), name='union')", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
+        .testExpression("getattr(x='hello', name='cnt', default='default')", "default")
         .testEval(
             "dir(x={})",
             "[\"clear\", \"get\", \"items\", \"keys\","
@@ -733,7 +731,7 @@
         .testEval("str(depset(items=[0,1]))", "'depset([0, 1])'")
         .testIfErrorContains("hello", "fail(msg='hello', attr='someattr')")
         // Parameters which may be None but are not explicitly 'noneable'
-        .testStatement("hasattr(x=None, name='union')", Boolean.FALSE)
+        .testExpression("hasattr(x=None, name='union')", Boolean.FALSE)
         .testEval("getattr(x=None, name='count', default=None)", "None")
         .testEval("dir(None)", "[]")
         .testIfErrorContains("None", "fail(msg=None)")
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 7b9152a..c34f2d0 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -879,7 +879,8 @@
 
   @SuppressWarnings("unchecked")
   private void simpleFlowTest(String statement, int expected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "  s = 0",
         "  hit = 0",
         "  for i in range(0, 10):",
@@ -904,7 +905,8 @@
   }
 
   private void flowFromDeeperBlock(String statement, int expected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "   s = 0",
         "   for i in range(0, 10):",
         "       if i % 2 != 0:",
@@ -916,7 +918,8 @@
   }
 
   private void flowFromNestedBlocks(String statement, int expected) throws Exception {
-    eval("def foo2():",
+    exec(
+        "def foo2():",
         "   s = 0",
         "   for i in range(1, 41):",
         "       if i % 2 == 0:",
@@ -942,7 +945,8 @@
   @SuppressWarnings("unchecked")
   private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
       int secondExpected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "   outer = 0",
         "   first = 0",
         "   second = 0",
@@ -978,7 +982,7 @@
 
   // TODO(adonovan): move this and all tests that use it to Validation tests.
   private void assertValidationError(String expectedError, final String... lines) throws Exception {
-    SyntaxError error = assertThrows(SyntaxError.class, () -> eval(lines));
+    SyntaxError error = assertThrows(SyntaxError.class, () -> exec(lines));
     assertThat(error).hasMessageThat().contains(expectedError);
   }
 
@@ -1016,7 +1020,8 @@
 
   @Test
   public void testReassignment() throws Exception {
-    eval("def foo(x=None):",
+    exec(
+        "def foo(x=None):", //
         "  x = 1",
         "  x = [1, 2]",
         "  x = 'str'",
@@ -1447,7 +1452,8 @@
 
   @Test
   public void testStructAccessOfMethod() throws Exception {
-    new SkylarkTest().update("mock", new Mock()).testStatement("v = mock.function", null);
+    new SkylarkTest().update("mock", new Mock()).testExpression("type(mock.function)", "function");
+    new SkylarkTest().update("mock", new Mock()).testExpression("mock.function()", "a");
   }
 
   @Test
@@ -1495,16 +1501,16 @@
   @Test
   public void testInSetDeprecated() throws Exception {
     new SkylarkTest("--incompatible_depset_is_not_iterable=false")
-        .testStatement("'b' in depset(['a', 'b'])", Boolean.TRUE)
-        .testStatement("'c' in depset(['a', 'b'])", Boolean.FALSE)
-        .testStatement("1 in depset(['a', 'b'])", Boolean.FALSE);
+        .testExpression("'b' in depset(['a', 'b'])", Boolean.TRUE)
+        .testExpression("'c' in depset(['a', 'b'])", Boolean.FALSE)
+        .testExpression("1 in depset(['a', 'b'])", Boolean.FALSE);
   }
 
   @Test
   public void testUnionSet() throws Exception {
     new SkylarkTest("--incompatible_depset_union=false")
-        .testStatement("str(depset([1, 3]) | depset([1, 2]))", "depset([1, 2, 3])")
-        .testStatement("str(depset([1, 2]) | [1, 3])", "depset([1, 2, 3])")
+        .testExpression("str(depset([1, 3]) | depset([1, 2]))", "depset([1, 2, 3])")
+        .testExpression("str(depset([1, 2]) | [1, 3])", "depset([1, 2, 3])")
         .testIfExactError("unsupported operand type(s) for |: 'int' and 'bool'", "2 | False");
   }
 
@@ -1523,13 +1529,13 @@
   @Test
   public void testSetIsIterable() throws Exception {
     new SkylarkTest("--incompatible_depset_is_not_iterable=false")
-        .testStatement("str(list(depset(['a', 'b'])))", "[\"a\", \"b\"]")
-        .testStatement("max(depset([1, 2, 3]))", 3)
-        .testStatement("1 in depset([1, 2, 3])", true)
-        .testStatement("str(sorted(depset(['b', 'a'])))", "[\"a\", \"b\"]")
-        .testStatement("str(tuple(depset(['a', 'b'])))", "(\"a\", \"b\")")
-        .testStatement("str([x for x in depset()])", "[]")
-        .testStatement("len(depset(['a']))", 1);
+        .testExpression("str(list(depset(['a', 'b'])))", "[\"a\", \"b\"]")
+        .testExpression("max(depset([1, 2, 3]))", 3)
+        .testExpression("1 in depset([1, 2, 3])", true)
+        .testExpression("str(sorted(depset(['b', 'a'])))", "[\"a\", \"b\"]")
+        .testExpression("str(tuple(depset(['a', 'b'])))", "(\"a\", \"b\")")
+        .testExpression("str([x for x in depset()])", "[]")
+        .testExpression("len(depset(['a']))", 1);
   }
 
   @Test
@@ -2004,11 +2010,11 @@
   public void testPrint() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
     setFailFast(false);
-    eval("print('hello')");
+    exec("print('hello')");
     assertContainsDebug("hello");
-    eval("print('a', 'b')");
+    exec("print('a', 'b')");
     assertContainsDebug("a b");
-    eval("print('a', 'b', sep='x')");
+    exec("print('a', 'b', sep='x')");
     assertContainsDebug("axb");
   }
 
@@ -2081,9 +2087,11 @@
   @Override
   @Test
   public void testNotCallInt() throws Exception {
-    new SkylarkTest().setUp("sum = 123456").testLookup("sum", 123456)
+    new SkylarkTest()
+        .setUp("sum = 123456")
+        .testLookup("sum", 123456)
         .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
-        .testStatement("sum", 123456);
+        .testExpression("sum", 123456);
   }
 
   @Test
@@ -2093,8 +2101,9 @@
 
   @Test
   public void testConditionalExpressionInFunction() throws Exception {
-    new SkylarkTest().setUp("def foo(a, b, c): return a+b if c else a-b\n").testStatement(
-        "foo(23, 5, 0)", 18);
+    new SkylarkTest()
+        .setUp("def foo(a, b, c): return a+b if c else a-b\n")
+        .testExpression("foo(23, 5, 0)", 18);
   }
 
   @SkylarkModule(name = "SkylarkClassObjectWithSkylarkCallables", doc = "")
@@ -2211,7 +2220,12 @@
 
   @Test
   public void testListComprehensionsShadowGlobalVariable() throws Exception {
-    eval("a = 18", "def foo():", "  b = [a for a in range(3)]", "  return a", "x = foo()");
+    exec(
+        "a = 18", //
+        "def foo():",
+        "  b = [a for a in range(3)]",
+        "  return a",
+        "x = foo()");
     assertThat(lookup("x")).isEqualTo(18);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
index f02b15c..a566f15 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
@@ -34,12 +34,12 @@
 
   @Test
   public void testIndex() throws Exception {
-    eval("l = [1, '2', 3]");
+    exec("l = [1, '2', 3]");
     assertThat(eval("l[0]")).isEqualTo(1);
     assertThat(eval("l[1]")).isEqualTo("2");
     assertThat(eval("l[2]")).isEqualTo(3);
 
-    eval("t = (1, '2', 3)");
+    exec("t = (1, '2', 3)");
     assertThat(eval("t[0]")).isEqualTo(1);
     assertThat(eval("t[1]")).isEqualTo("2");
     assertThat(eval("t[2]")).isEqualTo(3);
@@ -56,7 +56,7 @@
 
   @Test
   public void testNegativeIndices() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(eval("l[0]")).isEqualTo("a");
     assertThat(eval("l[-1]")).isEqualTo("c");
     assertThat(eval("l[-2]")).isEqualTo("b");
@@ -72,7 +72,7 @@
 
   @Test
   public void testSlice() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[0:3]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[0:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[0:1]")).containsExactly("a").inOrder();
@@ -83,14 +83,14 @@
     assertThat(listEval("l[2:1]")).isEmpty();
     assertThat(listEval("l[3:0]")).isEmpty();
 
-    eval("t = ('a', 'b', 'c')");
+    exec("t = ('a', 'b', 'c')");
     assertThat(listEval("t[0:3]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("t[1:2]")).containsExactly("b").inOrder();
   }
 
   @Test
   public void testSliceDefault() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[:]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[2:]")).containsExactly("c").inOrder();
@@ -98,7 +98,7 @@
 
   @Test
   public void testSliceNegative() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[-2:-1]")).containsExactly("b").inOrder();
     assertThat(listEval("l[-2:]")).containsExactly("b", "c").inOrder();
     assertThat(listEval("l[0:-1]")).containsExactly("a", "b").inOrder();
@@ -107,7 +107,7 @@
 
   @Test
   public void testSliceBounds() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[0:5]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[-10:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[3:10]")).isEmpty();
@@ -116,7 +116,7 @@
 
   @Test
   public void testSliceSkip() throws Exception {
-    eval("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
+    exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
     assertThat(listEval("l[0:6:2]")).containsExactly("a", "c", "e").inOrder();
     assertThat(listEval("l[0:7:2]")).containsExactly("a", "c", "e", "g").inOrder();
     assertThat(listEval("l[0:10:2]")).containsExactly("a", "c", "e", "g").inOrder();
@@ -129,7 +129,7 @@
 
   @Test
   public void testSliceNegativeSkip() throws Exception {
-    eval("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
+    exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
     assertThat(listEval("l[5:2:-1]")).containsExactly("f", "e", "d").inOrder();
     assertThat(listEval("l[5:2:-2]")).containsExactly("f", "d").inOrder();
     assertThat(listEval("l[5:3:-2]")).containsExactly("f").inOrder();
@@ -164,7 +164,8 @@
 
   @Test
   public void testConcatListIndex() throws Exception {
-    eval("l = [1, 2] + [3, 4]",
+    exec(
+        "l = [1, 2] + [3, 4]", //
         "e0 = l[0]",
         "e1 = l[1]",
         "e2 = l[2]",
@@ -177,12 +178,13 @@
 
   @Test
   public void testConcatListHierarchicalIndex() throws Exception {
-    eval("l = [1] + (([2] + [3, 4]) + [5])",
-         "e0 = l[0]",
-         "e1 = l[1]",
-         "e2 = l[2]",
-         "e3 = l[3]",
-         "e4 = l[4]");
+    exec(
+        "l = [1] + (([2] + [3, 4]) + [5])", //
+        "e0 = l[0]",
+        "e1 = l[1]",
+        "e2 = l[2]",
+        "e3 = l[3]",
+        "e4 = l[4]");
     assertThat(lookup("e0")).isEqualTo(1);
     assertThat(lookup("e1")).isEqualTo(2);
     assertThat(lookup("e2")).isEqualTo(3);
@@ -197,34 +199,32 @@
 
   @Test
   public void testAppend() throws Exception {
-    eval("l = [1, 2]");
+    exec("l = [1, 2]");
     assertThat(Runtime.NONE).isEqualTo(eval("l.append([3, 4])"));
     assertThat(eval("[1, 2, [3, 4]]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testExtend() throws Exception {
-    eval("l = [1, 2]");
+    exec("l = [1, 2]");
     assertThat(Runtime.NONE).isEqualTo(eval("l.extend([3, 4])"));
     assertThat(eval("[1, 2, 3, 4]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testConcatListToString() throws Exception {
-    eval("l = [1, 2] + [3, 4]",
-         "s = str(l)");
-    assertThat(lookup("s")).isEqualTo("[1, 2, 3, 4]");
+    assertThat(eval("str([1, 2] + [3, 4])")).isEqualTo("[1, 2, 3, 4]");
   }
 
   @Test
   public void testConcatListNotEmpty() throws Exception {
-    eval("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
+    exec("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
     assertThat(lookup("v")).isEqualTo(1);
   }
 
   @Test
   public void testConcatListEmpty() throws Exception {
-    eval("l = [] + []", "v = 1 if l else 0");
+    exec("l = [] + []", "v = 1 if l else 0");
     assertThat(lookup("v")).isEqualTo(0);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
index 6318768..e737188 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
@@ -38,13 +38,13 @@
 
   @Test
   public void testConstructor() throws Exception {
-    eval("s = depset(order='default')");
+    exec("s = depset(order='default')");
     assertThat(lookup("s")).isInstanceOf(SkylarkNestedSet.class);
   }
 
   @Test
   public void testTuplePairs() throws Exception {
-    eval(
+    exec(
         // Depsets with tuple-pairs
         "s_one = depset([('1', '2'), ('3', '4')])",
         "s_two = depset(direct = [('1', '2'), ('3', '4'), ('5', '6')])",
@@ -78,7 +78,7 @@
 
   @Test
   public void testGetSet() throws Exception {
-    eval("s = depset(['a', 'b'])");
+    exec("s = depset(['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -86,7 +86,7 @@
 
   @Test
   public void testGetSetDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'])");
+    exec("s = depset(direct = ['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -94,7 +94,7 @@
 
   @Test
   public void testGetSetItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'])");
+    exec("s = depset(items = ['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -103,7 +103,7 @@
 
   @Test
   public void testToCollection() throws Exception {
-    eval("s = depset(['a', 'b'])");
+    exec("s = depset(['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -112,7 +112,7 @@
 
   @Test
   public void testToCollectionDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'])");
+    exec("s = depset(direct = ['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -121,7 +121,7 @@
 
   @Test
   public void testToCollectionItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'])");
+    exec("s = depset(items = ['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -130,19 +130,19 @@
 
   @Test
   public void testOrder() throws Exception {
-    eval("s = depset(['a', 'b'], order='postorder')");
+    exec("s = depset(['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
   @Test
   public void testOrderDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'], order='postorder')");
+    exec("s = depset(direct = ['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
   @Test
   public void testOrderItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'], order='postorder')");
+    exec("s = depset(items = ['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
@@ -169,31 +169,31 @@
 
   @Test
   public void testEmptyGenericType() throws Exception {
-    eval("s = depset()");
+    exec("s = depset()");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.TOP);
   }
 
   @Test
   public void testHomogeneousGenericType() throws Exception {
-    eval("s = depset(['a', 'b', 'c'])");
+    exec("s = depset(['a', 'b', 'c'])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeDirect() throws Exception {
-    eval("s = depset(['a', 'b', 'c'], transitive = [])");
+    exec("s = depset(['a', 'b', 'c'], transitive = [])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeItems() throws Exception {
-    eval("s = depset(items = ['a', 'b', 'c'], transitive = [])");
+    exec("s = depset(items = ['a', 'b', 'c'], transitive = [])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeTransitive() throws Exception {
-    eval("s = depset(['a', 'b', 'c'], transitive = [depset(['x'])])");
+    exec("s = depset(['a', 'b', 'c'], transitive = [depset(['x'])])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
@@ -333,7 +333,7 @@
   @Test
   public void testUnionOrder() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset()",
         "  s2 = depset()",
@@ -372,7 +372,7 @@
   @Test
   public void testUnionNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset(['a'])",
         "  s2 = s1.union(['b'])",
@@ -384,8 +384,8 @@
   @Test
   public void testFunctionReturnsDepset() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "def func():",
+    exec(
+        "def func():", //
         "  t = depset()",
         "  t += ['a']",
         "  return t",
@@ -397,8 +397,8 @@
   @Test
   public void testPlusEqualsWithList() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "def func():",
+    exec(
+        "def func():", //
         "  t = depset()",
         "  t += ['a', 'b']",
         "  return t",
@@ -409,7 +409,7 @@
   @Test
   public void testPlusEqualsNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset()",
         "  s1 += ['a']",
@@ -423,7 +423,7 @@
   @Test
   public void testFuncParamNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func1(t):",
         "  t += ['b']",
         "def func2():",
@@ -438,7 +438,7 @@
   @Test
   public void testTransitiveOrdering() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  sa = depset(['a'], order='postorder')",
         "  sb = depset(['b'], order='postorder')",
@@ -452,7 +452,7 @@
   @Test
   public void testLeftRightDirectOrdering() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  t = depset()",
         "  t += [4]",
@@ -467,8 +467,8 @@
   @Test
   public void testToString() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset() + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset() + [2, 4, 6] + [3, 4, 5]", //
         "x = str(s)");
     assertThat(lookup("x")).isEqualTo("depset([2, 4, 6, 3, 5])");
   }
@@ -476,8 +476,8 @@
   @Test
   public void testToStringWithOrder() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset(order = 'topological') + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset(order = 'topological') + [2, 4, 6] + [3, 4, 5]", //
         "x = str(s)");
     assertThat(lookup("x")).isEqualTo("depset([2, 4, 6, 3, 5], order = \"topological\")");
   }
@@ -490,8 +490,8 @@
   @Test
   public void testToList() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset() + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset() + [2, 4, 6] + [3, 4, 5]", //
         "x = s.to_list()");
     Object value = lookup("x");
     assertThat(value).isInstanceOf(MutableList.class);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
index fbfd192..86d5789 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
@@ -55,7 +55,7 @@
   @Test
   public void testAssign() throws Exception {
     assertThat(lookup("foo")).isNull();
-    eval("foo = 'bar'");
+    exec("foo = 'bar'");
     assertThat(lookup("foo")).isEqualTo("bar");
   }
 
@@ -74,7 +74,7 @@
   public void testAssignAndReference() throws Exception {
     SyntaxError e = assertThrows(SyntaxError.class, () -> eval("foo"));
     assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
-    eval("foo = 'bar'");
+    exec("foo = 'bar'");
     assertThat(eval("foo")).isEqualTo("bar");
   }
 
@@ -188,7 +188,7 @@
   @Test
   public void testBuiltinsCanBeShadowed() throws Exception {
     StarlarkThread thread = newStarlarkThreadWithSkylarkOptions().setup("special_var", 42);
-    EvalUtils.execOrEval(ParserInput.fromLines("special_var = 41"), thread);
+    EvalUtils.exec(ParserInput.fromLines("special_var = 41"), thread);
     assertThat(thread.moduleLookup("special_var")).isEqualTo(41);
   }
 
@@ -196,8 +196,10 @@
   public void testVariableIsReferencedBeforeAssignment() throws Exception {
     StarlarkThread thread = newStarlarkThread().update("global_var", 666);
     try {
-      EvalUtils.execOrEval(
-          ParserInput.fromLines("def foo(x): x += global_var; global_var = 36; return x", "foo(1)"),
+      EvalUtils.exec(
+          ParserInput.fromLines(
+              "def foo(x): x += global_var; global_var = 36; return x", //
+              "foo(1)"),
           thread);
       throw new AssertionError("failed to fail");
     } catch (EvalExceptionWithStackTrace e) {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index d1edd73..c44d1ff 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -17,7 +17,6 @@
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.truth.Ordered;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventKind;
@@ -167,14 +166,20 @@
     return thread.moduleLookup(varname);
   }
 
-  // TODO(adonovan): this function does far too much:
-  // - two forms, exec(file) or exec(file)+eval(expression).
+  /** Joins the lines, parses them as an expression, and evaluates it. */
+  public final Object eval(String... lines) throws Exception {
+    ParserInput input = ParserInput.fromLines(lines);
+    return EvalUtils.eval(input, thread);
+  }
+
+  /** Joins the lines, parses them as a file, and executes it. */
+  // TODO(adonovan): this function does too much:
   // - two modes, BUILD vs Skylark.
   // - parse + validate + BUILD dialect checks + execute.
   // Break the tests down into tests of just the scanner, parser, validator, build dialect checks,
   // or execution, and assert that all passes except the one of interest succeed.
   // All BUILD-dialect stuff belongs in bazel proper (lib.packages), not here.
-  public Object eval(String... lines) throws Exception {
+  public final void exec(String... lines) throws Exception {
     ParserInput input = ParserInput.fromLines(lines);
     StarlarkFile file = StarlarkFile.parse(input);
     ValidationEnvironment.validateFile(
@@ -189,12 +194,12 @@
       Event.replayEventsOn(getEventHandler(), file.errors());
       PackageFactory.checkBuildSyntax(file, getEventHandler());
     }
-    return EvalUtils.execOrEval(file, thread);
+    EvalUtils.exec(file, thread);
   }
 
   public void checkEvalError(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
       fail("Expected error '" + msg + "' but got no error");
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().isEqualTo(msg);
@@ -203,7 +208,7 @@
 
   public void checkEvalErrorContains(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
       fail("Expected error containing '" + msg + "' but got no error");
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().contains(msg);
@@ -212,7 +217,7 @@
 
   public void checkEvalErrorDoesNotContain(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().doesNotContain(msg);
     }
@@ -267,13 +272,9 @@
       setup = new SetupActions();
     }
 
-    /**
-     * Allows the execution of several statements before each following test
-     * @param statements The statement(s) to be executed
-     * @return This {@code ModalTestCase}
-     */
-    public ModalTestCase setUp(String... statements) {
-      setup.registerEval(statements);
+    /** Allows the execution of several statements before each following test. */
+    public ModalTestCase setUp(String... lines) {
+      setup.registerExec(lines);
       return this;
     }
 
@@ -289,153 +290,97 @@
     }
 
     /**
-     * Evaluates two parameters and compares their results.
-     * @param statement The statement to be evaluated
+     * Evaluates two expressions and asserts that their results are equal.
+     *
+     * @param src The source expression to be evaluated
      * @param expectedEvalString The expression of the expected result
      * @return This {@code ModalTestCase}
      * @throws Exception
      */
-    public ModalTestCase testEval(String statement, String expectedEvalString) throws Exception {
-      runTest(createComparisonTestable(statement, expectedEvalString, true));
+    public ModalTestCase testEval(String src, String expectedEvalString) throws Exception {
+      runTest(createComparisonTestable(src, expectedEvalString, true));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the expected object
-     * @param statement
-     * @param expected
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testStatement(String statement, Object expected) throws Exception {
-      runTest(createComparisonTestable(statement, expected, false));
+    /** Evaluates an expression and compares its result to the expected object. */
+    public ModalTestCase testExpression(String src, Object expected) throws Exception {
+      runTest(createComparisonTestable(src, expected, false));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the collection of expected objects
-     * without considering their order
-     * @param statement The statement to be evaluated
-     * @param items The expected items
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testCollection(String statement, Object... items) throws Exception {
-      runTest(collectionTestable(statement, false, items));
+    /** Evaluates an expression and compares its result to the ordered list of expected objects. */
+    public ModalTestCase testExactOrder(String src, Object... items) throws Exception {
+      runTest(collectionTestable(src, items));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the collection of expected objects
-     * while considering their order
-     * @param statement The statement to be evaluated
-     * @param items The expected items, in order
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testExactOrder(String statement, Object... items) throws Exception {
-      runTest(collectionTestable(statement, true, items));
+    /** Evaluates an expression and checks whether it fails with the expected error. */
+    public ModalTestCase testIfExactError(String expectedError, String... lines) throws Exception {
+      runTest(errorTestable(true, expectedError, lines));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and checks whether the given error message appears
-     * @param expectedError The expected error message
-     * @param statements The statement(s) to be evaluated
-     * @return This ModalTestCase
-     * @throws Exception
-     */
-    public ModalTestCase testIfExactError(String expectedError, String... statements)
+    /** Evaluates the expresson and checks whether it fails with the expected error. */
+    public ModalTestCase testIfErrorContains(String expectedError, String... lines)
         throws Exception {
-      runTest(errorTestable(true, expectedError, statements));
+      runTest(errorTestable(false, expectedError, lines));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and checks whether an error that contains the expected message
-     * occurs
-     * @param expectedError
-     * @param statements
-     * @return This ModalTestCase
-     * @throws Exception
-     */
-    public ModalTestCase testIfErrorContains(String expectedError, String... statements)
-        throws Exception {
-      runTest(errorTestable(false, expectedError, statements));
-      return this;
-    }
-
-    /**
-     * Looks up the value of the specified variable and compares it to the expected value
-     * @param name
-     * @param expected
-     * @return This ModalTestCase
-     * @throws Exception
-     */
+    /** Looks up the value of the specified variable and compares it to the expected value. */
     public ModalTestCase testLookup(String name, Object expected) throws Exception {
       runTest(createLookUpTestable(name, expected));
       return this;
     }
 
     /**
-     * Creates a Testable that checks whether the evaluation of the given statement leads to the
-     * expected error
-     * @param statements
-     * @param error
-     * @param exactMatch If true, the error message has to be identical to the expected error
-     * @return An instance of Testable that runs the error check
+     * Creates a Testable that checks whether the evaluation of the given expression fails with the
+     * expected error.
+     *
+     * @param exactMatch whether the error message must be identical to the expected error.
      */
     protected Testable errorTestable(
-        final boolean exactMatch, final String error, final String... statements) {
+        final boolean exactMatch, final String error, final String... lines) {
       return new Testable() {
         @Override
         public void run() throws Exception {
           if (exactMatch) {
-            checkEvalError(error, statements);
+            checkEvalError(error, lines);
           } else {
-            checkEvalErrorContains(error, statements);
+            checkEvalErrorContains(error, lines);
           }
         }
       };
     }
 
     /**
-     * Creates a testable that checks whether the evaluation of the given statement leads to a list
-     * that contains exactly the expected objects
-     * @param statement The statement to be evaluated
-     * @param ordered Determines whether the order of the elements is checked as well
-     * @param expected Expected objects
-     * @return An instance of Testable that runs the check
+     * Creates a Testable that checks whether the value of the expression is a sequence containing
+     * the expected elements.
      */
-    protected Testable collectionTestable(
-        final String statement, final boolean ordered, final Object... expected) {
+    protected Testable collectionTestable(final String src, final Object... expected) {
       return new Testable() {
         @Override
         public void run() throws Exception {
-          Ordered tmp = assertThat((Iterable<?>) eval(statement)).containsExactly(expected);
-
-          if (ordered) {
-            tmp.inOrder();
-          }
+          assertThat((Iterable<?>) eval(src)).containsExactly(expected).inOrder();
         }
       };
     }
 
     /**
-     * Creates a testable that compares the evaluation of the given statement to a specified result
+     * Creates a testable that compares the value of the expression to a specified result.
      *
-     * @param statement The statement to be evaluated
+     * @param src The expression to be evaluated
      * @param expected Either the expected object or an expression whose evaluation leads to the
-     *  expected object
+     *     expected object
      * @param expectedIsExpression Signals whether {@code expected} is an object or an expression
      * @return An instance of Testable that runs the comparison
      */
     protected Testable createComparisonTestable(
-        final String statement, final Object expected, final boolean expectedIsExpression) {
+        final String src, final Object expected, final boolean expectedIsExpression) {
       return new Testable() {
         @Override
         public void run() throws Exception {
-          Object actual = eval(statement);
+          Object actual = eval(src);
           Object realExpected = expected;
 
           // We could also print the actual object and compare the string to the expected
@@ -525,17 +470,13 @@
           });
     }
 
-    /**
-     * Registers a statement for evaluation prior to a test
-     *
-     * @param statements
-     */
-    public void registerEval(final String... statements) {
+    /** Registers a sequence of statements for execution prior to a test. */
+    public void registerExec(final String... lines) {
       setup.add(
           new Testable() {
             @Override
             public void run() throws Exception {
-              EvaluationTestCase.this.eval(statements);
+              EvaluationTestCase.this.exec(lines);
             }
           });
     }
