bazel: rename imports of lib.syntax to java.starlark.net

This change was produced mechanically by running the
script added in CL 322652849.

PiperOrigin-RevId: 331611185
diff --git a/src/test/java/com/google/devtools/build/docgen/BUILD b/src/test/java/com/google/devtools/build/docgen/BUILD
index 7396bfc..3c6add9 100644
--- a/src/test/java/com/google/devtools/build/docgen/BUILD
+++ b/src/test/java/com/google/devtools/build/docgen/BUILD
@@ -49,8 +49,9 @@
     ],
     deps = [
         "//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/starlark/util",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
         "//third_party:guava",
@@ -72,13 +73,14 @@
     deps = [
         ":testutil",
         "//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/main/java/com/google/devtools/build/lib/util:classpath",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/starlark/util",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
diff --git a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
index d7932f6..4a6ac0a 100644
--- a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationFailuresTest.java
@@ -17,9 +17,9 @@
 import static org.junit.Assert.assertThrows;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
index f50eae4..3bc3c3c 100644
--- a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
@@ -24,11 +24,6 @@
 import com.google.devtools.build.lib.analysis.starlark.StarlarkModules;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -41,6 +36,11 @@
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 97538f6..5d25f45 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -97,8 +97,8 @@
         ":AllTests",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/cmdline:LabelValidator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/net/starlark/java/eval",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestUtils",
@@ -171,10 +171,10 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:constants",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/net/starlark/java/eval",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
@@ -232,7 +232,7 @@
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/graph",
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/vfs/util",
@@ -275,7 +275,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:target_pattern_phase_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:transitive_target_key",
         "//src/main/java/com/google/devtools/build/lib/skyframe:transitive_target_value",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
@@ -288,6 +287,7 @@
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/com/google/devtools/common/options:invocation_policy",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:failure_details_java_proto",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/analysis/util:test-build-options",
@@ -411,7 +411,6 @@
         "//src/main/java/com/google/devtools/build/lib/sandbox",
         "//src/main/java/com/google/devtools/build/lib/skyframe:loading_phase_started_event",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_progress_receiver",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/unix",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
@@ -426,6 +425,7 @@
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/com/google/devtools/common/options:invocation_policy",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:command_line_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
         "//src/main/protobuf:invocation_policy_java_proto",
@@ -513,7 +513,6 @@
     test_class = "com.google.devtools.build.lib.AllTests",
     deps = [
         ":AllTests",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
@@ -534,6 +533,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/skyframe:testutil",
         "//third_party:auto_value",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/BUILD b/src/test/java/com/google/devtools/build/lib/actions/BUILD
index 88b89d8..0c7deb6 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/BUILD
@@ -50,7 +50,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/lib/util:string",
@@ -59,6 +58,7 @@
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/protobuf:action_cache_java_proto",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index 9a32d38..d962300 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -30,7 +30,6 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.LazyString;
@@ -39,6 +38,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Consumer;
+import net.starlark.java.eval.EvalException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
index bd566ad..7d24bb8 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java
@@ -76,7 +76,6 @@
 import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey;
 import com.google.devtools.build.lib.skyframe.TreeArtifactValue;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.ResourceUsage;
@@ -114,6 +113,7 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /** A bunch of utilities that are useful for tests concerning actions, artifacts, etc. */
 public final class ActionsTestUtil {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/BUILD b/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
index f888b58..ddf19c5 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/BUILD
@@ -35,7 +35,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:tree_artifact_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:crash_failure_details",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
@@ -48,6 +47,7 @@
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:action_cache_java_proto",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index 095935c..a97272c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestConstants.InternalTestExecutionMode;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -48,6 +47,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index 416141c..2c33266 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -34,9 +34,9 @@
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
index 3489510..0517a88 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BUILD
@@ -36,7 +36,6 @@
         ],
     ),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
@@ -149,6 +148,8 @@
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/analysis/testing",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
index 01788db..d59e41b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkAttrTransitionProviderTest.java
@@ -39,13 +39,13 @@
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Starlark;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
index da1939f..0388980 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationStarlarkTest.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Dict;
+import net.starlark.java.eval.Dict;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 84e1d13..83220dd 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -29,8 +29,8 @@
         "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/remote/options",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/exec/util",
         "//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java b/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
index a3d3509..4f5de13 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfoTest.java
@@ -20,7 +20,7 @@
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
index 6aa8688..8074f98 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/ArgsParamFileTest.java
@@ -23,15 +23,15 @@
 import com.google.devtools.build.lib.actions.ParamFileInfo;
 import com.google.devtools.build.lib.actions.ParameterFile;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.ShellEscaper;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStreamReader;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
index 8f6742c..6c73e19 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/FlagPerLineTest.java
@@ -21,13 +21,13 @@
 import com.google.common.io.CharStreams;
 import com.google.devtools.build.lib.actions.ParameterFile;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStreamReader;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
index 93b1557..a307d86 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLineTest.java
@@ -33,14 +33,14 @@
 import com.google.devtools.build.lib.actions.HasDigest;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkCustomCommandLine.VectorArg;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import java.util.Collection;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.Tuple;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
index b79f4ce..f0d281b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/test/TrimTestConfigurationTest.java
@@ -45,13 +45,13 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.skyframe.SkyKey;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
index 556cdff..c2018de 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/testing/BUILD
@@ -28,7 +28,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:truth",
     ],
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java b/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
index d7ee1e8..8258fd9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/testing/ToolchainInfoSubject.java
@@ -18,7 +18,7 @@
 import com.google.common.truth.FailureMetadata;
 import com.google.common.truth.Subject;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A Truth {@link Subject} for {@link ToolchainInfo}. */
 public class ToolchainInfoSubject extends Subject {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 61acc6f..fb9f0a9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -49,7 +49,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.shell.Command;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -68,6 +67,7 @@
 import java.util.Set;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Utilities for analysis phase tests.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
index dc8f9df..39bc267 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
@@ -36,7 +36,6 @@
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
         "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
         "//src/main/java/com/google/devtools/build/lib/actions:artifact_owner",
@@ -121,6 +120,8 @@
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
         "//src/test/java/com/google/devtools/build/lib/skyframe:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index b6c1809..59bc10e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -89,7 +89,6 @@
 import com.google.devtools.build.lib.skyframe.ToolchainContextKey;
 import com.google.devtools.build.lib.skyframe.ToolchainException;
 import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.ValueOrException;
@@ -103,6 +102,7 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A util class that contains all the helper stuff previously in BuildView that only exists to give
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index ec66bc3..41e6074 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -152,7 +152,6 @@
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.TargetPatternPhaseValue;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.SkyframeExecutorTestHelper;
@@ -190,6 +189,7 @@
 import java.util.UUID;
 import java.util.function.Predicate;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 
 /**
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
index 6f17138..87a03e9 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/debug/BUILD
@@ -18,7 +18,7 @@
     deps = [
         "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace-rule-event",
         "//src/main/java/com/google/devtools/build/lib/bazel/debug:workspace_log_java_proto",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java b/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
index bce7f9c..1f8e753 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEventTest.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.bazel.debug.proto.WorkspaceLogProtos;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
index 3160d54..f004b46 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
@@ -18,7 +18,6 @@
     srcs = glob(["*.java"]),
     deps = [
         "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
@@ -39,6 +38,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//third_party:guava",
@@ -79,12 +80,12 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
index d044d76..c5b9b38 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
@@ -41,18 +41,6 @@
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor.ExecutionResult;
 import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -66,6 +54,18 @@
 import java.util.HashMap;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.ParserInput;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
index 1d90761..6b105f6 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.regex.Pattern;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
index 735cd0e..d2fd290 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/DepsetTest.java
@@ -21,14 +21,14 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset.ElementType;
 import com.google.devtools.build.lib.packages.StarlarkLibrary;
 import com.google.devtools.build.lib.packages.StructProvider;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkIterable;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkIterable;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/events/BUILD b/src/test/java/com/google/devtools/build/lib/events/BUILD
index 42539b3..21b39c3 100644
--- a/src/test/java/com/google/devtools/build/lib/events/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/events/BUILD
@@ -17,9 +17,9 @@
     srcs = glob(["*.java"]),
     deps = [
         "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util/io",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
         "//third_party:guava",
@@ -46,8 +46,8 @@
     srcs = glob(["util/*.java"]) + ["EventTestTemplate.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util/io:out-err",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
         "//third_party:guava",
         "//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventTest.java b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
index 4bf68b3..4da3d9c 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
@@ -21,13 +21,13 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkThread.PrintHandler;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.build.lib.testutil.TestFileOutErr;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkThread.PrintHandler;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.SyntaxError;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java b/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
index 3aeac4d..9624398 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventTestTemplate.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 
 // Without 'public', tests fail in the guts of junit reflection.
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/BUILD b/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
index a23b3b8..ccbbcc5 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/exec/util/BUILD
@@ -43,10 +43,10 @@
         "//src/main/java/com/google/devtools/build/lib/exec:spawn_strategy_registry",
         "//src/main/java/com/google/devtools/build/lib/exec:spawn_strategy_resolver",
         "//src/main/java/com/google/devtools/build/lib/exec:symlink_tree_strategy",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java b/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
index 31b036a..bee5b03 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/util/FakeOwner.java
@@ -34,8 +34,8 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.Location;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /** Fake implementation of {@link ActionExecutionMetadata} for testing. */
 public class FakeOwner implements ActionExecutionMetadata {
diff --git a/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java b/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
index 5acb64d..057983c 100644
--- a/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
+++ b/src/test/java/com/google/devtools/build/lib/graph/DigraphTest.java
@@ -26,10 +26,10 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleVisibility;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
index b5ab6e2..731691e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeValueSourceTest.java
@@ -20,7 +20,7 @@
 
 import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BUILD b/src/test/java/com/google/devtools/build/lib/packages/BUILD
index ae38003..7392c35 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/BUILD
@@ -20,10 +20,11 @@
     name = "PackageTestsUtil",
     srcs = ["WorkspaceFactoryTestHelper.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//third_party:guava",
         "//third_party:junit4",
@@ -49,7 +50,6 @@
     deps = [
         ":PackageTestsUtil",
         ":testutil",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/build_options",
@@ -75,6 +75,8 @@
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil",
@@ -120,7 +122,6 @@
     deps = [
         "//src/main/java/com/google/devtools/build/docgen:docgen_javalib",
         "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -148,6 +149,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util:test-build-options",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
index db3814d..f99bc65 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
@@ -22,11 +22,11 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.analysis.util.MockRule;
 import com.google.devtools.build.lib.packages.PackageFactory.InjectionException;
-import com.google.devtools.build.lib.syntax.ClassObject;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.ClassObject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
index 21f8ce7..bcfc51e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
@@ -26,12 +26,12 @@
 import com.google.devtools.build.lib.packages.BuildType.LabelConversionContext;
 import com.google.devtools.build.lib.packages.BuildType.Selector;
 import com.google.devtools.build.lib.packages.Type.ConversionException;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
index ad89e6f..55dee16 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
@@ -23,8 +23,8 @@
 import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index d8ce7dc..568b24d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -27,9 +27,6 @@
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.packages.PackageValidator.InvalidPackageException;
 import com.google.devtools.build.lib.packages.util.PackageFactoryTestBase;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -39,6 +36,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
index ae7d3dd..f53be61 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 6d08e04..3332e68 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -55,10 +55,6 @@
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory;
 import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import java.util.ArrayList;
@@ -72,6 +68,10 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
index 3fb204c..dcfc31d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
@@ -29,14 +29,14 @@
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import java.util.HashMap;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
index 615680c..418b75a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
@@ -17,16 +17,16 @@
 import static org.junit.Assert.assertThrows;
 
 import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import java.util.List;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
index 62cb665..d3595bd 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkInfoTest.java
@@ -19,16 +19,16 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.TokenKind;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.TokenKind;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
index f44f6a7..4f28957 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
@@ -21,10 +21,10 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
index bfc69cf..36af363 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
@@ -18,10 +18,10 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
index 00a9c26..85563aa 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
@@ -28,13 +28,13 @@
 import com.google.devtools.build.lib.pkgcache.LoadingOptions;
 import com.google.devtools.build.lib.pkgcache.TestFilter;
 import com.google.devtools.build.lib.skyframe.TestsForTargetPatternValue;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.skyframe.EvaluationContext;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.function.Predicate;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
index 014ae54..7265c0d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
@@ -24,12 +24,12 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.Tuple;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
index 5a862d6..31d98d0 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
@@ -22,15 +22,15 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.Package.Builder.DefaultPackageSettings;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import java.util.List;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
 
 /** Parses a WORKSPACE file with the given content. */
 // TODO(adonovan): delete this junk class.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD b/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
index d84b27c..2fa85d9 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/metrics/BUILD
@@ -19,12 +19,13 @@
     size = "small",
     srcs = ["PackageMetricsPackageLoadingListenerTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/collect",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/packages/metrics",
         "//src/main/java/com/google/devtools/build/lib/packages/metrics:package_metrics_java_proto",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java b/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
index e66c5d9..24f5f32 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListenerTest.java
@@ -24,10 +24,10 @@
 import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.protobuf.util.Durations;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD b/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
index 66b88a1..a2dc388 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/semantics/BUILD
@@ -23,11 +23,12 @@
         "//src/test/java/com/google/devtools/build/lib:test_runner",
     ],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
index b773a92..3927bbe 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/semantics/ConsistencyTest.java
@@ -23,11 +23,11 @@
 import com.google.devtools.build.lib.skyframe.serialization.DynamicCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsParser;
 import java.util.Arrays;
 import java.util.Random;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 2e51915c..191ab93 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -32,9 +32,6 @@
 import com.google.devtools.build.lib.packages.PackageValidator;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.Pair;
@@ -43,6 +40,9 @@
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.common.options.OptionsParser;
 import java.io.IOException;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
 
 /**
  * An apparatus that creates / maintains a {@link PackageFactory}.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
index 45b61ae..66d2c17 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
@@ -30,7 +30,6 @@
 import com.google.devtools.build.lib.packages.PackageValidator;
 import com.google.devtools.build.lib.packages.RawAttributeMapper;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.Pair;
@@ -47,6 +46,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import net.starlark.java.eval.Starlark;
 import org.junit.Before;
 
 /** Base class for PackageFactory tests. */
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
index b3bb2bf..bf0c97c 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageLoadingTest.java
@@ -41,7 +41,6 @@
 import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.SkyframeExecutorTestHelper;
@@ -54,6 +53,7 @@
 import java.io.IOException;
 import java.util.Optional;
 import java.util.UUID;
+import net.starlark.java.syntax.StarlarkFile;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
index 1f6e09a..7991337 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
@@ -22,19 +22,6 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleFunction;
 import com.google.devtools.build.lib.profiler.memory.AllocationTracker.RuleBytes;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.HasBinary;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
-import com.google.devtools.build.lib.syntax.TokenKind;
 import com.google.perftools.profiles.ProfileProto.Function;
 import com.google.perftools.profiles.ProfileProto.Profile;
 import com.google.perftools.profiles.ProfileProto.Sample;
@@ -43,6 +30,19 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.HasBinary;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
+import net.starlark.java.syntax.TokenKind;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD b/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
index e4129a3..afc9fdd 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/BUILD
@@ -12,12 +12,13 @@
     name = "AllocationTrackerTest",
     srcs = ["AllocationTrackerTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker",
         "//src/main/java/com/google/devtools/build/lib/profiler/memory:current_rule_tracker",
         "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:mockito",
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
index cfdd012..fa505cc 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
@@ -53,7 +53,6 @@
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.Root;
@@ -79,6 +78,7 @@
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
index a272958..1fb0c26 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
@@ -24,9 +24,9 @@
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.Starlark;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
index e735d04..4b5ea27 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -36,10 +36,11 @@
     name = "AndroidStarlarkTest",
     srcs = ["AndroidStarlarkTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
         "//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java b/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
index e77bf68..0003a05 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/AppleRulesTest.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.MockObjcSupport;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.Sequence;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD b/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
index d1b4c4d..02ca84f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/BUILD
@@ -16,7 +16,6 @@
     name = "AppleRulesTests_lib",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -26,6 +25,8 @@
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/apple",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:xcode_java_proto",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
index f05b42f..5fab1a8 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -39,7 +39,6 @@
         ":CcImportBaseConfiguredTargetTest",
         ":StarlarkCcCommonTestHelper",
         ":util",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
@@ -69,6 +68,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:crosstool_config_java_proto",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
@@ -144,7 +145,8 @@
     name = "CppConfigurationStarlarkTest",
     srcs = ["CppConfigurationStarlarkTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//third_party:junit4",
         "//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
index e8581ca..1469035 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeaturesTest.java
@@ -43,7 +43,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
@@ -54,6 +53,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.EvalException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
index ce1c63f..6ea5447 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
@@ -16,9 +16,9 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.io.IOException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 2893977..ecc04db 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -50,7 +50,6 @@
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.Pair;
@@ -63,6 +62,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
index 93b8e9d..089d523 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
@@ -54,10 +54,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.VariableWithValue;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.WithFeatureSet;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.StringValueParser;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.Pair;
@@ -71,6 +67,10 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
index 167106a..2b6d281 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
@@ -14,11 +14,11 @@
 package com.google.devtools.build.lib.rules.cpp;
 
 import com.google.devtools.build.lib.packages.util.ResourceLoader;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import java.io.IOException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkList;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
index 9458d2a..9ccdfbb 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -58,7 +58,6 @@
     name = "JavaStarlarkApiTest",
     srcs = ["JavaStarlarkApiTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
@@ -69,6 +68,8 @@
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-rules",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
index 564c2d3..6de78c7 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -32,13 +32,13 @@
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
-import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.FileType;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import net.starlark.java.eval.Sequence;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 412cd0a..28849bf 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -44,7 +44,6 @@
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
 import com.google.devtools.build.lib.rules.objc.AppleBinary.BinaryType;
 import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
-import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -54,6 +53,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.Dict;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
index e3703b6..6e41834 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BUILD
@@ -66,7 +66,6 @@
         ],
     ),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
@@ -90,6 +89,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
index 1607015..e943411 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
@@ -26,12 +26,12 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
index e78ed8c..957de50 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -21,12 +21,13 @@
         exclude = TESTUTIL_SRCS,
     ),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
index 0b53f8b..d392b15 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintCollectionApiTest.java
@@ -25,11 +25,11 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.util.Collection;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
index 05c6d0d..b5caa7a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Starlark;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD b/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
index 62ced21..69cbfea 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/BUILD
@@ -23,10 +23,10 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/rules/proto",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
index 4f5acb1..3585ac9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java
@@ -36,13 +36,13 @@
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Services;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.ToolchainInvocation;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.LazyString;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/BUILD b/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
index 0493376..7090e31 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/BUILD
@@ -177,8 +177,9 @@
     name = "PythonToolchainTest",
     srcs = ["PythonToolchainTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
         "//third_party:junit4",
@@ -190,9 +191,10 @@
     name = "PyProviderUtilsTest",
     srcs = ["PyProviderUtilsTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/rules/python",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//third_party:junit4",
         "//third_party:truth",
@@ -203,12 +205,13 @@
     name = "PyStructUtilsTest",
     srcs = ["PyStructUtilsTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/python",
         "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//third_party:guava",
@@ -225,7 +228,7 @@
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/rules/python",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/starlark/util",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
@@ -241,8 +244,8 @@
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/rules/python",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/starlark/util",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
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 c635d7e..b8ec1c1 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
@@ -22,8 +22,8 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
index 1b433bc..b005a7a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyProviderUtilsTest.java
@@ -19,7 +19,7 @@
 
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 import org.junit.Test;
 import org.junit.function.ThrowingRunnable;
 import org.junit.runner.RunWith;
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 9e47561..db6dbbc 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
@@ -22,9 +22,9 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import net.starlark.java.syntax.Location;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
index f9ade69..7e50d69 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyStructUtilsTest.java
@@ -28,11 +28,11 @@
 import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.vfs.Root;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.function.ThrowingRunnable;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
index 4883a0c..3ab1455 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PythonToolchainTest.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.rules.python;
 
 import static com.google.common.truth.Truth.assertThat;
-import static com.google.devtools.build.lib.syntax.Starlark.NONE;
+import static net.starlark.java.eval.Starlark.NONE;
 
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
index 3b6a052..2d72bff 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
@@ -16,7 +16,6 @@
     name = "RepositoryTests_lib",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
@@ -46,6 +45,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index aadc37d..b6c45cc 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -60,7 +60,6 @@
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryBootstrap;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestConstants;
@@ -89,6 +88,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java b/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
index 017409d..d4c8bb4 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/LocationPrinterTest.java
@@ -16,12 +16,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
index 1f37b99..b26e040 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/UiStateTrackerTest.java
@@ -51,7 +51,6 @@
 import com.google.devtools.build.lib.runtime.UiStateTracker.StrategyIds;
 import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
 import com.google.devtools.build.lib.skyframe.PackageProgressReceiver;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -67,6 +66,7 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import net.starlark.java.syntax.Location;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
index f0ede9b..e879ff6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
@@ -22,9 +22,6 @@
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.LoadStatement;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
 import com.google.devtools.build.lib.vfs.FileStatus;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -37,6 +34,9 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import java.io.IOException;
 import java.util.List;
+import net.starlark.java.syntax.LoadStatement;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.Statement;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index 8a0a15f..15b8bff 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -105,7 +105,8 @@
         "//src/main/java/com/google/devtools/build/lib:build-request-options",
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
         "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/net/starlark/java/syntax",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 36a3dad..8004833 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -61,6 +60,7 @@
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index ae9168d..c4d7532 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -51,7 +51,6 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestPackageFactoryBuilderFactory;
@@ -93,6 +92,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 89523b3..728fe1d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -42,7 +42,6 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -71,6 +70,7 @@
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index 3f99311..0c4a432 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -39,7 +39,6 @@
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -72,6 +71,7 @@
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
index f87dbda..b54321e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -55,6 +54,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index c0837cb..5725a7e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -48,7 +48,6 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.Module;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -85,6 +84,7 @@
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Module;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index 034194f..e9f60b5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -43,7 +43,6 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.IncorrectRepositoryReferencePackageLookupValue;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -70,6 +69,7 @@
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 2b23594..261384d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -57,7 +57,6 @@
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.RecursiveFilesystemTraversalException;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TimestampGranularityUtils;
 import com.google.devtools.build.lib.util.io.OutErr;
@@ -96,6 +95,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index cdf5f95..5c41342 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -116,9 +116,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
@@ -161,6 +158,9 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
index b2114a3..c653e4b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SingleToolchainResolutionFunctionTest.java
@@ -30,11 +30,11 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.rules.platform.ToolchainTestCase;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
index 063276d..62044a3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
@@ -23,10 +23,10 @@
 import com.google.devtools.build.lib.analysis.util.MockRule;
 import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.ClassObject;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
+import net.starlark.java.eval.ClassObject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
index d1edec5..effc2e3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
@@ -25,7 +25,6 @@
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.Package.Builder.DefaultPackageSettings;
 import com.google.devtools.build.lib.skyframe.TransitiveBaseTraversalFunction.TargetAndErrorIfAnyImpl;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.GroupedList;
 import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
 import com.google.devtools.build.lib.vfs.Path;
@@ -35,6 +34,7 @@
 import com.google.devtools.build.skyframe.ValueOrException2;
 import com.google.devtools.build.skyframe.ValueOrUntypedException;
 import java.util.concurrent.atomic.AtomicBoolean;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
index 5425ebe..b1c3a47 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunctionTest.SkyKeyMatchers;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -33,6 +32,7 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
+import net.starlark.java.syntax.StarlarkFile;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
index 712930b..fb83b8a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.rules.repository.ManagedDirectoriesKnowledgeImpl;
 import com.google.devtools.build.lib.rules.repository.ManagedDirectoriesKnowledgeImpl.ManagedDirectoriesListener;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -50,6 +49,7 @@
 import java.util.Objects;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
index e71f75d..b1689d0 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/BUILD
@@ -18,7 +18,6 @@
     srcs = ["TrimmableTestConfigurationFragments.java"],
     visibility = ["//src/test:__subpackages__"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -46,6 +45,8 @@
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//third_party:guava",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
index c1669ee..2aae7d1 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
@@ -61,9 +61,6 @@
 import com.google.devtools.build.lib.rules.core.CoreRules;
 import com.google.devtools.build.lib.rules.repository.BindRule;
 import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.common.options.Option;
@@ -76,6 +73,9 @@
 import java.util.function.Function;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Set of trimmable fragments for testing automatic trimming. */
 public final class TrimmableTestConfigurationFragments {
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/BUILD b/src/test/java/com/google/devtools/build/lib/starlark/BUILD
index 41be72b..b9153c5 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlark/BUILD
@@ -25,7 +25,6 @@
     ],
     deps = [
         "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
@@ -66,6 +65,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
index 15f6f76..93eb891 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkActionProviderTest.java
@@ -27,11 +27,11 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.util.List;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Sequence;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
index b63e271..875a953 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
@@ -47,8 +47,8 @@
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.objc.ObjcProtoProvider;
 import com.google.devtools.build.lib.skyframe.AspectValueKey.AspectKey;
-import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
+import net.starlark.java.eval.Sequence;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
index 3de30c9..d349411 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
@@ -53,13 +53,13 @@
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.objc.ObjcProvider;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.io.IOException;
 import java.util.List;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
index 83f8d05..199521f 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
@@ -52,21 +52,21 @@
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.skyframe.BzlLoadFunction;
 import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.ClassObject;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Program;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.Tuple;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
index 7143370..380feae 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleContextTest.java
@@ -52,12 +52,6 @@
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.python.PyProviderUtils;
 import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -66,6 +60,12 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
index cd853e1..e53481e 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
@@ -57,12 +57,6 @@
 import com.google.devtools.build.lib.packages.StarlarkProvider;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.starlark.util.BazelEvaluationTestCase;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.OsUtils;
@@ -77,6 +71,12 @@
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -802,8 +802,8 @@
    * parameter of the template_action function contains a hack that assumes its input is a UTF-8
    * encoded string which has been ingested as Latin 1. The hack converts the string to its
    * "correct" UTF-8 value. Once Blaze starts calling {@link
-   * com.google.devtools.build.lib.syntax.ParserInput#fromUTF8} instead of {@code fromLatin1} and
-   * the hack for the substituations parameter is removed, this test will fail.
+   * net.starlark.java.syntax.ParserInput#fromUTF8} instead of {@code fromLatin1} and the hack for
+   * the substituations parameter is removed, this test will fail.
    */
   @Test
   public void testCreateTemplateActionWithWrongEncoding() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD b/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
index f475852..3f8eed9 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlark/util/BUILD
@@ -18,7 +18,6 @@
     deps = [
         "//src/main/java/com/google/devtools/build/lib:keep-going-option",
         "//src/main/java/com/google/devtools/build/lib:runtime",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -28,6 +27,8 @@
         "//src/main/java/com/google/devtools/build/lib/rules/platform",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//src/test/java/com/google/devtools/build/lib/syntax/util",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
index 5c4ac84..25825a4 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
@@ -21,10 +21,10 @@
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.packages.SymbolGenerator;
 import com.google.devtools.build.lib.rules.platform.PlatformCommon;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * BazelEvaluationTestCase is a subclass of EvaluationTestCase that defines various Bazel built-ins
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
index 8d015bc..12e91d7 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
@@ -28,10 +28,11 @@
     srcs = ["StarlarkDebugServerTest.java"],
     deps = [
         ":utils",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/starlarkdebug/proto:starlark_debugging_java_proto",
         "//src/main/java/com/google/devtools/build/lib/starlarkdebug/server",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -57,11 +58,12 @@
     name = "DebuggerSerializationTest",
     srcs = ["DebuggerSerializationTest.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/starlarkdebug/proto:starlark_debugging_java_proto",
         "//src/main/java/com/google/devtools/build/lib/starlarkdebug/server",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
index 33d6435..459a7ef 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerializationTest.java
@@ -23,14 +23,14 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
index 05a39a8..4b80fae 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
@@ -38,17 +38,6 @@
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.StartDebuggingResponse;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Stepping;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.ServerSocket;
@@ -62,6 +51,17 @@
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -162,8 +162,7 @@
 
     Location expectedLocation =
         DebugEventHelper.getLocationProto(
-            com.google.devtools.build.lib.syntax.Location.fromFileLineColumn(
-                "/a/build/file/BUILD", 1, 1));
+            net.starlark.java.syntax.Location.fromFileLineColumn("/a/build/file/BUILD", 1, 1));
 
     assertThat(event)
         .isEqualTo(
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BUILD b/src/test/java/com/google/devtools/build/lib/syntax/BUILD
index f8bb8c9..13241e1 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BUILD
@@ -1,93 +1,21 @@
-load("@rules_java//java:defs.bzl", "java_test")
-
-package(
-    default_testonly = 1,
-    default_visibility = ["//src:__subpackages__"],
-)
+licenses(["notice"])
 
 filegroup(
     name = "srcs",
     testonly = 0,
-    srcs = glob(["**"]) + [
+    srcs = [
+        "BUILD",
         "//src/test/java/com/google/devtools/build/lib/syntax/util:srcs",
     ],
-)
-
-# frontend_test tests the Starlark parser/resolver.
-java_test(
-    name = "frontend_test",
-    srcs = [
-        "FileLocationsTest.java",
-        "LValueBoundNamesTest.java",
-        "LexerTest.java",
-        "LocationTest.java",
-        "NodePrinterTest.java",
-        "NodeVisitorTest.java",
-        "ParserInputTest.java",
-        "ParserTest.java",
-        "ResolverTest.java",
-        "StarlarkFileTest.java",
-    ],
-    test_class = "com.google.devtools.build.lib.AllTests",
-    runtime_deps = [
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-    ],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
-        "//third_party:guava",
-        "//third_party:jsr305",
-        "//third_party:junit4",
-        "//third_party:truth",
-    ],
-)
-
-# evaluator_test tests the Starlark interpreter.
-java_test(
-    name = "evaluator_test",
-    srcs = [
-        # CpuProfilerTest.java doesn't run under OSS Bazel
-        "EvalUtilsTest.java",
-        "EvaluationTest.java",
-        "EvaluationTestCase.java",
-        "Examples.java",
-        "FunctionTest.java",
-        "MethodLibraryTest.java",
-        "MutabilityTest.java",
-        "PrinterTest.java",
-        "StarlarkEvaluationTest.java",
-        "StarlarkFlagGuardingTest.java",
-        "StarlarkInterfaceUtilsTest.java",
-        "StarlarkListTest.java",
-        "StarlarkMutableTest.java",
-        "StarlarkThreadDebuggingTest.java",
-        "StarlarkThreadTest.java",
-        "StringModuleTest.java",
-    ],
-    test_class = "com.google.devtools.build.lib.AllTests",
-    runtime_deps = [
-        "//src/test/java/com/google/devtools/build/lib:test_runner",
-    ],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
-        "//src/main/java/net/starlark/java/annot",
-        "//third_party:guava",
-        "//third_party:jsr305",
-        "//third_party:junit4",
-        "//third_party:truth",
-    ],
+    visibility = ["//visibility:public"],
 )
 
 test_suite(
     name = "windows_tests",
-    tags = [
-        "-no_windows",
-        "-slow",
-    ],
-)
+    tags = [],
+)  # unneeded?
 
 test_suite(
     name = "all_windows_tests",
-    tests = [
-        ":windows_tests",
-    ],
+    tests = [],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java
deleted file mode 100644
index c3781a6..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/CpuProfilerTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.io.ByteStreams;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.time.Duration;
-
-/**
- * CpuProfilerTest is a simple integration test that the Starlark CPU profiler emits minimally
- * plausible pprof-compatible output.
- *
- * <p>It runs under Blaze only, because it requires a pprof executable.
- */
-public final class CpuProfilerTest {
-
-  private CpuProfilerTest() {} // uninstantiable
-
-  public static void main(String[] args) throws Exception {
-    String pprofCmd = args.length == 0 ? "/bin/pprof" : args[0];
-    if (!new File(pprofCmd).exists()) {
-      throw new AssertionError("no pprof command: " + pprofCmd);
-    }
-
-    // This test will fail during profiling of the Java tests
-    // because a process (the JVM) can have only one profiler.
-    // That's ok; just ignore it.
-
-    // Start writing profile to temporary file.
-    File profile = java.io.File.createTempFile("pprof", ".gz", null);
-    OutputStream prof = new FileOutputStream(profile);
-    Starlark.startCpuProfile(prof, Duration.ofMillis(10));
-
-    // This program consumes about 3s of CPU.
-    ParserInput input =
-        ParserInput.fromLines(
-            "x = [0]", //
-            "",
-            "def f():",
-            "    for i in range(10000):",
-            "        g()",
-            "",
-            "def g():",
-            "    list(range(10000))",
-            "    int(3)",
-            "    sorted(range(10000))",
-            "",
-            "f()");
-
-    // Execute the workload.
-    Module module = Module.create();
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
-    }
-
-    Starlark.stopCpuProfile();
-
-    // Run pprof -top. Typical output (may vary by pprof release):
-    //
-    // Type: CPU
-    // Time: Jan 21, 2020 at 11:08am (PST)
-    // Duration: 3.26s, Total samples = 2640ms (80.97%)
-    // Showing nodes accounting for 2640ms, 100% of 2640ms total
-    //       flat  flat%   sum%        cum   cum%
-    //     1390ms 52.65% 52.65%     1390ms 52.65%  sorted
-    //      960ms 36.36% 89.02%      960ms 36.36%  list
-    //      220ms  8.33% 97.35%      220ms  8.33%  range
-    //       70ms  2.65%   100%       70ms  2.65%  int
-    //          0     0%   100%     2640ms   100%  <unknown>
-    //          0     0%   100%     2640ms   100%  f
-    //          0     0%   100%     2640ms   100%  g
-
-    // Runtime.exec is deprecated at Google but its open-source replacement is not yet available.
-    @SuppressWarnings("RuntimeExec")
-    Process pprof =
-        Runtime.getRuntime()
-            .exec(pprofCmd + " -top " + profile, /*envp=*/ new String[0], /*dir=*/ null);
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    ByteStreams.copy(pprof.getInputStream(), out);
-    String got = out.toString(); // encoding undefined but unimportant---result is ASCII
-
-    // We'll assert that a few key substrings are present.
-    boolean ok = true;
-    for (String want : new String[] {"flat%", "sorted", "range"}) {
-      if (!got.contains(want)) {
-        System.err.println("pprof output does not contain substring: " + got);
-        ok = false;
-      }
-    }
-    if (!ok) {
-      System.err.println("pprof output:\n" + out);
-      System.exit(1);
-    }
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
deleted file mode 100644
index ebe1fe6..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.StarlarkBuiltin;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Test properties of the evaluator's datatypes and utility functions without actually creating any
- * parse trees.
- */
-@RunWith(JUnit4.class)
-public final class EvalUtilsTest {
-
-  private static StarlarkList<Object> makeList(@Nullable Mutability mu) {
-    return StarlarkList.of(mu, 1, 2, 3);
-  }
-
-  private static Dict<Object, Object> makeDict(@Nullable Mutability mu) {
-    return Dict.of(mu, 1, 1, 2, 2);
-  }
-
-  /** MockClassA */
-  @StarlarkBuiltin(name = "MockClassA", doc = "MockClassA")
-  public static class MockClassA implements StarlarkValue {}
-
-  /** MockClassB */
-  public static class MockClassB extends MockClassA {
-  }
-
-  @Test
-  public void testDataTypeNames() throws Exception {
-    assertThat(Starlark.type("foo")).isEqualTo("string");
-    assertThat(Starlark.type(3)).isEqualTo("int");
-    assertThat(Starlark.type(Tuple.of(1, 2, 3))).isEqualTo("tuple");
-    assertThat(Starlark.type(makeList(null))).isEqualTo("list");
-    assertThat(Starlark.type(makeDict(null))).isEqualTo("dict");
-    assertThat(Starlark.type(Starlark.NONE)).isEqualTo("NoneType");
-    assertThat(Starlark.type(new MockClassA())).isEqualTo("MockClassA");
-    assertThat(Starlark.type(new MockClassB())).isEqualTo("MockClassA");
-  }
-
-  @Test
-  public void testDatatypeMutabilityPrimitive() throws Exception {
-    assertThat(Starlark.isImmutable("foo")).isTrue();
-    assertThat(Starlark.isImmutable(3)).isTrue();
-  }
-
-  @Test
-  public void testDatatypeMutabilityShallow() throws Exception {
-    assertThat(Starlark.isImmutable(Tuple.of(1, 2, 3))).isTrue();
-
-    assertThat(Starlark.isImmutable(makeList(null))).isTrue();
-    assertThat(Starlark.isImmutable(makeDict(null))).isTrue();
-
-    Mutability mu = Mutability.create("test");
-    assertThat(Starlark.isImmutable(makeList(mu))).isFalse();
-    assertThat(Starlark.isImmutable(makeDict(mu))).isFalse();
-  }
-
-  @Test
-  public void testDatatypeMutabilityDeep() throws Exception {
-    Mutability mu = Mutability.create("test");
-    assertThat(Starlark.isImmutable(Tuple.of(makeList(null)))).isTrue();
-    assertThat(Starlark.isImmutable(Tuple.of(makeList(mu)))).isFalse();
-  }
-
-  @Test
-  public void testComparatorWithDifferentTypes() throws Exception {
-    Mutability mu = Mutability.create("test");
-
-    StarlarkValue myValue = new StarlarkValue() {};
-
-    Object[] objects = {
-      "1",
-      2,
-      true,
-      Starlark.NONE,
-      Tuple.of(1, 2, 3),
-      Tuple.of("1", "2", "3"),
-      StarlarkList.of(mu, 1, 2, 3),
-      StarlarkList.of(mu, "1", "2", "3"),
-      Dict.of(mu, "key", 123),
-      Dict.of(mu, 123, "value"),
-      myValue,
-    };
-
-    for (int i = 0; i < objects.length; ++i) {
-      for (int j = 0; j < objects.length; ++j) {
-        if (i != j) {
-          Object first = objects[i];
-          Object second = objects[j];
-          assertThrows(
-              ComparisonException.class,
-              () -> EvalUtils.STARLARK_COMPARATOR.compare(first, second));
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testComparatorWithNones() throws Exception {
-    assertThrows(
-        ComparisonException.class,
-        () -> EvalUtils.STARLARK_COMPARATOR.compare(Starlark.NONE, Starlark.NONE));
-  }
-
-  @Test
-  public void testLen() {
-    assertThat(Starlark.len("abc")).isEqualTo(3);
-    assertThat(Starlark.len(Tuple.of(1, 2, 3))).isEqualTo(3);
-    assertThat(Starlark.len(StarlarkList.of(null, 1, 2, 3))).isEqualTo(3);
-    assertThat(Starlark.len(Dict.of(null, "one", 1, "two", 2))).isEqualTo(2);
-    assertThat(Starlark.len(true)).isEqualTo(-1);
-    assertThrows(IllegalArgumentException.class, () -> Starlark.len(this));
-  }
-}
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
deleted file mode 100644
index 8d9c0d4..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ /dev/null
@@ -1,915 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Test of evaluation behavior. (Implicitly uses lexer + parser.) */
-// TODO(adonovan): separate tests of parser, resolver, Starlark core evaluator,
-// and BUILD and .bzl features.
-@RunWith(JUnit4.class)
-public final class EvaluationTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  @Test
-  public void testExecutionStopsAtFirstError() throws Exception {
-    List<String> printEvents = new ArrayList<>();
-    ParserInput input = ParserInput.fromLines("print('hello'); x = 1//0; print('goodbye')");
-    InterruptFunction interrupt = new InterruptFunction();
-    assertThrows(EvalException.class, () -> execWithInterrupt(input, interrupt, printEvents));
-
-    // Only expect hello, should have been an error before goodbye.
-    assertThat(printEvents.toString()).isEqualTo("[hello]");
-  }
-
-  @Test
-  public void testExecutionNotStartedOnInterrupt() throws Exception {
-    ParserInput input = ParserInput.fromLines("print('hello')");
-    List<String> printEvents = new ArrayList<>();
-    Thread.currentThread().interrupt();
-    InterruptFunction interrupt = new InterruptFunction();
-    assertThrows(
-        InterruptedException.class, () -> execWithInterrupt(input, interrupt, printEvents));
-
-    // Execution didn't reach print.
-    assertThat(printEvents).isEmpty();
-  }
-
-  @Test
-  public void testForLoopAbortedOnInterrupt() throws Exception {
-    ParserInput input =
-        ParserInput.fromLines(
-            "def f():", //
-            "  for i in range(100):",
-            "    interrupt(i == 5)",
-            "f()");
-    InterruptFunction interrupt = new InterruptFunction();
-    assertThrows(
-        InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
-    assertThat(interrupt.callCount).isEqualTo(6);
-  }
-
-  @Test
-  public void testForComprehensionAbortedOnInterrupt() throws Exception {
-    ParserInput input = ParserInput.fromLines("[interrupt(i == 5) for i in range(100)]");
-    InterruptFunction interrupt = new InterruptFunction();
-    assertThrows(
-        InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
-    assertThat(interrupt.callCount).isEqualTo(6);
-  }
-
-  @Test
-  public void testFunctionCallsNotStartedOnInterrupt() throws Exception {
-    ParserInput input =
-        ParserInput.fromLines("interrupt(False); interrupt(True); interrupt(False);");
-    InterruptFunction interrupt = new InterruptFunction();
-    assertThrows(
-        InterruptedException.class, () -> execWithInterrupt(input, interrupt, new ArrayList<>()));
-
-    // Third call shouldn't happen.
-    assertThat(interrupt.callCount).isEqualTo(2);
-  }
-
-  private static class InterruptFunction implements StarlarkCallable {
-
-    private int callCount = 0;
-
-    @Override
-    public String getName() {
-      return "interrupt";
-    }
-
-    @Override
-    public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
-      callCount++;
-      if (positional.length > 0 && Starlark.truth(positional[0])) {
-        Thread.currentThread().interrupt();
-      }
-      return Starlark.NONE;
-    }
-  }
-
-  // Executes input, with the specified 'interrupt' predeclared built-in, gather print events in
-  // printEvents.
-  private static void execWithInterrupt(
-      ParserInput input, InterruptFunction interrupt, List<String> printEvents) throws Exception {
-    Module module =
-        Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("interrupt", interrupt));
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      thread.setPrintHandler((_thread, msg) -> printEvents.add(msg));
-      Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
-    } finally {
-      // Reset interrupt bit in case the test failed to do so.
-      Thread.interrupted();
-    }
-  }
-
-  @Test
-  public void testExecutionSteps() throws Exception {
-    Mutability mu = Mutability.create("test");
-    StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-    ParserInput input = ParserInput.fromLines("squares = [x*x for x in range(n)]");
-
-    class C {
-      long run(int n) throws SyntaxError.Exception, EvalException, InterruptedException {
-        Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("n", n));
-        long steps0 = thread.getExecutedSteps();
-        Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
-        return thread.getExecutedSteps() - steps0;
-      }
-    }
-
-    // A thread records the number of computation steps.
-    long steps1000 = new C().run(1000);
-    long steps10000 = new C().run(10000);
-    double ratio = (double) steps10000 / (double) steps1000;
-    if (ratio < 9.9 || ratio > 10.1) {
-      throw new AssertionError(
-          String.format(
-              "computation steps did not increase linearly: f(1000)=%d, f(10000)=%d, ratio=%g, want"
-                  + " ~10",
-              steps1000, steps10000, ratio));
-    }
-
-    // Exceeding the limit causes cancellation.
-    thread.setMaxExecutionSteps(1000);
-    EvalException ex = assertThrows(EvalException.class, () -> new C().run(1000));
-    assertThat(ex).hasMessageThat().contains("Starlark computation cancelled: too many steps");
-  }
-
-  @Test
-  public void testExprs() throws Exception {
-    ev.new Scenario()
-        .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 binary operation: int % string", "3 % 'foo'")
-        .testExpression("-5", -5)
-        .testIfErrorContains("unsupported unary operation: -string", "-'foo'");
-  }
-
-  @Test
-  public void testListExprs() throws Exception {
-    ev.new Scenario().testExactOrder("[1, 2, 3]", 1, 2, 3).testExactOrder("(1, 2, 3)", 1, 2, 3);
-  }
-
-  @Test
-  public void testStringFormatMultipleArgs() throws Exception {
-    ev.new Scenario().testExpression("'%sY%s' % ('X', 'Z')", "XYZ");
-  }
-
-  @Test
-  public void testConditionalExpressions() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .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
-  public void testSumFunction() throws Exception {
-    StarlarkCallable sum =
-        new StarlarkCallable() {
-          @Override
-          public String getName() {
-            return "sum";
-          }
-
-          @Override
-          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
-            int sum = 0;
-            for (Object arg : positional) {
-              sum += (Integer) arg;
-            }
-            return sum;
-          }
-        };
-
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .setUp("sum = 123456")
-        .testLookup("sum", 123456)
-        .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
-        .testExpression("sum", 123456);
-  }
-
-  @Test
-  public void testComplexFunctionCall() throws Exception {
-    ev.new Scenario()
-        .setUp("functions = [min, max]", "l = [1,2]")
-        .testEval("(functions[0](l), functions[1](l))", "(1, 2)");
-  }
-
-  @Test
-  public void testKeywordArgs() throws Exception {
-    // This function returns the map of keyword arguments passed to it.
-    StarlarkCallable kwargs =
-        new StarlarkCallable() {
-          @Override
-          public String getName() {
-            return "kwargs";
-          }
-
-          @Override
-          public Object call(
-              StarlarkThread thread,
-              Tuple<Object> args,
-              Dict<String, Object> kwargs) {
-            return kwargs;
-          }
-        };
-
-    ev.new Scenario()
-        .update(kwargs.getName(), kwargs)
-        .testEval(
-            "kwargs(foo=1, bar='bar', wiz=[1,2,3]).items()",
-            "[('foo', 1), ('bar', 'bar'), ('wiz', [1, 2, 3])]")
-        .testEval(
-            "kwargs(wiz=[1,2,3], bar='bar', foo=1).items()",
-            "[('wiz', [1, 2, 3]), ('bar', 'bar'), ('foo', 1)]");
-  }
-
-  @Test
-  public void testModulo() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .testExpression("6 * 7", 42)
-        .testExpression("3 * 'ab'", "ababab")
-        .testExpression("0 * 'ab'", "")
-        .testExpression("'1' + '0' * 5", "100000")
-        .testExpression("'ab' * -4", "")
-        .testExpression("-1 * ''", "");
-  }
-
-  @Test
-  public void testSlashOperatorIsForbidden() throws Exception {
-    ev.new Scenario().testIfErrorContains("The `/` operator is not allowed.", "5 / 2");
-  }
-
-  @Test
-  public void testFloorDivision() throws Exception {
-    ev.new Scenario()
-        .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 binary operation: string // int", "'str' // 2")
-        .testIfExactError("integer division by zero", "5 // 0");
-  }
-
-  @Test
-  public void testCheckedArithmetic() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("integer overflow", "2000000000 + 2000000000")
-        .testIfErrorContains("integer overflow", "1234567890 * 987654321")
-        .testIfErrorContains("integer overflow", "- 2000000000 - 2000000000")
-
-        // literal 2147483648 is not allowed, so we compute it
-        .setUp("minint = - 2147483647 - 1")
-        .testIfErrorContains("integer overflow", "-minint");
-  }
-
-  @Test
-  public void testOperatorPrecedence() throws Exception {
-    ev.new Scenario()
-        .testExpression("2 + 3 * 4", 14)
-        .testExpression("2 + 3 // 4", 2)
-        .testExpression("2 * 3 + 4 // -2", 4);
-  }
-
-  @Test
-  public void testConcatStrings() throws Exception {
-    ev.new Scenario().testExpression("'foo' + 'bar'", "foobar");
-  }
-
-  @Test
-  public void testConcatLists() throws Exception {
-    ev.new Scenario()
-        .testExactOrder("[1,2] + [3,4]", 1, 2, 3, 4)
-        .testExactOrder("(1,2)", 1, 2)
-        .testExactOrder("(1,2) + (3,4)", 1, 2, 3, 4);
-
-    // TODO(fwe): cannot be handled by current testing suite
-    // list
-    Object x = ev.eval("[1,2] + [3,4]");
-    assertThat((Iterable<?>) x).containsExactly(1, 2, 3, 4).inOrder();
-    assertThat(x).isInstanceOf(StarlarkList.class);
-    assertThat(Starlark.isImmutable(x)).isFalse();
-
-    // tuple
-    x = ev.eval("(1,2) + (3,4)");
-    assertThat((Iterable<?>) x).containsExactly(1, 2, 3, 4).inOrder();
-    assertThat(x).isInstanceOf(Tuple.class);
-    assertThat(x).isEqualTo(Tuple.of(1, 2, 3, 4));
-    assertThat(Starlark.isImmutable(x)).isTrue();
-
-    ev.checkEvalError("unsupported binary operation: tuple + list", "(1,2) + [3,4]");
-  }
-
-  @Test
-  public void testListComprehensions() throws Exception {
-    ev.new Scenario()
-        .testExactOrder("['foo/%s.java' % x for x in []]")
-        .testExactOrder(
-            "['foo/%s.java' % y for y in ['bar', 'wiz', 'quux']]",
-            "foo/bar.java", "foo/wiz.java", "foo/quux.java")
-        .testExactOrder(
-            "['%s/%s.java' % (z, t) for z in ['foo', 'bar'] " + "for t in ['baz', 'wiz', 'quux']]",
-            "foo/baz.java",
-            "foo/wiz.java",
-            "foo/quux.java",
-            "bar/baz.java",
-            "bar/wiz.java",
-            "bar/quux.java")
-        .testExactOrder(
-            "['%s/%s.java' % (b, b) for a in ['foo', 'bar'] " + "for b in ['baz', 'wiz', 'quux']]",
-            "baz/baz.java",
-            "wiz/wiz.java",
-            "quux/quux.java",
-            "baz/baz.java",
-            "wiz/wiz.java",
-            "quux/quux.java")
-        .testExactOrder(
-            "['%s/%s.%s' % (c, d, e) for c in ['foo', 'bar'] "
-                + "for d in ['baz', 'wiz', 'quux'] for e in ['java', 'cc']]",
-            "foo/baz.java",
-            "foo/baz.cc",
-            "foo/wiz.java",
-            "foo/wiz.cc",
-            "foo/quux.java",
-            "foo/quux.cc",
-            "bar/baz.java",
-            "bar/baz.cc",
-            "bar/wiz.java",
-            "bar/wiz.cc",
-            "bar/quux.java",
-            "bar/quux.cc")
-        .testExactOrder("[i for i in (1, 2)]", 1, 2)
-        .testExactOrder("[i for i in [2, 3] or [1, 2]]", 2, 3);
-  }
-
-  @Test
-  public void testNestedListComprehensions() throws Exception {
-    ev.new Scenario()
-        .setUp("li = [[1, 2], [3, 4]]")
-        .testExactOrder("[j for i in li for j in i]", 1, 2, 3, 4);
-    ev.new Scenario()
-        .setUp("input = [['abc'], ['def', 'ghi']]\n")
-        .testExactOrder(
-            "['%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");
-  }
-
-  @Test
-  public void testListComprehensionsMultipleVariables() throws Exception {
-    ev.new Scenario()
-        .testEval("[x + y for x, y in [(1, 2), (3, 4)]]", "[3, 7]")
-        .testEval("[z + t for (z, t) in [[1, 2], [3, 4]]]", "[3, 7]");
-  }
-
-  @Test
-  public void testSequenceAssignment() throws Exception {
-    // Assignment to empty list/tuple is permitted.
-    // See https://github.com/bazelbuild/starlark/issues/93 for discussion.
-    ev.exec("() = ()");
-    ev.exec("[] = ()");
-
-    // RHS not iterable
-    ev.checkEvalError(
-        "got 'int' in sequence assignment", //
-        "x, y = 1");
-    ev.checkEvalError(
-        "got 'int' in sequence assignment", //
-        "(x,) = 1");
-    ev.checkEvalError(
-        "got 'int' in sequence assignment", //
-        "[x] = 1");
-
-    // too few
-    ev.checkEvalError(
-        "too few values to unpack (got 0, want 2)", //
-        "x, y = ()");
-    ev.checkEvalError(
-        "too few values to unpack (got 0, want 2)", //
-        "[x, y] = ()");
-
-    // just right
-    ev.exec("x, y = 1, 2");
-    ev.exec("[x, y] = 1, 2");
-    ev.exec("(x,) = [1]");
-
-    // too many
-    ev.checkEvalError(
-        "got 'int' in sequence assignment", //
-        "() = 1");
-    ev.checkEvalError(
-        "too many values to unpack (got 1, want 0)", //
-        "() = (1,)");
-    ev.checkEvalError(
-        "too many values to unpack (got 3, want 2)", //
-        "x, y = 1, 2, 3");
-    ev.checkEvalError(
-        "too many values to unpack (got 3, want 2)", //
-        "[x, y] = 1, 2, 3");
-  }
-
-  @Test
-  public void testListComprehensionsMultipleVariablesFail() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "too few values to unpack (got 2, want 3)", //
-            "[x + y for x, y, z in [(1, 2), (3, 4)]]")
-        .testIfExactError(
-            "got 'int' in sequence assignment", //
-            "[x + y for x, y in (1, 2)]");
-
-    ev.new Scenario()
-        .testIfErrorContains(
-            "too few values to unpack (got 2, want 3)", //
-            "def foo (): return [x + y for x, y, z in [(1, 2), (3, 4)]]",
-            "foo()");
-
-    ev.new Scenario()
-        .testIfErrorContains(
-            "got 'int' in sequence assignment", //
-            "def bar (): return [x + y for x, y in (1, 2)]",
-            "bar()");
-
-    ev.new Scenario()
-        .testIfErrorContains(
-            "too few values to unpack (got 2, want 3)", //
-            "[x + y for x, y, z in [(1, 2), (3, 4)]]");
-
-    ev.new Scenario()
-        .testIfErrorContains(
-            "got 'int' in sequence assignment", //
-            "[x2 + y2 for x2, y2 in (1, 2)]");
-
-    // Assignment to empty tuple is permitted.
-    // See https://github.com/bazelbuild/starlark/issues/93 for discussion.
-    ev.new Scenario().testEval("[1 for [] in [(), []]]", "[1, 1]");
-  }
-
-  @Test
-  public void testListComprehensionsWithFiltering() throws Exception {
-    ev.new Scenario()
-        .setUp("range3 = [0, 1, 2]")
-        .testEval("[a for a in (4, None, 2, None, 1) if a != None]", "[4, 2, 1]")
-        .testEval("[b+c for b in [0, 1, 2] for c in [0, 1, 2] if b + c > 2]", "[3, 3, 4]")
-        .testEval("[d+e for d in range3 if d % 2 == 1 for e in range3]", "[1, 2, 3]")
-        .testEval(
-            "[[f,g] for f in [0, 1, 2, 3, 4] if f for g in [5, 6, 7, 8] if f * g % 12 == 0 ]",
-            "[[2, 6], [3, 8], [4, 6]]")
-        .testEval("[h for h in [4, 2, 0, 1] if h]", "[4, 2, 1]");
-  }
-
-  @Test
-  public void testListComprehensionDefinitionOrder() throws Exception {
-    // This exercises the .bzl file behavior. This is a dynamic error.
-    // (The error message for BUILD files is slightly different (no "local")
-    // because it doesn't record the scope in the syntax tree.)
-    ev.new Scenario()
-        .testIfErrorContains(
-            "local variable 'y' is referenced before assignment", //
-            "[x for x in (1, 2) if y for y in (3, 4)]");
-
-    // This is the corresponding test for BUILD files.
-    EvalException ex =
-        assertThrows(
-            EvalException.class, () -> execBUILD("[x for x in (1, 2) if y for y in (3, 4)]"));
-    assertThat(ex).hasMessageThat().isEqualTo("variable 'y' is referenced before assignment");
-  }
-
-  private static void execBUILD(String... lines)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    ParserInput input = ParserInput.fromLines(lines);
-    FileOptions options = FileOptions.builder().recordScope(false).build();
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFile(input, options, Module.create(), thread);
-    }
-  }
-
-  @Test
-  public void testTupleDestructuring() throws Exception {
-    ev.new Scenario()
-        .setUp("a, b = 1, 2")
-        .testLookup("a", 1)
-        .testLookup("b", 2)
-        .setUp("c, d = {'key1':2, 'key2':3}")
-        .testLookup("c", "key1")
-        .testLookup("d", "key2");
-  }
-
-  @Test
-  public void testSingleTuple() throws Exception {
-    ev.new Scenario().setUp("(a,) = [1]").testLookup("a", 1);
-  }
-
-  @Test
-  public void testHeterogeneousDict() throws Exception {
-    ev.new Scenario()
-        .setUp("d = {'str': 1, 2: 3}", "a = d['str']", "b = d[2]")
-        .testLookup("a", 1)
-        .testLookup("b", 3);
-  }
-
-  @Test
-  public void testAccessDictWithATupleKey() throws Exception {
-    ev.new Scenario().setUp("x = {(1, 2): 3}[1, 2]").testLookup("x", 3);
-  }
-
-  @Test
-  public void testDictWithDuplicatedKey() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "Duplicated key \"str\" when creating dictionary", "{'str': 1, 'x': 2, 'str': 3}");
-  }
-
-  @Test
-  public void testRecursiveTupleDestructuring() throws Exception {
-    ev.new Scenario()
-        .setUp("((a, b), (c, d)) = [(1, 2), (3, 4)]")
-        .testLookup("a", 1)
-        .testLookup("b", 2)
-        .testLookup("c", 3)
-        .testLookup("d", 4);
-  }
-
-  @Test
-  public void testListComprehensionAtTopLevel() throws Exception {
-    // It is allowed to have a loop variable with the same name as a global variable.
-    ev.new Scenario()
-        .update("x", 42)
-        .setUp("y = [x + 1 for x in [1,2,3]]")
-        .testExactOrder("y", 2, 3, 4);
-  }
-
-  @Test
-  public void testDictComprehensions() throws Exception {
-    ev.new Scenario()
-        .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"))
-        .testExpression("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
-  }
-
-  @Test
-  public void testDictComprehensionOnNonIterable() throws Exception {
-    ev.new Scenario().testIfExactError("type 'int' is not iterable", "{k : k for k in 3}");
-  }
-
-  @Test
-  public void testDictComprehension_manyClauses() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .testExpression("[1, 2] + [3, 4]", StarlarkList.of(null, 1, 2, 3, 4))
-        .testExpression("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
-        .testIfExactError("unsupported binary operation: list + tuple", "[1, 2] + (3, 4)")
-        .testIfExactError("unsupported binary operation: tuple + list", "(1, 2) + [3, 4]");
-  }
-
-  @Test
-  public void testListMultiply() throws Exception {
-    Mutability mu = Mutability.create("test");
-    ev.new Scenario()
-        .testExpression("[1, 2, 3] * 1", StarlarkList.of(mu, 1, 2, 3))
-        .testExpression("[1, 2] * 2", StarlarkList.of(mu, 1, 2, 1, 2))
-        .testExpression("[1, 2] * 3", StarlarkList.of(mu, 1, 2, 1, 2, 1, 2))
-        .testExpression("[1, 2] * 4", StarlarkList.of(mu, 1, 2, 1, 2, 1, 2, 1, 2))
-        .testExpression("[8] * 5", StarlarkList.of(mu, 8, 8, 8, 8, 8))
-        .testExpression("[    ] * 10", StarlarkList.empty())
-        .testExpression("[1, 2] * 0", StarlarkList.empty())
-        .testExpression("[1, 2] * -4", StarlarkList.empty())
-        .testExpression("2 * [1, 2]", StarlarkList.of(mu, 1, 2, 1, 2))
-        .testExpression("10 * []", StarlarkList.empty())
-        .testExpression("0 * [1, 2]", StarlarkList.empty())
-        .testExpression("-4 * [1, 2]", StarlarkList.empty());
-  }
-
-  @Test
-  public void testTupleMultiply() throws Exception {
-    ev.new Scenario()
-        .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());
-  }
-
-  @Test
-  public void testListComprehensionFailsOnNonSequence() throws Exception {
-    ev.new Scenario().testIfErrorContains("type 'int' is not iterable", "[x + 1 for x in 123]");
-  }
-
-  @Test
-  public void testListComprehensionOnStringIsForbidden() throws Exception {
-    ev.new Scenario().testIfErrorContains("type 'string' is not iterable", "[x for x in 'abc']");
-  }
-
-  @Test
-  public void testInvalidAssignment() throws Exception {
-    ev.new Scenario().testIfErrorContains("cannot assign to 'x + 1'", "x + 1 = 2");
-  }
-
-  @Test
-  public void testListComprehensionOnDictionary() throws Exception {
-    ev.new Scenario().testExactOrder("['var_' + n for n in {'a':1,'b':2}]", "var_a", "var_b");
-  }
-
-  @Test
-  public void testListComprehensionOnDictionaryCompositeExpression() throws Exception {
-    ev.new Scenario()
-        .setUp("d = {1:'a',2:'b'}", "l = [d[x] for x in d]")
-        .testLookup("l", StarlarkList.of(null, "a", "b"));
-  }
-
-  @Test
-  public void testListComprehensionUpdate() throws Exception {
-    ev.new Scenario()
-        .setUp("xs = [1, 2, 3]")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration",
-            "[xs.append(4) for x in xs]");
-  }
-
-  @Test
-  public void testNestedListComprehensionUpdate() throws Exception {
-    ev.new Scenario()
-        .setUp("xs = [1, 2, 3]")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration",
-            "[xs.append(4) for x in xs for y in xs]");
-  }
-
-  @Test
-  public void testListComprehensionUpdateInClause() throws Exception {
-    ev.new Scenario()
-        .setUp("xs = [1, 2, 3]")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration",
-            // Use short-circuiting to produce valid output in the event
-            // the exception is not raised.
-            "[y for x in xs for y in (xs.append(4) or xs)]");
-  }
-
-  @Test
-  public void testDictComprehensionUpdate() throws Exception {
-    ev.new Scenario()
-        .setUp("xs = {1:1, 2:2, 3:3}")
-        .testIfErrorContains(
-            "dict value is temporarily immutable due to active for-loop iteration",
-            "[xs.popitem() for x in xs]");
-  }
-
-  @Test
-  public void testListComprehensionScope() throws Exception {
-    // Test list comprehension creates a scope, so outer variables kept unchanged
-    ev.new Scenario()
-        .setUp("x = 1", "l = [x * 3 for x in [2]]", "y = x")
-        .testEval("y", "1")
-        .testEval("l", "[6]");
-  }
-
-  @Test
-  public void testInOperator() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .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
-  public void testInFail() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "'in <string>' requires string as left operand, not 'int'", "1 in '123'")
-        .testIfErrorContains("unsupported binary operation: string in int", "'a' in 1");
-  }
-
-  @Test
-  public void testInCompositeForPrecedence() throws Exception {
-    ev.new Scenario().testExpression("not 'a' in ['a'] or 0", 0);
-  }
-
-  private static StarlarkValue createObjWithStr() {
-    return new StarlarkValue() {
-      @Override
-      public void repr(Printer printer) {
-        printer.append("<str marker>");
-      }
-    };
-  }
-
-  @Test
-  public void testPercentOnObjWithStr() throws Exception {
-    ev.new Scenario()
-        .update("obj", createObjWithStr())
-        .testExpression("'%s' % obj", "<str marker>");
-  }
-
-  private static class Dummy implements StarlarkValue {}
-
-  @Test
-  public void testStringRepresentationsOfArbitraryObjects() throws Exception {
-    String dummy = "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>";
-    ev.new Scenario()
-        .update("dummy", new Dummy())
-        .testExpression("str(dummy)", dummy)
-        .testExpression("repr(dummy)", dummy)
-        .testExpression("'{}'.format(dummy)", dummy)
-        .testExpression("'%s' % dummy", dummy)
-        .testExpression("'%r' % dummy", dummy);
-  }
-
-  @Test
-  public void testPercentOnTupleOfDummyValues() throws Exception {
-    ev.new Scenario()
-        .update("obj", createObjWithStr())
-        .testExpression("'%s %s' % (obj, obj)", "<str marker> <str marker>");
-    ev.new Scenario()
-        .update("unknown", new Dummy())
-        .testExpression(
-            "'%s %s' % (unknown, unknown)",
-            "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy> <unknown"
-                + " object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>");
-  }
-
-  @Test
-  public void testPercOnObjectInvalidFormat() throws Exception {
-    ev.new Scenario()
-        .update("obj", createObjWithStr())
-        .testIfExactError("invalid argument <str marker> for format pattern %d", "'%d' % obj");
-  }
-
-  @Test
-  public void testDictKeys() throws Exception {
-    ev.new Scenario().testExactOrder("{'a': 1}.keys() + ['b', 'c']", "a", "b", "c");
-  }
-
-  @Test
-  public void testDictKeysTooManyArgs() throws Exception {
-    ev.new Scenario()
-        .testIfExactError("keys() got unexpected positional argument", "{'a': 1}.keys('abc')");
-  }
-
-  @Test
-  public void testDictKeysTooManyKeyArgs() throws Exception {
-    ev.new Scenario()
-        .testIfExactError(
-            "keys() got unexpected keyword argument 'arg'", "{'a': 1}.keys(arg='abc')");
-  }
-
-  @Test
-  public void testDictKeysDuplicateKeyArgs() throws Exception {
-    // f(a=1, a=2) is caught statically by the resolver.
-    ev.new Scenario()
-        .testIfExactError(
-            "int() got multiple values for argument 'base'", "int('1', base=10, **dict(base=16))");
-  }
-
-  @Test
-  public void testArgBothPosKey() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "int() got multiple values for argument 'base'", "int('2', 3, base=3)");
-  }
-
-  @Test
-  public void testStaticNameResolution() throws Exception {
-    ev.new Scenario().testIfErrorContains("name 'foo' is not defined", "[foo for x in []]");
-  }
-
-  @Test
-  public void testExec() throws Exception {
-    ParserInput input =
-        ParserInput.fromLines(
-            "# a file in the build language",
-            "",
-            "x = [1, 2, 'foo', 4] + [1, 2, \"%s%d\" % ('foo', 1)]");
-    Module module = Module.create();
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
-    }
-    assertThat(module.getGlobal("x"))
-        .isEqualTo(StarlarkList.of(/*mutability=*/ null, 1, 2, "foo", 4, 1, 2, "foo1"));
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java
deleted file mode 100644
index c530f3f..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTestCase.java
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.LinkedList;
-import java.util.List;
-
-/** Helper class for tests that evaluate Starlark code. */
-// TODO(adonovan): simplify this class out of existence.
-// Most of its callers should be using the script-based test harness in net.starlark.java.eval.
-// TODO(adonovan): extended only by StarlarkFlagGuardingTest; specialize that one test instead.
-class EvaluationTestCase {
-
-  private StarlarkSemantics semantics = StarlarkSemantics.DEFAULT;
-  private StarlarkThread thread = null; // created lazily by getStarlarkThread
-  private Module module = null; // created lazily by getModule
-
-  /**
-   * Updates the semantics used to filter predeclared bindings, and carried by subsequently created
-   * threads. Causes a new StarlarkThread and Module to be created when next needed.
-   */
-  private final void setSemantics(StarlarkSemantics semantics) {
-    this.semantics = semantics;
-
-    // Re-initialize the thread and module with the new semantics when needed.
-    this.thread = null;
-    this.module = null;
-  }
-
-  // TODO(adonovan): don't let subclasses inherit vaguely specified "helpers".
-  // Separate all the tests clearly into tests of the scanner, parser, resolver,
-  // and evaluation.
-
-  /** Updates a global binding in the module. */
-  // TODO(adonovan): rename setGlobal.
-  final EvaluationTestCase update(String varname, Object value) throws Exception {
-    getModule().setGlobal(varname, value);
-    return this;
-  }
-
-  /** Returns the value of a global binding in the module. */
-  // TODO(adonovan): rename getGlobal.
-  final Object lookup(String varname) throws Exception {
-    return getModule().getGlobal(varname);
-  }
-
-  /** Joins the lines, parses them as an expression, and evaluates it. */
-  final Object eval(String... lines) throws Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    return Starlark.eval(input, FileOptions.DEFAULT, getModule(), getStarlarkThread());
-  }
-
-  /** Joins the lines, parses them as a file, and executes it. */
-  final void exec(String... lines)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    ParserInput input = ParserInput.fromLines(lines);
-    Starlark.execFile(input, FileOptions.DEFAULT, getModule(), getStarlarkThread());
-  }
-
-  // A hook for subclasses to alter the created module.
-  // Implementations may add to the predeclared environment,
-  // and return the module's client data value.
-  // TODO(adonovan): only used in StarlarkFlagGuardingTest; move there.
-  protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
-    return null; // no client data
-  }
-
-  private StarlarkThread getStarlarkThread() {
-    if (this.thread == null) {
-      Mutability mu = Mutability.create("test");
-      this.thread = new StarlarkThread(mu, semantics);
-    }
-    return this.thread;
-  }
-
-  private Module getModule() {
-    if (this.module == null) {
-      ImmutableMap.Builder<String, Object> predeclared = ImmutableMap.builder();
-      newModuleHook(predeclared); // see StarlarkFlagGuardingTest
-      this.module = Module.withPredeclared(semantics, predeclared.build());
-    }
-    return this.module;
-  }
-
-  final void checkEvalError(String msg, String... input) throws Exception {
-    try {
-      exec(input);
-      fail("Expected error '" + msg + "' but got no error");
-    } catch (SyntaxError.Exception | EvalException e) {
-      assertThat(e).hasMessageThat().isEqualTo(msg);
-    }
-  }
-
-  final void checkEvalErrorContains(String msg, String... input) throws Exception {
-    try {
-      exec(input);
-      fail("Expected error containing '" + msg + "' but got no error");
-    } catch (SyntaxError.Exception | EvalException e) {
-      assertThat(e).hasMessageThat().contains(msg);
-    }
-  }
-
-  final void checkEvalErrorDoesNotContain(String msg, String... input) throws Exception {
-    try {
-      exec(input);
-    } catch (SyntaxError.Exception | EvalException e) {
-      assertThat(e).hasMessageThat().doesNotContain(msg);
-    }
-  }
-
-  /** Encapsulates a separate test which can be executed by a Scenario. */
-  private interface Testable {
-    void run() throws Exception;
-  }
-
-  /**
-   * A test scenario (a script of steps). Beware: Scenario is an inner class that mutates its
-   * enclosing EvaluationTestCase as it executes the script.
-   */
-  final class Scenario {
-    private final SetupActions setup = new SetupActions();
-    private final StarlarkSemantics semantics;
-
-    Scenario() {
-      this(StarlarkSemantics.DEFAULT);
-    }
-
-    Scenario(StarlarkSemantics semantics) {
-      this.semantics = semantics;
-    }
-
-    private void run(Testable testable) throws Exception {
-      EvaluationTestCase.this.setSemantics(semantics);
-      testable.run();
-    }
-
-    /** Allows the execution of several statements before each following test. */
-    Scenario setUp(String... lines) {
-      setup.registerExec(lines);
-      return this;
-    }
-
-    /**
-     * Allows the update of the specified variable before each following test
-     *
-     * @param name The name of the variable that should be updated
-     * @param value The new value of the variable
-     * @return This {@code Scenario}
-     */
-    Scenario update(String name, Object value) {
-      setup.registerUpdate(name, value);
-      return this;
-    }
-
-    /**
-     * 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 Scenario}
-     * @throws Exception
-     */
-    Scenario testEval(String src, String expectedEvalString) throws Exception {
-      runTest(createComparisonTestable(src, expectedEvalString, true));
-      return this;
-    }
-
-    /** Evaluates an expression and compares its result to the expected object. */
-    Scenario testExpression(String src, Object expected) throws Exception {
-      runTest(createComparisonTestable(src, expected, false));
-      return this;
-    }
-
-    /** Evaluates an expression and compares its result to the ordered list of expected objects. */
-    Scenario testExactOrder(String src, Object... items) throws Exception {
-      runTest(collectionTestable(src, items));
-      return this;
-    }
-
-    /** Evaluates an expression and checks whether it fails with the expected error. */
-    Scenario testIfExactError(String expectedError, String... lines) throws Exception {
-      runTest(errorTestable(true, expectedError, lines));
-      return this;
-    }
-
-    /** Evaluates the expresson and checks whether it fails with the expected error. */
-    Scenario testIfErrorContains(String expectedError, String... lines) throws Exception {
-      runTest(errorTestable(false, expectedError, lines));
-      return this;
-    }
-
-    /** Looks up the value of the specified variable and compares it to the expected value. */
-    Scenario testLookup(String name, Object expected) throws Exception {
-      runTest(createLookUpTestable(name, expected));
-      return this;
-    }
-
-    /**
-     * 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.
-     */
-    private Testable errorTestable(
-        final boolean exactMatch, final String error, final String... lines) {
-      return new Testable() {
-        @Override
-        public void run() throws Exception {
-          if (exactMatch) {
-            checkEvalError(error, lines);
-          } else {
-            checkEvalErrorContains(error, lines);
-          }
-        }
-      };
-    }
-
-    /**
-     * Creates a Testable that checks whether the value of the expression is a sequence containing
-     * the expected elements.
-     */
-    private Testable collectionTestable(final String src, final Object... expected) {
-      return new Testable() {
-        @Override
-        public void run() throws Exception {
-          assertThat((Iterable<?>) eval(src)).containsExactly(expected).inOrder();
-        }
-      };
-    }
-
-    /**
-     * Creates a testable that compares the value of the expression to a specified result.
-     *
-     * @param src The expression to be evaluated
-     * @param expected Either the expected object or an expression whose evaluation leads to the
-     *     expected object
-     * @param expectedIsExpression Signals whether {@code expected} is an object or an expression
-     * @return An instance of Testable that runs the comparison
-     */
-    private Testable createComparisonTestable(
-        final String src, final Object expected, final boolean expectedIsExpression) {
-      return new Testable() {
-        @Override
-        public void run() throws Exception {
-          Object actual = eval(src);
-          Object realExpected = expected;
-
-          // We could also print the actual object and compare the string to the expected
-          // expression, but then the order of elements would matter.
-          if (expectedIsExpression) {
-            realExpected = eval((String) expected);
-          }
-
-          assertThat(actual).isEqualTo(realExpected);
-        }
-      };
-    }
-
-    /**
-     * Creates a Testable that looks up the given variable and compares its value to the expected
-     * value
-     *
-     * @param name
-     * @param expected
-     * @return An instance of Testable that does both lookup and comparison
-     */
-    private Testable createLookUpTestable(final String name, final Object expected) {
-      return new Testable() {
-        @Override
-        public void run() throws Exception {
-          assertThat(lookup(name)).isEqualTo(expected);
-        }
-      };
-    }
-
-    /**
-     * Executes the given Testable
-     * @param testable
-     * @throws Exception
-     */
-    protected void runTest(Testable testable) throws Exception {
-      run(new TestableDecorator(setup, testable));
-    }
-  }
-
-  /**
-   * A simple decorator that allows the execution of setup actions before running a {@code Testable}
-   */
-  static final class TestableDecorator implements Testable {
-    private final SetupActions setup;
-    private final Testable decorated;
-
-    TestableDecorator(SetupActions setup, Testable decorated) {
-      this.setup = setup;
-      this.decorated = decorated;
-    }
-
-    /**
-     * Executes all stored actions and updates plus the actual {@code Testable}
-     */
-    @Override
-    public void run() throws Exception {
-      setup.executeAll();
-      decorated.run();
-    }
-  }
-
-  /** A container for collection actions that should be executed before a test */
-  private final class SetupActions {
-    private List<Testable> setup;
-
-    SetupActions() {
-      setup = new LinkedList<>();
-    }
-
-    /**
-     * Registers an update to a module variable to be bound before a test
-     *
-     * @param name
-     * @param value
-     */
-    void registerUpdate(final String name, final Object value) {
-      setup.add(
-          new Testable() {
-            @Override
-            public void run() throws Exception {
-              EvaluationTestCase.this.update(name, value);
-            }
-          });
-    }
-
-    /** Registers a sequence of statements for execution prior to a test. */
-    void registerExec(final String... lines) {
-      setup.add(
-          new Testable() {
-            @Override
-            public void run() throws Exception {
-              EvaluationTestCase.this.exec(lines);
-            }
-          });
-    }
-
-    /**
-     * Executes all stored actions and updates
-     *
-     * @throws Exception
-     */
-    void executeAll() throws Exception {
-      for (Testable testable : setup) {
-        testable.run();
-      }
-    }
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/Examples.java b/src/test/java/com/google/devtools/build/lib/syntax/Examples.java
deleted file mode 100644
index e64d519..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/Examples.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import java.io.IOException;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkGlobalLibrary;
-import net.starlark.java.annot.StarlarkMethod;
-
-/**
- * Examples of typical API usage of the Starlark interpreter.<br>
- * This is not a test, but it is checked by the compiler.
- */
-final class Examples {
-
-  /**
-   * This example reads, parses, compiles, and executes a Starlark file. It returns the module,
-   * which holds the values of global variables.
-   */
-  Module execFile(String filename)
-      throws IOException, SyntaxError.Exception, EvalException, InterruptedException {
-    // Read input from the named file.
-    ParserInput input = ParserInput.readFile(filename);
-
-    // Create the module that will be populated by executing the file.
-    // It holds the global variables, initially empty.
-    // Its predeclared environment defines only the standard builtins:
-    // None, True, len, and so on.
-    Module module = Module.create();
-
-    // Resolve, compile, and execute the file.
-    //
-    // The Mutability will be associated with all the values created by this thread.
-    // The try-with-resources statement ensures that all values become frozen
-    // after execution.
-    try (Mutability mu = Mutability.create(input.getFile())) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
-    }
-
-    return module;
-  }
-
-  /**
-   * This example evaluates a Starlark expression in the specified environment and returns its
-   * value.
-   */
-  Object evalExpr(String expr, ImmutableMap<String, Object> env)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    // The apparent file name (for error messages) will be "<expr>".
-    ParserInput input = ParserInput.fromString(expr, "<expr>");
-
-    // Create the module in which the expression is evaluated.
-    // It may define additional predeclared environment bindings.
-    Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, env);
-
-    // Resolve, compile, and execute the expression.
-    try (Mutability mu = Mutability.create(input.getFile())) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      return Starlark.eval(input, FileOptions.DEFAULT, module, thread);
-    }
-  }
-
-  /**
-   * This advanced example reads, parses, and compiles a Starlark file to a Program, then later
-   * executes it.
-   */
-  Module compileThenExecute()
-      throws IOException, SyntaxError.Exception, EvalException, InterruptedException {
-    // Read and parse the named file.
-    ParserInput input = ParserInput.readFile("my/file.star");
-    StarlarkFile file = StarlarkFile.parse(input);
-
-    // Compile the program, with additional predeclared environment bindings.
-    Program prog = Program.compileFile(file, () -> ImmutableSet.of("zero", "square"));
-
-    // . . .
-
-    // TODO(adonovan): when supported, show how the compiled program can be
-    // saved and reloaded, to avoid repeating the cost of parsing and
-    // compilation.
-
-    // Execute the compiled program to populate a module.
-    // The module's predeclared environment must match the
-    // names provided during compilation.
-    Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, makeEnvironment());
-    try (Mutability mu = Mutability.create(prog.getFilename())) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFileProgram(prog, module, thread);
-    }
-    return module;
-  }
-
-  /** This function shows how to construct a callable Starlark value from a Java method. */
-  ImmutableMap<String, Object> makeEnvironment() {
-    ImmutableMap.Builder<String, Object> env = ImmutableMap.builder();
-    env.put("zero", 0);
-    Starlark.addMethods(env, new MyFunctions(), StarlarkSemantics.DEFAULT); // adds 'square'
-    return env.build();
-  }
-
-  /** The methods of this class are accessible from Starlark. */
-  @StarlarkGlobalLibrary
-  static final class MyFunctions {
-    @StarlarkMethod(
-        name = "square",
-        parameters = {@Param(name = "x", type = int.class)},
-        doc = "Returns the square of its integer argument.")
-    public int square(int x) {
-      return x * x;
-    }
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java
deleted file mode 100644
index a129e21..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/FileLocationsTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2006 The Bazel Authors.  All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link FileLocations}. */
-// TODO(adonovan): express this test in terms of the public API.
-@RunWith(JUnit4.class)
-public class FileLocationsTest {
-
-  private static FileLocations create(String buffer) {
-    return FileLocations.create(buffer.toCharArray(), "/fake/file");
-  }
-
-  // Asserts that the specified offset results in a line/column pair of the form "1:2".
-  private static void checkOffset(FileLocations table, int offset, String wantLineCol) {
-    Location loc = table.getLocation(offset);
-    String got = String.format("%d:%d", loc.line(), loc.column());
-    if (!got.equals(wantLineCol)) {
-      throw new AssertionError(
-          String.format("location(%d) = %s, want %s", offset, got, wantLineCol));
-    }
-  }
-
-  @Test
-  public void testEmpty() {
-    FileLocations table = create("");
-    checkOffset(table, 0, "1:1");
-  }
-
-  @Test
-  public void testNewline() {
-    FileLocations table = create("\n");
-    checkOffset(table, 0, "1:1");
-    checkOffset(table, 1, "2:1"); // EOF
-  }
-
-  @Test
-  public void testOneLiner() {
-    FileLocations table = create("foo");
-    checkOffset(table, 0, "1:1");
-    checkOffset(table, 1, "1:2");
-    checkOffset(table, 2, "1:3");
-    checkOffset(table, 3, "1:4"); // EOF
-  }
-
-  @Test
-  public void testMultiLiner() {
-    FileLocations table = create("\ntwo\nthree\n\nfive\n");
-
-    // \n
-    checkOffset(table, 0, "1:1");
-
-    // two\n
-    checkOffset(table, 1, "2:1");
-    checkOffset(table, 2, "2:2");
-    checkOffset(table, 3, "2:3");
-    checkOffset(table, 4, "2:4");
-
-    // three\n
-    checkOffset(table, 5, "3:1");
-    checkOffset(table, 10, "3:6");
-
-    // \n
-    checkOffset(table, 11, "4:1");
-
-    // five\n
-    checkOffset(table, 12, "5:1");
-    checkOffset(table, 16, "5:5");
-
-    // start of final empty line
-    checkOffset(table, 17, "6:1"); // EOF
-  }
-}
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
deleted file mode 100644
index d89e600..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ /dev/null
@@ -1,571 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test class for functions and scoping. */
-@RunWith(JUnit4.class)
-public final class FunctionTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  @Test
-  public void testDef() throws Exception {
-    ev.exec("def f(a, b=1, *args, c, d=2, **kwargs): pass");
-    StarlarkFunction f = (StarlarkFunction) ev.lookup("f");
-    assertThat(f).isNotNull();
-    assertThat(f.getName()).isEqualTo("f");
-    assertThat(f.getParameterNames())
-        .containsExactly("a", "b", "c", "d", "args", "kwargs")
-        .inOrder();
-    assertThat(f.hasVarargs()).isTrue();
-    assertThat(f.hasKwargs()).isTrue();
-    assertThat(getDefaults(f)).containsExactly(null, 1, null, 2, null, null).inOrder();
-
-    // same, sans varargs
-    ev.exec("def g(a, b=1, *, c, d=2, **kwargs): pass");
-    StarlarkFunction g = (StarlarkFunction) ev.lookup("g");
-    assertThat(g.getParameterNames()).containsExactly("a", "b", "c", "d", "kwargs").inOrder();
-    assertThat(g.hasVarargs()).isFalse();
-    assertThat(g.hasKwargs()).isTrue();
-    assertThat(getDefaults(g)).containsExactly(null, 1, null, 2, null).inOrder();
-  }
-
-  private static List<Object> getDefaults(StarlarkFunction fn) {
-    List<Object> defaults = new ArrayList<>();
-    for (int i = 0; i < fn.getParameterNames().size(); i++) {
-      defaults.add(fn.getDefaultValue(i));
-    }
-    return defaults;
-  }
-
-  @Test
-  public void testFunctionDefCallOuterFunc() throws Exception {
-    List<Object> params = new ArrayList<>();
-    createOuterFunction(params);
-    ev.exec(
-        "def func(a):", //
-        "  outer_func(a)",
-        "func(1)",
-        "func(2)");
-    assertThat(params).containsExactly(1, 2).inOrder();
-  }
-
-  private void createOuterFunction(final List<Object> params) throws Exception {
-    StarlarkCallable outerFunc =
-        new StarlarkCallable() {
-          @Override
-          public String getName() {
-            return "outer_func";
-          }
-
-          @Override
-          public NoneType call(
-              StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
-              throws EvalException {
-            params.addAll(args);
-            return Starlark.NONE;
-          }
-        };
-    ev.update("outer_func", outerFunc);
-  }
-
-  @Test
-  public void testFunctionDefNoEffectOutsideScope() throws Exception {
-    ev.update("a", 1);
-    ev.exec(
-        "def func():", //
-        "  a = 2",
-        "func()\n");
-    assertThat(ev.lookup("a")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionDefGlobalVaribleReadInFunction() throws Exception {
-    ev.exec(
-        "a = 1", //
-        "def func():",
-        "  b = a",
-        "  return b",
-        "c = func()\n");
-    assertThat(ev.lookup("c")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionDefLocalGlobalScope() throws Exception {
-    ev.exec(
-        "a = 1", //
-        "def func():",
-        "  a = 2",
-        "  b = a",
-        "  return b",
-        "c = func()\n");
-    assertThat(ev.lookup("c")).isEqualTo(2);
-  }
-
-  @Test
-  public void testFunctionDefLocalVariableReferencedBeforeAssignment() throws Exception {
-    ev.checkEvalErrorContains(
-        "local variable 'a' is referenced before assignment.",
-        "a = 1",
-        "def func():",
-        "  b = a",
-        "  a = 2",
-        "  return b",
-        "c = func()\n");
-  }
-
-  @Test
-  public void testFunctionDefLocalVariableReferencedInCallBeforeAssignment() throws Exception {
-    ev.checkEvalErrorContains(
-        "local variable 'a' is referenced before assignment.",
-        "def dummy(x):",
-        "  pass",
-        "a = 1",
-        "def func():",
-        "  dummy(a)",
-        "  a = 2",
-        "func()\n");
-  }
-
-  @Test
-  public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception {
-    ev.exec(
-        "a = 1", //
-        "def func():",
-        "  a = 2",
-        "  b = a",
-        "  a = 3",
-        "  return b",
-        "c = func()\n");
-    assertThat(ev.lookup("c")).isEqualTo(2);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Test
-  public void testStarlarkGlobalComprehensionIsAllowed() throws Exception {
-    ev.exec("a = [i for i in [1, 2, 3]]\n");
-    assertThat((Iterable<Object>) ev.lookup("a")).containsExactly(1, 2, 3).inOrder();
-  }
-
-  @Test
-  public void testFunctionReturn() throws Exception {
-    ev.exec(
-        "def func():", //
-        "  return 2",
-        "b = func()\n");
-    assertThat(ev.lookup("b")).isEqualTo(2);
-  }
-
-  @Test
-  public void testFunctionReturnFromALoop() throws Exception {
-    ev.exec(
-        "def func():", //
-        "  for i in [1, 2, 3, 4, 5]:",
-        "    return i",
-        "b = func()\n");
-    assertThat(ev.lookup("b")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionExecutesProperly() throws Exception {
-    ev.exec(
-        "def func(a):",
-        "  b = 1",
-        "  if a:",
-        "    b = 2",
-        "  return b",
-        "c = func(0)",
-        "d = func(1)\n");
-    assertThat(ev.lookup("c")).isEqualTo(1);
-    assertThat(ev.lookup("d")).isEqualTo(2);
-  }
-
-  @Test
-  public void testFunctionCallFromFunction() throws Exception {
-    final List<Object> params = new ArrayList<>();
-    createOuterFunction(params);
-    ev.exec(
-        "def func2(a):",
-        "  outer_func(a)",
-        "def func1(b):",
-        "  func2(b)",
-        "func1(1)",
-        "func1(2)\n");
-    assertThat(params).containsExactly(1, 2).inOrder();
-  }
-
-  @Test
-  public void testFunctionCallFromFunctionReadGlobalVar() throws Exception {
-    ev.exec(
-        "a = 1", //
-        "def func2():",
-        "  return a",
-        "def func1():",
-        "  return func2()",
-        "b = func1()\n");
-    assertThat(ev.lookup("b")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionParamCanShadowGlobalVarAfterGlobalVarIsRead() throws Exception {
-    ev.exec(
-        "a = 1",
-        "def func2(a):",
-        "  return 0",
-        "def func1():",
-        "  dummy = a",
-        "  return func2(2)",
-        "b = func1()\n");
-    assertThat(ev.lookup("b")).isEqualTo(0);
-  }
-
-  @Test
-  public void testSingleLineFunction() throws Exception {
-    ev.exec(
-        "def func(): return 'a'", //
-        "s = func()\n");
-    assertThat(ev.lookup("s")).isEqualTo("a");
-  }
-
-  @Test
-  public void testFunctionReturnsDictionary() throws Exception {
-    ev.exec(
-        "def func(): return {'a' : 1}", //
-        "d = func()",
-        "a = d['a']\n");
-    assertThat(ev.lookup("a")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionReturnsList() throws Exception {
-    ev.exec(
-        "def func(): return [1, 2, 3]", //
-        "d = func()",
-        "a = d[1]\n");
-    assertThat(ev.lookup("a")).isEqualTo(2);
-  }
-
-  @Test
-  public void testFunctionNameAliasing() throws Exception {
-    ev.exec(
-        "def func(a):", //
-        "  return a + 1",
-        "alias = func",
-        "r = alias(1)");
-    assertThat(ev.lookup("r")).isEqualTo(2);
-  }
-
-  @Test
-  public void testCallingFunctionsWithMixedModeArgs() throws Exception {
-    ev.exec(
-        "def func(a, b, c):", //
-        "  return a + b + c",
-        "v = func(1, c = 2, b = 3)");
-    assertThat(ev.lookup("v")).isEqualTo(6);
-  }
-
-  private String functionWithOptionalArgs() {
-    return "def func(a, b = None, c = None):\n"
-        + "  r = a + 'a'\n"
-        + "  if b:\n"
-        + "    r += 'b'\n"
-        + "  if c:\n"
-        + "    r += 'c'\n"
-        + "  return r\n";
-  }
-
-  @Test
-  public void testWhichOptionalArgsAreDefinedForFunctions() throws Exception {
-    ev.exec(
-        functionWithOptionalArgs(),
-        "v1 = func('1', 1, 1)",
-        "v2 = func(b = 2, a = '2', c = 2)",
-        "v3 = func('3')",
-        "v4 = func('4', c = 1)\n");
-    assertThat(ev.lookup("v1")).isEqualTo("1abc");
-    assertThat(ev.lookup("v2")).isEqualTo("2abc");
-    assertThat(ev.lookup("v3")).isEqualTo("3a");
-    assertThat(ev.lookup("v4")).isEqualTo("4ac");
-  }
-
-  @Test
-  public void testDefaultArguments() throws Exception {
-    ev.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')",
-        "v3 = func('a')",
-        "v4 = func('a', c = 'y')\n");
-    assertThat(ev.lookup("v1")).isEqualTo("axy");
-    assertThat(ev.lookup("v2")).isEqualTo("axy");
-    assertThat(ev.lookup("v3")).isEqualTo("abc");
-    assertThat(ev.lookup("v4")).isEqualTo("aby");
-  }
-
-  @Test
-  public void testDefaultArgumentsInsufficientArgNum() throws Exception {
-    ev.checkEvalError(
-        "func() missing 1 required positional argument: a",
-        "def func(a, b = 'b', c = 'c'):",
-        "  return a + b + c",
-        "func()");
-  }
-
-  @Test
-  public void testArgsIsNotIterable() throws Exception {
-    ev.checkEvalError(
-        "argument after * must be an iterable, not int",
-        "def func1(a, b): return a + b",
-        "func1('a', *42)");
-
-    ev.checkEvalError(
-        "argument after * must be an iterable, not string",
-        "def func2(a, b): return a + b",
-        "func2('a', *'str')");
-  }
-
-  @Test
-  public void testKeywordOnly() throws Exception {
-    ev.checkEvalError(
-        "func() missing 1 required keyword-only argument: b", //
-        "def func(a, *, b): pass",
-        "func(5)");
-
-    ev.checkEvalError(
-        "func() accepts no more than 1 positional argument but got 2",
-        "def func(a, *, b): pass",
-        "func(5, 6)");
-
-    ev.exec("def func(a, *, b, c = 'c'): return a + b + c");
-    assertThat(ev.eval("func('a', b = 'b')")).isEqualTo("abc");
-    assertThat(ev.eval("func('a', b = 'b', c = 'd')")).isEqualTo("abd");
-  }
-
-  @Test
-  public void testStarArgsAndKeywordOnly() throws Exception {
-    ev.checkEvalError(
-        "func() missing 1 required keyword-only argument: b",
-        "def func(a, *args, b): pass",
-        "func(5)");
-
-    ev.checkEvalError(
-        "func() missing 1 required keyword-only argument: b",
-        "def func(a, *args, b): pass",
-        "func(5, 6)");
-
-    ev.exec("def func(a, *args, b, c = 'c'): return a + str(args) + b + c");
-    assertThat(ev.eval("func('a', b = 'b')")).isEqualTo("a()bc");
-    assertThat(ev.eval("func('a', b = 'b', c = 'd')")).isEqualTo("a()bd");
-    assertThat(ev.eval("func('a', 1, 2, b = 'b')")).isEqualTo("a(1, 2)bc");
-    assertThat(ev.eval("func('a', 1, 2, b = 'b', c = 'd')")).isEqualTo("a(1, 2)bd");
-  }
-
-  @Test
-  public void testCannotPassResidualsByName() throws Exception {
-    ev.checkEvalError(
-        "f() got unexpected keyword argument: args", "def f(*args): pass", "f(args=[])");
-
-    ev.exec("def f(**kwargs): return kwargs");
-    assertThat(Starlark.repr(ev.eval("f(kwargs=1)"))).isEqualTo("{\"kwargs\": 1}");
-  }
-
-  @Test
-  public void testKeywordOnlyAfterStarArg() throws Exception {
-    ev.checkEvalError(
-        "func() missing 1 required keyword-only argument: c",
-        "def func(a, *b, c): pass",
-        "func(5)");
-
-    ev.checkEvalError(
-        "func() missing 1 required keyword-only argument: c",
-        "def func(a, *b, c): pass",
-        "func(5, 6, 7)");
-
-    ev.exec("def func(a, *b, c): return a + str(b) + c");
-    assertThat(ev.eval("func('a', c = 'c')")).isEqualTo("a()c");
-    assertThat(ev.eval("func('a', 1, c = 'c')")).isEqualTo("a(1,)c");
-    assertThat(ev.eval("func('a', 1, 2, c = 'c')")).isEqualTo("a(1, 2)c");
-  }
-
-  @Test
-  public void testKwargsBadKey() throws Exception {
-    ev.checkEvalError(
-        "keywords must be strings, not int", //
-        "def func(a, b): return a + b",
-        "func('a', **{3: 1})");
-  }
-
-  @Test
-  public void testKwargsIsNotDict() throws Exception {
-    ev.checkEvalError(
-        "argument after ** must be a dict, not int",
-        "def func(a, b): return a + b",
-        "func('a', **42)");
-  }
-
-  @Test
-  public void testKwargsCollision() throws Exception {
-    ev.checkEvalError(
-        "func() got multiple values for parameter 'b'",
-        "def func(a, b): return a + b",
-        "func('a', 'b', **{'b': 'foo'})");
-  }
-
-  @Test
-  public void testKwargsCollisionWithNamed() throws Exception {
-    ev.checkEvalError(
-        "func() got multiple values for parameter 'b'",
-        "def func(a, b): return a + b",
-        "func('a', b = 'b', **{'b': 'foo'})");
-  }
-
-  @Test
-  public void testDefaultArguments2() throws Exception {
-    ev.exec(
-        "a = 2",
-        "def foo(x=a): return x",
-        "def bar():",
-        "  a = 3",
-        "  return foo()",
-        "v = bar()\n");
-    assertThat(ev.lookup("v")).isEqualTo(2);
-  }
-
-  @Test
-  public void testMixingPositionalOptional() throws Exception {
-    ev.exec(
-        "def f(name, value = '', optional = ''):", //
-        "  return value",
-        "v = f('name', 'value')");
-    assertThat(ev.lookup("v")).isEqualTo("value");
-  }
-
-  @Test
-  public void testStarArg() throws Exception {
-    ev.exec(
-        "def f(name, value = '1', optional = '2'): return name + value + optional",
-        "v1 = f(*['name', 'value'])",
-        "v2 = f('0', *['name', 'value'])",
-        "v3 = f('0', optional = '3', *['b'])",
-        "v4 = f(name='a', *[])\n");
-    assertThat(ev.lookup("v1")).isEqualTo("namevalue2");
-    assertThat(ev.lookup("v2")).isEqualTo("0namevalue");
-    assertThat(ev.lookup("v3")).isEqualTo("0b3");
-    assertThat(ev.lookup("v4")).isEqualTo("a12");
-  }
-
-  @Test
-  public void testStarParam() throws Exception {
-    ev.exec(
-        "def f(name, value = '1', optional = '2', *rest):",
-        "  r = name + value + optional + '|'",
-        "  for x in rest: r += x",
-        "  return r",
-        "v1 = f('a', 'b', 'c', 'd', 'e')",
-        "v2 = f('a', optional='b', value='c')",
-        "v3 = f('a')");
-    assertThat(ev.lookup("v1")).isEqualTo("abc|de");
-    assertThat(ev.lookup("v2")).isEqualTo("acb|");
-    assertThat(ev.lookup("v3")).isEqualTo("a12|");
-  }
-
-  @Test
-  public void testKwParam() throws Exception {
-    ev.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"
-            + "v2 = foo(1, h=9, i=0, *['x', 'y', 'z', 't'])\n"
-            + "v3 = foo(1, i=0, *[2, 3, 4, 5, 6, 7, 8])\n"
-            + "def bar(**kwargs):\n"
-            + "  return kwargs\n"
-            + "b1 = bar(name='foo', type='jpg', version=42).items()\n"
-            + "b2 = bar()\n");
-
-    assertThat(Starlark.repr(ev.lookup("v1"))).isEqualTo("(1, 2, 3, 4, 7, 8, (), {})");
-    assertThat(Starlark.repr(ev.lookup("v2")))
-        .isEqualTo("(1, \"x\", \"y\", \"z\", \"t\", 9, (), {\"i\": 0})");
-    assertThat(Starlark.repr(ev.lookup("v3"))).isEqualTo("(1, 2, 3, 4, 5, 6, (7, 8), {\"i\": 0})");
-    assertThat(Starlark.repr(ev.lookup("b1")))
-        .isEqualTo("[(\"name\", \"foo\"), (\"type\", \"jpg\"), (\"version\", 42)]");
-    assertThat(Starlark.repr(ev.lookup("b2"))).isEqualTo("{}");
-  }
-
-  @Test
-  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
-    ev.exec(
-        "def f(*args, **kwargs): pass\n"
-            + "v1 = f(1,)\n"
-            + "v2 = f(*(1,2),)\n"
-            + "v3 = f(a=1,)\n"
-            + "v4 = f(**{\"a\": 1},)\n");
-
-    assertThat(Starlark.repr(ev.lookup("v1"))).isEqualTo("None");
-    assertThat(Starlark.repr(ev.lookup("v2"))).isEqualTo("None");
-    assertThat(Starlark.repr(ev.lookup("v3"))).isEqualTo("None");
-    assertThat(Starlark.repr(ev.lookup("v4"))).isEqualTo("None");
-  }
-
-  @Test
-  public void testCalls() throws Exception {
-    ev.exec("def f(a, b = None): return a, b");
-
-    assertThat(Starlark.repr(ev.eval("f(1)"))).isEqualTo("(1, None)");
-    assertThat(Starlark.repr(ev.eval("f(1, 2)"))).isEqualTo("(1, 2)");
-    assertThat(Starlark.repr(ev.eval("f(a=1)"))).isEqualTo("(1, None)");
-    assertThat(Starlark.repr(ev.eval("f(a=1, b=2)"))).isEqualTo("(1, 2)");
-    assertThat(Starlark.repr(ev.eval("f(b=2, a=1)"))).isEqualTo("(1, 2)");
-
-    ev.checkEvalError(
-        "f() missing 1 required positional argument: a", //
-        "f()");
-    ev.checkEvalError(
-        "f() accepts no more than 2 positional arguments but got 3", //
-        "f(1, 2, 3)");
-    ev.checkEvalError(
-        "f() got unexpected keyword arguments: c, d", //
-        "f(1, 2, c=3, d=4)");
-    ev.checkEvalError(
-        "f() missing 1 required positional argument: a", //
-        "f(b=2)");
-    ev.checkEvalError(
-        "f() missing 1 required positional argument: a", //
-        "f(b=2)");
-    ev.checkEvalError(
-        "f() got multiple values for parameter 'a'", //
-        "f(2, a=1)");
-    ev.checkEvalError(
-        "f() got unexpected keyword argument: c", //
-        "f(b=2, a=1, c=3)");
-
-    ev.exec("def g(*, one, two, three): pass");
-    ev.checkEvalError(
-        "g() got unexpected keyword argument: tree (did you mean 'three'?)", //
-        "g(tree=3)");
-    ev.checkEvalError(
-        "g() does not accept positional arguments, but got 3", //
-        "g(1, 2 ,3)");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
deleted file mode 100644
index 425286a..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.truth.Truth;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test for {@link LValue#boundIdentifiers}()}. */
-@RunWith(JUnit4.class)
-public class LValueBoundNamesTest {
-
-  @Test
-  public void simpleAssignment() {
-    assertBoundNames("x = 1", "x");
-  }
-
-  @Test
-  public void listAssignment() {
-    assertBoundNames("x, y = 1", "x", "y");
-  }
-
-  @Test
-  public void complexListAssignment() {
-    assertBoundNames("x, [y] = 1", "x", "y");
-  }
-
-  @Test
-  public void arrayElementAssignment() {
-    assertBoundNames("x[1] = 1");
-  }
-
-  @Test
-  public void complexListAssignment2() {
-    assertBoundNames("[[x], y], [z, w[1]] = 1", "x", "y", "z");
-  }
-
-  private static void assertBoundNames(String assignment, String... expectedBoundNames) {
-    ParserInput input = ParserInput.fromLines(assignment);
-    StarlarkFile file = StarlarkFile.parse(input);
-    if (!file.ok()) {
-      throw new AssertionError(new SyntaxError.Exception(file.errors()));
-    }
-    Expression lhs = ((AssignmentStatement) file.getStatements().get(0)).getLHS();
-    Set<String> boundNames =
-        Identifier.boundIdentifiers(lhs).stream()
-            .map(Identifier::getName)
-            .collect(Collectors.toSet());
-    Truth.assertThat(boundNames).containsExactlyElementsIn(Arrays.asList(expectedBoundNames));
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
deleted file mode 100644
index 255f528..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ /dev/null
@@ -1,546 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests of tokenization behavior of the {@link Lexer}.
- */
-@RunWith(JUnit4.class)
-public class LexerTest {
-
-  // TODO(adonovan): make these these tests less unnecessarily stateful.
-
-  private final List<SyntaxError> errors = new ArrayList<>();
-  private String lastError;
-
-  /**
-   * Create a lexer which takes input from the specified string. Resets the
-   * error handler beforehand.
-   */
-  private Lexer createLexer(String input) {
-    ParserInput inputSource = ParserInput.fromString(input, "/some/path.txt");
-    errors.clear();
-    lastError = null;
-    return new Lexer(inputSource, FileOptions.DEFAULT, errors);
-  }
-
-  private static class Token {
-    TokenKind kind;
-    int start;
-    int end;
-    Object value;
-
-    @Override
-    public String toString() {
-      return kind == TokenKind.STRING
-          ? "\"" + value + "\""
-          : value == null ? kind.toString() : value.toString();
-    }
-  }
-
-  private ArrayList<Token> allTokens(Lexer lexer) {
-    ArrayList<Token> result = new ArrayList<>();
-    do {
-      lexer.nextToken();
-      Token tok = new Token();
-      tok.kind = lexer.kind;
-      tok.start = lexer.start;
-      tok.end = lexer.end;
-      tok.value = lexer.value;
-      result.add(tok);
-    } while (lexer.kind != TokenKind.EOF);
-
-    for (SyntaxError error : errors) {
-      lastError = error.location().file() + ":" + error.location().line() + ": " + error.message();
-    }
-
-    return result;
-  }
-
-  private Token[] tokens(String input) {
-    ArrayList<Token> result = allTokens(createLexer(input));
-    return result.toArray(new Token[0]);
-  }
-
-  /**
-   * Lexes the specified input string, and returns a string containing just the line numbers of each
-   * token.
-   */
-  private String linenums(String input) {
-    Lexer lexer = createLexer(input);
-    StringBuilder buf = new StringBuilder();
-    for (Token tok : allTokens(lexer)) {
-      if (buf.length() > 0) {
-        buf.append(' ');
-      }
-      int line = lexer.locs.getLocation(tok.start).line();
-      buf.append(line);
-    }
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string containing the names of the tokens and their associated
-   * values. (String-literals are printed without escaping.)
-   */
-  private static String values(Token[] tokens) {
-    StringBuilder buffer = new StringBuilder();
-    for (Token token : tokens) {
-      if (buffer.length() > 0) {
-        buffer.append(' ');
-      }
-      buffer.append(token.kind.name());
-      if (token.value != null) {
-        buffer.append('(').append(token.value).append(')');
-      }
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * Returns a string containing just the names of the tokens.
-   */
-  private static String names(Token[] tokens) {
-    StringBuilder buf = new StringBuilder();
-    for (Token tok : tokens) {
-      if (buf.length() > 0) {
-        buf.append(' ');
-      }
-      buf.append(tok.kind.name());
-    }
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string containing just the half-open position intervals of each
-   * token. e.g. "[3,4) [4,9)".
-   */
-  private static String positions(Token[] tokens) {
-    StringBuilder buf = new StringBuilder();
-    for (Token tok : tokens) {
-      if (buf.length() > 0) {
-        buf.append(' ');
-      }
-      buf.append('[').append(tok.start).append(',').append(tok.end).append(')');
-    }
-    return buf.toString();
-  }
-
-  @Test
-  public void testBasics1() throws Exception {
-    assertThat(names(tokens("wiz) "))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
-    assertThat(names(tokens("wiz )"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
-    assertThat(names(tokens(" wiz)")))
-        .isEqualTo("INDENT IDENTIFIER RPAREN NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(names(tokens(" wiz ) ")))
-        .isEqualTo("INDENT IDENTIFIER RPAREN NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(names(tokens("wiz\t)"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
-  }
-
-  @Test
-  public void testBasics2() throws Exception {
-    assertThat(names(tokens(")"))).isEqualTo("RPAREN NEWLINE EOF");
-    assertThat(names(tokens(" )"))).isEqualTo("INDENT RPAREN NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(names(tokens(" ) "))).isEqualTo("INDENT RPAREN NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(names(tokens(") "))).isEqualTo("RPAREN NEWLINE EOF");
-  }
-
-  @Test
-  public void testBasics3() throws Exception {
-    assertThat(names(tokens("123#456\n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
-    assertThat(names(tokens("123 #456\n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
-    assertThat(names(tokens("123#456 \n789"))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
-    assertThat(names(tokens("123#456\n 789")))
-        .isEqualTo("INT NEWLINE INDENT INT NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(names(tokens("123#456\n789 "))).isEqualTo("INT NEWLINE INT NEWLINE EOF");
-  }
-
-  @Test
-  public void testBasics4() throws Exception {
-    assertThat(names(tokens(""))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("# foo"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("1 2 3 4"))).isEqualTo("INT INT INT INT NEWLINE EOF");
-    assertThat(names(tokens("1.234"))).isEqualTo("INT DOT INT NEWLINE EOF");
-    assertThat(names(tokens("foo(bar, wiz)")))
-        .isEqualTo("IDENTIFIER LPAREN IDENTIFIER COMMA IDENTIFIER RPAREN " + "NEWLINE EOF");
-  }
-
-  @Test
-  public void testNoWhiteSpaceBetweenTokens() throws Exception {
-    assertThat(names(tokens("6or()"))).isEqualTo("INT OR LPAREN RPAREN NEWLINE EOF");
-    assertThat(names(tokens("0in(''and[])")))
-        .isEqualTo("INT IN LPAREN STRING AND LBRACKET RBRACKET RPAREN NEWLINE EOF");
-
-    assertThat(values(tokens("0or()"))).isEqualTo("INT(0) IDENTIFIER(r) LPAREN RPAREN NEWLINE EOF");
-    assertThat(lastError).isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0o");
-  }
-
-  @Test
-  public void testNonAsciiIdentifiers() throws Exception {
-    tokens("ümlaut");
-    assertThat(lastError.toString()).contains("invalid character: 'ü'");
-    tokens("umläut");
-    assertThat(lastError.toString()).contains("invalid character: 'ä'");
-  }
-
-  @Test
-  public void testCrLf() throws Exception {
-    assertThat(names(tokens("\r\n\r\n"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("\r\n\r1\r\r\n"))).isEqualTo("INT NEWLINE EOF");
-    assertThat(names(tokens("# foo\r\n# bar\r\n"))).isEqualTo("NEWLINE EOF");
-  }
-
-  @Test
-  public void testIntegers() throws Exception {
-    // Detection of MINUS immediately following integer constant proves we
-    // don't consume too many chars.
-
-    // decimal
-    assertThat(values(tokens("12345-"))).isEqualTo("INT(12345) MINUS NEWLINE EOF");
-
-    // octal
-    assertThat(values(tokens("0o12345-"))).isEqualTo("INT(5349) MINUS NEWLINE EOF");
-    assertThat(values(tokens("0O77"))).isEqualTo("INT(63) NEWLINE EOF");
-
-    // octal (bad)
-    assertThat(values(tokens("012349-"))).isEqualTo("INT(0) MINUS NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 012349");
-
-    assertThat(values(tokens("0o"))).isEqualTo("INT(0) NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0o");
-
-    assertThat(values(tokens("012345"))).isEqualTo("INT(5349) NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: invalid octal value `012345`, should be: `0o12345`");
-
-    // hexadecimal (uppercase)
-    assertThat(values(tokens("0X12345F-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
-
-    // hexadecimal (lowercase)
-    assertThat(values(tokens("0x12345f-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
-
-    // hexadecimal (lowercase) [note: "g" cause termination of token]
-    assertThat(values(tokens("0x12345g-"))).isEqualTo("INT(74565) IDENTIFIER(g) MINUS NEWLINE EOF");
-  }
-
-  @Test
-  public void testIntegersAndDot() throws Exception {
-    assertThat(values(tokens("1.2345"))).isEqualTo("INT(1) DOT INT(2345) NEWLINE EOF");
-
-    assertThat(values(tokens("1.2.345"))).isEqualTo("INT(1) DOT INT(2) DOT INT(345) NEWLINE EOF");
-
-    assertThat(values(tokens("1.0E10"))).isEqualTo("INT(1) DOT INT(0) NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 0E10");
-
-    assertThat(values(tokens("1.03E-10"))).isEqualTo("INT(1) DOT INT(0) MINUS INT(10) NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 03E");
-
-    assertThat(values(tokens(". 123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
-    assertThat(values(tokens(".123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
-    assertThat(values(tokens(".abc"))).isEqualTo("DOT IDENTIFIER(abc) NEWLINE EOF");
-
-    assertThat(values(tokens("foo.123"))).isEqualTo("IDENTIFIER(foo) DOT INT(123) NEWLINE EOF");
-    assertThat(values(tokens("foo.bcd")))
-        .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(bcd) NEWLINE EOF"); // 'b' are hex chars
-    assertThat(values(tokens("foo.xyz")))
-        .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(xyz) NEWLINE EOF");
-  }
-
-  @Test
-  public void testStringDelimiters() throws Exception {
-    assertThat(values(tokens("\"foo\""))).isEqualTo("STRING(foo) NEWLINE EOF");
-    assertThat(values(tokens("'foo'"))).isEqualTo("STRING(foo) NEWLINE EOF");
-  }
-
-  @Test
-  public void testQuotesInStrings() throws Exception {
-    assertThat(values(tokens("'foo\\'bar'"))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
-    assertThat(values(tokens("\"foo'bar\""))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
-    assertThat(values(tokens("'foo\"bar'"))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
-    assertThat(values(tokens("\"foo\\\"bar\""))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
-  }
-
-  @Test
-  public void testStringEscapes() throws Exception {
-    assertThat(values(tokens("'a\\tb\\nc\\rd'")))
-        .isEqualTo("STRING(a\tb\nc\rd) NEWLINE EOF"); // \t \r \n
-    assertThat(values(tokens("'x\\hx'")))
-        .isEqualTo("STRING(x\\hx) NEWLINE EOF"); // \h is unknown => "\h"
-    assertThat(values(tokens("'\\$$'"))).isEqualTo("STRING(\\$$) NEWLINE EOF");
-    assertThat(values(tokens("'a\\\nb'")))
-        .isEqualTo("STRING(ab) NEWLINE EOF"); // escape end of line
-    assertThat(values(tokens("\"ab\\ucd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
-    assertThat(lastError).isEqualTo("/some/path.txt:1: invalid escape sequence: \\u");
-  }
-
-  @Test
-  public void testEscapedCrlfInString() throws Exception {
-    assertThat(values(tokens("'a\\\r\nb'"))).isEqualTo("STRING(ab) NEWLINE EOF");
-    assertThat(values(tokens("\"a\\\r\nb\""))).isEqualTo("STRING(ab) NEWLINE EOF");
-    assertThat(values(tokens("\"\"\"a\\\r\nb\"\"\""))).isEqualTo("STRING(ab) NEWLINE EOF");
-    assertThat(values(tokens("'''a\\\r\nb'''"))).isEqualTo("STRING(ab) NEWLINE EOF");
-    assertThat(values(tokens("r'a\\\r\nb'"))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
-    assertThat(values(tokens("r\"a\\\r\nb\""))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
-    assertThat(values(tokens("r\"a\\\r\n\\\nb\""))).isEqualTo("STRING(a\\\n\\\nb) NEWLINE EOF");
-  }
-
-  @Test
-  public void testRawString() throws Exception {
-    assertThat(values(tokens("r'abcd'"))).isEqualTo("STRING(abcd) NEWLINE EOF");
-    assertThat(values(tokens("r\"abcd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
-    assertThat(values(tokens("r'a\\tb\\nc\\rd'")))
-        .isEqualTo("STRING(a\\tb\\nc\\rd) NEWLINE EOF"); // r'a\tb\nc\rd'
-    assertThat(values(tokens("r\"a\\\"\""))).isEqualTo("STRING(a\\\") NEWLINE EOF"); // r"a\""
-    assertThat(values(tokens("r'a\\\\b'"))).isEqualTo("STRING(a\\\\b) NEWLINE EOF"); // r'a\\b'
-    assertThat(values(tokens("r'ab'r"))).isEqualTo("STRING(ab) IDENTIFIER(r) NEWLINE EOF");
-
-    // Unterminated raw string
-    values(tokens("r'\\'")); // r'\'
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
-  }
-
-  @Test
-  public void testTripleRawString() throws Exception {
-    // r'''a\ncd'''
-    assertThat(values(tokens("r'''ab\\ncd'''"))).isEqualTo("STRING(ab\\ncd) NEWLINE EOF");
-    // r"""ab
-    // cd"""
-    assertThat(values(tokens("\"\"\"ab\ncd\"\"\""))).isEqualTo("STRING(ab\ncd) NEWLINE EOF");
-
-    // Unterminated raw string
-    values(tokens("r'''\\'''")); // r'''\'''
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
-  }
-
-  @Test
-  public void testOctalEscapes() throws Exception {
-    // Regression test for a bug.
-    assertThat(values(tokens("'\\0 \\1 \\11 \\77 \\111 \\1111 \\377'")))
-        .isEqualTo("STRING(\0 \1 \t \u003f I I1 \u00ff) NEWLINE EOF");
-    // Test boundaries (non-octal char, EOF).
-    assertThat(values(tokens("'\\1b \\1'"))).isEqualTo("STRING(\1b \1) NEWLINE EOF");
-  }
-
-  @Test
-  public void testOctalEscapeOutOfRange() throws Exception {
-    assertThat(values(tokens("'\\777'"))).isEqualTo("STRING(\u00ff) NEWLINE EOF");
-    assertThat(lastError.toString())
-        .isEqualTo("/some/path.txt:1: octal escape sequence out of range (maximum is \\377)");
-  }
-
-  @Test
-  public void testTripleQuotedStrings() throws Exception {
-    assertThat(values(tokens("\"\"\"a\"b'c \n d\"\"e\"\"\"")))
-        .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
-    assertThat(values(tokens("'''a\"b'c \n d\"\"e'''")))
-        .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
-  }
-
-  @Test
-  public void testBadChar() throws Exception {
-    assertThat(values(tokens("a$b"))).isEqualTo("IDENTIFIER(a) IDENTIFIER(b) NEWLINE EOF");
-    assertThat(lastError.toString()).isEqualTo("/some/path.txt:1: invalid character: '$'");
-  }
-
-  @Test
-  public void testIndentation() throws Exception {
-    assertThat(values(tokens("1\n2\n3")))
-        .isEqualTo("INT(1) NEWLINE INT(2) NEWLINE INT(3) NEWLINE EOF");
-    assertThat(values(tokens("1\n  2\n  3\n4 ")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "INT(4) NEWLINE EOF");
-    assertThat(values(tokens("1\n  2\n  3")))
-        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "NEWLINE EOF");
-    assertThat(values(tokens("1\n  2\n    3")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                + "OUTDENT OUTDENT NEWLINE EOF");
-    assertThat(values(tokens("1\n  2\n    3\n  4\n5")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
-
-    assertThat(values(tokens("1\n  2\n    3\n   4\n5")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
-    assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: indentation error");
-  }
-
-  @Test
-  public void testIndentationWithTab() throws Exception {
-    tokens("def x():\n\tpass");
-    assertThat(lastError).contains("Tab characters are not allowed");
-  }
-
-  @Test
-  public void testIndentationWithCrLf() throws Exception {
-    assertThat(values(tokens("1\r\n  2\r\n")))
-        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(values(tokens("1\r\n  2\r\n\r\n")))
-        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(values(tokens("1\r\n  2\r\n    3\r\n  4\r\n5")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE OUTDENT INT(4) "
-                + "NEWLINE OUTDENT INT(5) NEWLINE EOF");
-    assertThat(values(tokens("1\r\n  2\r\n\r\n  3\r\n4")))
-        .isEqualTo(
-            "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT INT(4) NEWLINE EOF");
-  }
-
-  @Test
-  public void testIndentationInsideParens() throws Exception {
-    // Indentation is ignored inside parens:
-    assertThat(values(tokens("1 (\n  2\n    3\n  4\n5")))
-        .isEqualTo("INT(1) LPAREN INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
-    assertThat(values(tokens("1 {\n  2\n    3\n  4\n5")))
-        .isEqualTo("INT(1) LBRACE INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
-    assertThat(values(tokens("1 [\n  2\n    3\n  4\n5")))
-        .isEqualTo("INT(1) LBRACKET INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
-    assertThat(values(tokens("1 [\n  2]\n    3\n    4\n5")))
-        .isEqualTo(
-            "INT(1) LBRACKET INT(2) RBRACKET NEWLINE INDENT INT(3) "
-                + "NEWLINE INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
-  }
-
-  @Test
-  public void testIndentationAtEOF() throws Exception {
-    // Matching OUTDENTS are created at EOF:
-    assertThat(values(tokens("\n  1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
-  }
-
-  @Test
-  public void testIndentationOnFirstLine() throws Exception {
-    assertThat(values(tokens("    1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
-    assertThat(values(tokens("\n\n    1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
-  }
-
-  @Test
-  public void testBlankLineIndentation() throws Exception {
-    // Blank lines and comment lines should not generate any newlines indents
-    // (but note that every input ends with NEWLINE EOF).
-    assertThat(names(tokens("\n      #\n"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("      #"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("      #\n"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("      #comment\n"))).isEqualTo("NEWLINE EOF");
-    assertThat(names(tokens("def f(x):\n" + "  # comment\n" + "\n" + "  \n" + "  return x\n")))
-        .isEqualTo(
-            "DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
-                + "INDENT RETURN IDENTIFIER NEWLINE "
-                + "OUTDENT NEWLINE EOF");
-  }
-
-  @Test
-  public void testBackslash() throws Exception {
-    assertThat(names(tokens("a\\\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
-    assertThat(names(tokens("a\\\r\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
-    assertThat(names(tokens("a\\ b"))).isEqualTo("IDENTIFIER ILLEGAL IDENTIFIER NEWLINE EOF");
-    assertThat(names(tokens("a(\\\n2)"))).isEqualTo("IDENTIFIER LPAREN INT RPAREN NEWLINE EOF");
-  }
-
-  @Test
-  public void testTokenPositions() throws Exception {
-    assertThat(positions(tokens("foo(bar, {1: 'quux'}, \"\"\"b\"\"\", r\"\")")))
-        .isEqualTo(
-            // foo (     bar   ,     {      1       :
-            "[0,3) [3,4) [4,7) [7,8) [9,10) [10,11) [11,12)"
-                //  'quux'  }       ,       """b""" ,       r""     )       NEWLINE EOF
-                + " [13,19) [19,20) [20,21) [22,29) [29,30) [31,34) [34,35) [35,35) [35,35)");
-  }
-
-  @Test
-  public void testLineNumbers() throws Exception {
-    assertThat(linenums("foo = 1\nbar = 2\n\nwiz = 3")).isEqualTo("1 1 1 1 2 2 2 2 4 4 4 4 4");
-
-    assertThat(values(tokens("foo = 1\nbar = 2\n\nwiz = $\nbar = 2")))
-        .isEqualTo(
-            "IDENTIFIER(foo) EQUALS INT(1) NEWLINE "
-                + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE "
-                + "IDENTIFIER(wiz) EQUALS NEWLINE "
-                + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE EOF");
-    assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: invalid character: '$'");
-
-    // '\\n' in string should not increment linenum:
-    String s = "1\n'foo\\nbar'\3";
-    assertThat(values(tokens(s))).isEqualTo("INT(1) NEWLINE STRING(foo\nbar) NEWLINE EOF");
-    assertThat(linenums(s)).isEqualTo("1 1 2 2 2");
-  }
-
-  @Test
-  public void testContainsErrors() throws Exception {
-    Lexer lexerSuccess = createLexer("foo");
-    allTokens(lexerSuccess); // ensure the file has been completely scanned
-    assertThat(errors).isEmpty();
-
-    Lexer lexerFail = createLexer("f$o");
-    allTokens(lexerFail);
-    assertThat(errors).isNotEmpty();
-
-    String s = "'unterminated";
-    lexerFail = createLexer(s);
-    allTokens(lexerFail);
-    assertThat(errors).isNotEmpty();
-    assertThat(values(tokens(s))).isEqualTo("STRING(unterminated) NEWLINE EOF");
-  }
-
-  @Test
-  public void testUnterminatedRawStringWithEscapingError() throws Exception {
-    assertThat(names(tokens("r'\\"))).isEqualTo("STRING NEWLINE EOF");
-    assertThat(lastError).isEqualTo("/some/path.txt:1: unterminated string literal at eof");
-  }
-
-  @Test
-  public void testFirstCharIsTab() {
-    assertThat(names(tokens("\t"))).isEqualTo("NEWLINE EOF");
-    assertThat(lastError)
-        .isEqualTo(
-            "/some/path.txt:1: Tab characters are not allowed for indentation. Use spaces"
-                + " instead.");
-  }
-
-  /**
-   * Returns the first error whose string form contains the specified substring, or throws an
-   * informative AssertionError if there is none.
-   *
-   * <p>Exposed for use by other frontend tests.
-   */
-  static SyntaxError assertContainsError(List<SyntaxError> errors, String substr) {
-    for (SyntaxError error : errors) {
-      if (error.toString().contains(substr)) {
-        return error;
-      }
-    }
-    if (errors.isEmpty()) {
-      throw new AssertionError("no errors, want '" + substr + "'");
-    } else {
-      throw new AssertionError(
-          "error '" + substr + "' not found, but got these:\n" + Joiner.on("\n").join(errors));
-    }
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java
deleted file mode 100644
index 1469898..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/LocationTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public final class LocationTest {
-
-  @Test
-  public void fromFile() throws Exception {
-    String file = "this is a filename";
-    Location location = Location.fromFile(file);
-    assertThat(location.file()).isEqualTo(file);
-    assertThat(location.line()).isEqualTo(0);
-    assertThat(location.column()).isEqualTo(0);
-    assertThat(location.toString()).isEqualTo(file);
-  }
-}
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
deleted file mode 100644
index 5703e47..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ /dev/null
@@ -1,758 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import net.starlark.java.annot.StarlarkBuiltin;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for MethodLibrary. */
-@RunWith(JUnit4.class)
-public final class MethodLibraryTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  // Asserts that evaluation of src fails with the specified stack.
-  private void checkEvalErrorStack(String src, String stack) {
-    EvalException ex = assertThrows(EvalException.class, () -> ev.exec(src));
-    EvalException.SourceReader reader =
-        loc -> {
-          // ignore filename
-          List<String> lines = Splitter.on('\n').splitToList(src);
-          return loc.line() > 0 && loc.line() <= lines.size() ? lines.get(loc.line() - 1) : null;
-        };
-    assertThat(ex.getMessageWithStack(reader)).isEqualTo(stack);
-  }
-
-  private static String join(String... lines) {
-    return Joiner.on("\n").join(lines);
-  }
-
-  @Test
-  public void testStackTrace() throws Exception {
-    checkEvalErrorStack(
-        join(
-            "def foo():", //
-            "  bar(1)",
-            "def bar(x):",
-            "  if x == 1:",
-            "    a = x",
-            "    b = 2",
-            "    'test'.index(x) # hello",
-            "foo()"),
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 8, column 4, in <toplevel>",
-            "\t\tfoo()",
-            "\tFile \"\", line 2, column 6, in foo",
-            "\t\tbar(1)",
-            "\tFile \"\", line 7, column 17, in bar",
-            "\t\t'test'.index(x) # hello",
-            "Error in index: in call to index(), parameter 'sub' got value of type 'int', want"
-                + " 'string'"));
-  }
-
-  @Test
-  public void testStackTraceWithIf() throws Exception {
-    checkEvalErrorStack(
-        join(
-            "def foo():", //
-            "  s = []",
-            "  if s[0] == 1:",
-            "    x = 1",
-            "foo()"),
-        join(
-            "Traceback (most recent call last):",
-            "\tFile \"\", line 5, column 4, in <toplevel>",
-            "\t\tfoo()",
-            "\tFile \"\", line 3, column 7, in foo",
-            "\t\tif s[0] == 1:",
-            "Error: index out of range (index is 0, but sequence has 0 elements)"));
-  }
-
-  @Test
-  public void testStackTraceWithAugmentedAssignment() throws Exception {
-    // Each time the current tree-walking evaluator catches an exception, it computes and sets the
-    // frame's error location. Only the first (innermost) such 'set' has any effect. When the frame
-    // is popped, its error location is accurate. (In our bytecode future, we'll be able to
-    // preemptively set fr.pc cheaply, before every instruction and error, as it's just an int, and
-    // thus do away with this.)
-    //
-    // Assignment statements x=y are special in the evaluator because there's no guarantee that
-    // failed evaluation of the subexpressions x or y sets the frame's error location, so
-    // Eval(assign) sets the error location to '=', possibly redundantly, to ensure that some
-    // location is reported. test exercises that special case.
-    checkEvalErrorStack(
-        join(
-            "def foo():", //
-            "  s = 1",
-            "  s += '2'",
-            "foo()"),
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 4, column 4, in <toplevel>",
-            "\t\tfoo()",
-            "\tFile \"\", line 3, column 5, in foo",
-            "\t\ts += '2'",
-            "Error: unsupported binary operation: int + string"));
-  }
-
-  @Test
-  public void testStackErrorInBuiltinFunction() throws Exception {
-    // at top level
-    checkEvalErrorStack(
-        "len(1)",
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 1, column 4, in <toplevel>",
-            "\t\tlen(1)",
-            "Error in len: int is not iterable"));
-
-    // in a function
-    checkEvalErrorStack(
-        join(
-            "def f():", //
-            "  len(1)",
-            "f()"),
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 3, column 2, in <toplevel>",
-            "\t\tf()",
-            "\tFile \"\", line 2, column 6, in f",
-            "\t\tlen(1)",
-            "Error in len: int is not iterable"));
-  }
-
-  @Test
-  public void testStackErrorInOperator() throws Exception {
-    // at top level
-    checkEvalErrorStack(
-        "1//0",
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 1, column 2, in <toplevel>",
-            "\t\t1//0",
-            "Error: integer division by zero"));
-
-    // in a function
-    checkEvalErrorStack(
-        join(
-            "def f():", //
-            "  1//0",
-            "f()"),
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 3, column 2, in <toplevel>",
-            "\t\tf()",
-            "\tFile \"\", line 2, column 4, in f",
-            "\t\t1//0",
-            "Error: integer division by zero"));
-
-    // in a function callback
-    checkEvalErrorStack(
-        join(
-            "def id(x): return 1//x", //
-            "sorted([2, 1, 0], key=id)"),
-        join(
-            "Traceback (most recent call last):", //
-            "\tFile \"\", line 2, column 7, in <toplevel>",
-            "\t\tsorted([2, 1, 0], key=id)",
-            "\tFile \"<builtin>\", in sorted",
-            "\tFile \"\", line 1, column 20, in id",
-            "\t\tdef id(x): return 1//x",
-            "Error: integer division by zero"));
-  }
-
-  @Test
-  public void testBuiltinFunctionErrorMessage() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("substring \"z\" not found in \"abc\"", "'abc'.index('z')")
-        .testIfErrorContains(
-            "in call to startswith(), parameter 'sub' got value of type 'int', want 'string or"
-                + " tuple'",
-            "'test'.startswith(1)")
-        .testIfErrorContains("in dict, got string, want iterable", "dict('a')");
-  }
-
-  @Test
-  public void testHasAttr() throws Exception {
-    ev.new Scenario()
-        .testExpression("hasattr([], 'append')", Boolean.TRUE)
-        .testExpression("hasattr('test', 'count')", Boolean.TRUE)
-        .testExpression("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
-        .testExpression("hasattr({}, 'items')", Boolean.TRUE);
-  }
-
-  @Test
-  public void testGetAttrMissingField() throws Exception {
-    ev.new Scenario()
-        .testIfExactError(
-            "'string' value has no field or method 'not_there'", "getattr('a string', 'not_there')")
-        .testExpression("getattr('a string', 'not_there', 'use this')", "use this")
-        .testExpression("getattr('a string', 'not there', None)", Starlark.NONE);
-  }
-
-  @StarlarkBuiltin(name = "AStruct", documented = false, doc = "")
-  static final class AStruct implements ClassObject, StarlarkValue {
-    @Override
-    public Object getValue(String name) {
-      switch (name) {
-        case "field":
-          return "a";
-        default:
-          return null;
-      }
-    }
-
-    @Override
-    public ImmutableCollection<String> getFieldNames() {
-      return ImmutableList.of("field");
-    }
-
-    @Override
-    public String getErrorMessageForUnknownField(String name) {
-      return null;
-    }
-  }
-
-  @Test
-  public void testGetAttrMissingField_typoDetection() throws Exception {
-    ev.new Scenario()
-        .update("s", new AStruct())
-        .testIfExactError(
-            "'AStruct' value has no field or method 'feild' (did you mean 'field'?)",
-            "getattr(s, 'feild')");
-  }
-
-  @Test
-  public void testGetAttrWithMethods() throws Exception {
-    String msg = "'string' value has no field or method 'cnt'";
-    ev.new Scenario()
-        .testIfExactError(msg, "getattr('a string', 'cnt')")
-        .testExpression("getattr('a string', 'cnt', 'default')", "default");
-  }
-
-  @Test
-  public void testDir() throws Exception {
-    ev.new Scenario()
-        .testExpression(
-            "str(dir({}))",
-            "[\"clear\", \"get\", \"items\", \"keys\","
-                + " \"pop\", \"popitem\", \"setdefault\", \"update\", \"values\"]");
-  }
-
-  @Test
-  public void testBoolean() throws Exception {
-    ev.new Scenario().testExpression("False", Boolean.FALSE).testExpression("True", Boolean.TRUE);
-  }
-
-  @Test
-  public void testBooleanUnsupportedOperationFails() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("unsupported binary operation: bool + bool", "True + True");
-  }
-
-  @Test
-  public void testListSort() throws Exception {
-    ev.new Scenario()
-        .testEval("sorted([0,1,2,3])", "[0, 1, 2, 3]")
-        .testEval("sorted([])", "[]")
-        .testEval("sorted([3, 2, 1, 0])", "[0, 1, 2, 3]")
-        .testEval("sorted([[1], [], [2], [1, 2]])", "[[], [1], [1, 2], [2]]")
-        .testEval("sorted([True, False, True])", "[False, True, True]")
-        .testEval("sorted(['a','x','b','z'])", "[\"a\", \"b\", \"x\", \"z\"]")
-        .testEval("sorted({1: True, 5: True, 4: False})", "[1, 4, 5]")
-        .testEval("sorted([3, 2, 1, 0], reverse=True)", "[3, 2, 1, 0]")
-        .testEval("sorted([[1], [], [1, 2]], key=len, reverse=True)", "[[1, 2], [1], []]")
-        .testEval("sorted([[0, 5], [4, 1], [1, 7]], key=max)", "[[4, 1], [0, 5], [1, 7]]")
-        .testIfExactError("Cannot compare function with function", "sorted([sorted, sorted])");
-  }
-
-  @Test
-  public void testDictionaryCopy() throws Exception {
-    ev.new Scenario()
-        .setUp("x = {1 : 2}", "y = dict(x)")
-        .testEval("x[1] == 2 and y[1] == 2", "True");
-  }
-
-  @Test
-  public void testDictionaryCopyKeyCollision() throws Exception {
-    ev.new Scenario().setUp("x = {'test' : 2}", "y = dict(x, test = 3)").testEval("y['test']", "3");
-  }
-
-  @Test
-  public void testDictionaryKeyNotFound() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("key \"0\" not found in dictionary", "{}['0']")
-        .testIfErrorContains("key 0 not found in dictionary", "{'0': 1, 2: 3, 4: 5}[0]");
-  }
-
-  @Test
-  public void testDictionaryAccess() throws Exception {
-    ev.new Scenario()
-        .testEval("{1: ['foo']}[1]", "['foo']")
-        .testExpression("{'4': 8}['4']", 8)
-        .testExpression("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
-  }
-
-  @Test
-  public void testDictionaryVariableAccess() throws Exception {
-    ev.new Scenario().setUp("d = {'a' : 1}", "a = d['a']").testLookup("a", 1);
-  }
-
-  @Test
-  public void testDictionaryCreation() throws Exception {
-    String expected = "{'a': 1, 'b': 2, 'c': 3}";
-
-    ev.new Scenario()
-        .testEval("dict([('a', 1), ('b', 2), ('c', 3)])", expected)
-        .testEval("dict(a = 1, b = 2, c = 3)", expected)
-        .testEval("dict([('a', 1)], b = 2, c = 3)", expected);
-  }
-
-  @Test
-  public void testDictionaryCreationInnerLists() throws Exception {
-    ev.new Scenario().testEval("dict([[1, 2], [3, 4]], a = 5)", "{1: 2, 3: 4, 'a': 5}");
-  }
-
-  @Test
-  public void testDictionaryCreationEmpty() throws Exception {
-    ev.new Scenario().testEval("dict()", "{}").testEval("dict([])", "{}");
-  }
-
-  @Test
-  public void testDictionaryCreationDifferentKeyTypes() throws Exception {
-    String expected = "{'a': 1, 2: 3}";
-
-    ev.new Scenario()
-        .testEval("dict([('a', 1), (2, 3)])", expected)
-        .testEval("dict([(2, 3)], a = 1)", expected);
-  }
-
-  @Test
-  public void testDictionaryCreationKeyCollision() throws Exception {
-    String expected = "{'a': 1, 'b': 2, 'c': 3}";
-
-    ev.new Scenario()
-        .testEval("dict([('a', 42), ('b', 2), ('a', 1), ('c', 3)])", expected)
-        .testEval("dict([('a', 42)], a = 1, b = 2, c = 3)", expected);
-    ev.new Scenario().testEval("dict([('a', 42)], **{'a': 1, 'b': 2, 'c': 3})", expected);
-  }
-
-  @Test
-  public void testDictionaryCreationInvalidPositional() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("in dict, got string, want iterable", "dict('a')")
-        .testIfErrorContains(
-            "in dict, dictionary update sequence element #0 is not iterable (string)",
-            "dict([('a')])")
-        .testIfErrorContains(
-            "in dict, dictionary update sequence element #0 is not iterable (string)",
-            "dict([('a')])")
-        .testIfErrorContains(
-            "dict() accepts no more than 1 positional argument but got 3",
-            "dict((3,4), (3,2), (1,2))")
-        .testIfErrorContains(
-            "item #0 has length 3, but exactly two elements are required",
-            "dict([('a', 'b', 'c')])");
-  }
-
-  @Test
-  public void testDictionaryValues() throws Exception {
-    ev.new Scenario()
-        .testEval("{1: 'foo'}.values()", "['foo']")
-        .testEval("{}.values()", "[]")
-        .testEval("{True: 3, False: 5}.values()", "[3, 5]")
-        .testEval("{'a': 5, 'c': 2, 'b': 4, 'd': 3}.values()", "[5, 2, 4, 3]");
-    // sorted by keys
-  }
-
-  @Test
-  public void testDictionaryKeys() throws Exception {
-    ev.new Scenario()
-        .testEval("{1: 'foo'}.keys()", "[1]")
-        .testEval("{}.keys()", "[]")
-        .testEval("{True: 3, False: 5}.keys()", "[True, False]")
-        .testEval(
-            "{1:'a', 2:'b', 6:'c', 0:'d', 5:'e', 4:'f', 3:'g'}.keys()", "[1, 2, 6, 0, 5, 4, 3]");
-  }
-
-  @Test
-  public void testDictionaryGet() throws Exception {
-    ev.new Scenario()
-        .testExpression("{1: 'foo'}.get(1)", "foo")
-        .testExpression("{1: 'foo'}.get(2)", Starlark.NONE)
-        .testExpression("{1: 'foo'}.get(2, 'a')", "a")
-        .testExpression("{1: 'foo'}.get(2, default='a')", "a")
-        .testExpression("{1: 'foo'}.get(2, default=None)", Starlark.NONE);
-  }
-
-  @Test
-  public void testDictionaryItems() throws Exception {
-    ev.new Scenario()
-        .testEval("{'a': 'foo'}.items()", "[('a', 'foo')]")
-        .testEval("{}.items()", "[]")
-        .testEval("{1: 3, 2: 5}.items()", "[(1, 3), (2, 5)]")
-        .testEval("{'a': 5, 'c': 2, 'b': 4}.items()", "[('a', 5), ('c', 2), ('b', 4)]");
-  }
-
-  @Test
-  public void testDictionaryClear() throws Exception {
-    ev.new Scenario()
-        .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
-  public void testDictionaryPop() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "KeyError: 1",
-            "d = {1: 'foo', 2: 'bar', 3: 'baz'}\n"
-                + "len(d) == 3 or fail('pop 1')\n"
-                + "d.pop(2) == 'bar' or fail('pop 2')\n"
-                + "d.pop(3, 'quux') == 'baz' or fail('pop 3a')\n"
-                + "d.pop(3, 'quux') == 'quux' or fail('pop 3b')\n"
-                + "d.pop(1) == 'foo' or fail('pop 1')\n"
-                + "d == {} or fail('pop 0')\n"
-                + "d.pop(1)");
-  }
-
-  @Test
-  public void testDictionaryPopItem() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "popitem(): dictionary is empty",
-            "d = {2: 'bar', 3: 'baz', 1: 'foo'}\n"
-                + "len(d) == 3 or fail('popitem 0')\n"
-                + "d.popitem() == (2, 'bar') or fail('popitem 2')\n"
-                + "d.popitem() == (3, 'baz') or fail('popitem 3')\n"
-                + "d.popitem() == (1, 'foo') or fail('popitem 1')\n"
-                + "d == {} or fail('popitem 4')\n"
-                + "d.popitem()");
-  }
-
-  @Test
-  public void testDictionaryUpdate() throws Exception {
-    ev.new Scenario()
-        .setUp("foo = {'a': 2}", "foo.update({'b': 4})")
-        .testEval("foo", "{'a': 2, 'b': 4}");
-    ev.new Scenario()
-        .setUp("foo = {'a': 2}", "foo.update({'a': 3, 'b': 4})")
-        .testEval("foo", "{'a': 3, 'b': 4}");
-  }
-
-  @Test
-  public void testDictionarySetDefault() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .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)");
-  }
-
-  @Test
-  public void testHash() throws Exception {
-    // We specify the same string hashing algorithm as String.hashCode().
-    ev.new Scenario()
-        .testExpression("hash('starlark')", "starlark".hashCode())
-        .testExpression("hash('google')", "google".hashCode())
-        .testIfErrorContains(
-            "in call to hash(), parameter 'value' got value of type 'NoneType', want 'string'",
-            "hash(None)");
-  }
-
-  @Test
-  public void testRangeType() throws Exception {
-    ev.new Scenario()
-        .setUp("a = range(3)")
-        .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 binary operation: range + range", "a + a")
-        .testIfErrorContains("'range' value has no field or method 'append'", "a.append(3)")
-        .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]")
-        .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 binary operation: range * int", "range(3) * 3")
-        .testIfErrorContains("Cannot compare range objects", "range(3) < range(5)")
-        .testIfErrorContains("Cannot compare range objects", "range(4) > [1]")
-        .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)
-        .testExpression("str(list(range(1, 10, 2)))", "[1, 3, 5, 7, 9]")
-        .testExpression("str(range(1, 10, 2)[:99])", "range(1, 11, 2)")
-        .testExpression("range(1, 10, 2) == range(1, 11, 2)", true)
-        .testExpression("range(1, 10, 2) == range(1, 12, 2)", false)
-        // x in range(...), +ve step
-        .testExpression("2          in range(3, 0x7ffffffd, 2)", false) // too low
-        .testExpression("3          in range(3, 0x7ffffffd, 2)", true) // in range
-        .testExpression("4          in range(3, 0x7ffffffd, 2)", false) // even
-        .testExpression("5          in range(3, 0x7ffffffd, 2)", true) // in range
-        .testExpression("0x7ffffffb in range(3, 0x7ffffffd, 2)", true) // in range
-        .testExpression("0x7ffffffc in range(3, 0x7ffffffd, 2)", false) // even
-        .testExpression("0x7ffffffd in range(3, 0x7ffffffd, 2)", false) // too high
-        // x in range(...), -ve step
-        .testExpression("0x7ffffffe in range(0x7ffffffd, 3, -2)", false) // too high
-        .testExpression("0x7ffffffd in range(0x7ffffffd, 3, -2)", true) // in range
-        .testExpression("0x7ffffffc in range(0x7ffffffd, 3, -2)", false) // even
-        .testExpression("0x7ffffffb in range(0x7ffffffd, 3, -2)", true) // in range
-        .testExpression("5          in range(0x7ffffffd, 3, -2)", true) // in range
-        .testExpression("4          in range(0x7ffffffd, 3, -2)", false) // even
-        .testExpression("3          in range(0x7ffffffd, 3, -2)", false); // too low
-  }
-
-  @Test
-  public void testEnumerate() throws Exception {
-    ev.new Scenario()
-        .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
-  public void testEnumerateBadArg() throws Exception {
-    ev.new Scenario().testIfErrorContains("type 'string' is not iterable", "enumerate('a')");
-  }
-
-  @Test
-  public void testReassignmentOfPrimitivesNotForbiddenByCoreLanguage() throws Exception {
-    ev.new Scenario()
-        .setUp("cc_binary = (['hello.cc'])")
-        .testIfErrorContains(
-            "'list' object is not callable",
-            "cc_binary(name = 'hello', srcs=['hello.cc'], malloc = '//base:system_malloc')");
-  }
-
-  @Test
-  public void testLenOnString() throws Exception {
-    ev.new Scenario().testExpression("len('abc')", 3);
-  }
-
-  @Test
-  public void testLenOnList() throws Exception {
-    ev.new Scenario().testExpression("len([1,2,3])", 3);
-  }
-
-  @Test
-  public void testLenOnDict() throws Exception {
-    ev.new Scenario().testExpression("len({'a' : 1, 'b' : 2})", 2);
-  }
-
-  @Test
-  public void testLenOnBadType() throws Exception {
-    ev.new Scenario().testIfErrorContains("int is not iterable", "len(1)");
-  }
-
-  @Test
-  public void testIndexOnFunction() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("type 'function' has no operator [](int)", "len[1]")
-        .testIfErrorContains("invalid slice operand: function", "len[1:4]");
-  }
-
-  @Test
-  public void testBool() throws Exception {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario()
-        .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 {
-    ev.new Scenario().setUp("def foo(x): pass").testExpression("str(foo)", "<function foo>");
-  }
-
-  @Test
-  public void testType() throws Exception {
-    ev.new Scenario()
-        .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");
-  }
-
-  @Test
-  public void testZipFunction() throws Exception {
-    ev.new Scenario()
-        .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)");
-  }
-
-  /**
-   * Assert that lstrip(), rstrip(), and strip() produce the expected result for a given input
-   * string and chars argument. If chars is null no argument is passed.
-   */
-  private void checkStrip(
-      String input, Object chars,
-      String expLeft, String expRight, String expBoth) throws Exception {
-    if (chars == null) {
-      ev.new Scenario()
-          .update("s", input)
-          .testExpression("s.lstrip()", expLeft)
-          .testExpression("s.rstrip()", expRight)
-          .testExpression("s.strip()", expBoth);
-    } else {
-      ev.new Scenario()
-          .update("s", input)
-          .update("chars", chars)
-          .testExpression("s.lstrip(chars)", expLeft)
-          .testExpression("s.rstrip(chars)", expRight)
-          .testExpression("s.strip(chars)", expBoth);
-    }
-  }
-
-  @Test
-  public void testStrip() throws Exception {
-    // Strip nothing.
-    checkStrip("a b c", "", "a b c", "a b c", "a b c");
-    checkStrip(" a b c ", "", " a b c ", " a b c ", " a b c ");
-    // Normal case, found and not found.
-    checkStrip("abcba", "ba", "cba", "abc", "c");
-    checkStrip("abc", "xyz", "abc", "abc", "abc");
-    // Default whitespace.
-    checkStrip(" a b c ", null, "a b c ", " a b c", "a b c");
-    checkStrip(" a b c ", Starlark.NONE, "a b c ", " a b c", "a b c");
-    // Default whitespace with full range of Latin-1 whitespace chars.
-    String whitespace = "\u0009\n\u000B\u000C\r\u001C\u001D\u001E\u001F\u0020\u0085\u00A0";
-    checkStrip(
-        whitespace + "a" + whitespace, null,
-        "a" + whitespace, whitespace + "a", "a");
-    checkStrip(
-        whitespace + "a" + whitespace, Starlark.NONE, "a" + whitespace, whitespace + "a", "a");
-    // Empty cases.
-    checkStrip("", "", "", "", "");
-    checkStrip("abc", "abc", "", "", "");
-    checkStrip("", "xyz", "", "", "");
-    checkStrip("", null, "", "", "");
-  }
-
-  @Test
-  public void testFail() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("abc", "fail('abc')")
-        .testIfErrorContains("18", "fail(18)");
-  }
-
-  @Test
-  public void testTupleCoercion() throws Exception {
-    ev.new Scenario()
-        .testExpression("tuple([1, 2]) == (1, 2)", true)
-        // Depends on current implementation of dict
-        .testExpression("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
-  }
-
-  @Test
-  public void testPositionalOnlyArgument() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "join() got named argument for positional-only parameter 'elements'",
-            "','.join(elements=['foo', 'bar'])");
-  }
-
-  @Test
-  public void testStringJoinRequiresStrings() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "expected string for sequence element 1, got 'int'", "', '.join(['foo', 2])");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java
deleted file mode 100644
index 4c527fd..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/MutabilityTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.devtools.build.lib.syntax.Mutability.Freezable;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link Mutability}. */
-@RunWith(JUnit4.class)
-public final class MutabilityTest {
-
-  /** A trivial Freezable that can do nothing but freeze. */
-  private static class DummyFreezable implements Mutability.Freezable {
-    private final Mutability mutability;
-
-    public DummyFreezable(Mutability mutability) {
-      this.mutability = mutability;
-    }
-
-    @Override
-    public Mutability mutability() {
-      return mutability;
-    }
-  }
-
-  private static void assertCheckMutableFailsBecauseFrozen(DummyFreezable x) {
-    EvalException ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
-    assertThat(ex).hasMessageThat().contains("trying to mutate a frozen DummyFreezable value");
-  }
-
-  @Test
-  public void freeze() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    DummyFreezable dummy = new DummyFreezable(mutability);
-
-    Starlark.checkMutable(dummy);
-    mutability.freeze();
-    assertCheckMutableFailsBecauseFrozen(dummy);
-  }
-
-  @Test
-  public void tryWithResources() throws Exception {
-    DummyFreezable dummy;
-    try (Mutability mutability = Mutability.create("test")) {
-      dummy = new DummyFreezable(mutability);
-      Starlark.checkMutable(dummy);
-    }
-    assertCheckMutableFailsBecauseFrozen(dummy);
-  }
-
-  @Test
-  public void initiallyMutable() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    DummyFreezable dummy = new DummyFreezable(mutability);
-
-    Starlark.checkMutable(dummy);
-  }
-
-  @Test
-  public void temporarilyImmutableDuringIteration() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    DummyFreezable x = new DummyFreezable(mutability);
-    x.updateIteratorCount(+1);
-    EvalException ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
-    assertThat(ex)
-        .hasMessageThat()
-        .contains("DummyFreezable value is temporarily immutable due to active for-loop iteration");
-
-    x.updateIteratorCount(+1);
-    x.updateIteratorCount(-1); // net +1 => still immutable
-    ex = assertThrows(EvalException.class, () -> Starlark.checkMutable(x));
-    assertThat(ex)
-        .hasMessageThat()
-        .contains("DummyFreezable value is temporarily immutable due to active for-loop iteration");
-
-    x.updateIteratorCount(-1); // net 0 => mutable
-    Starlark.checkMutable(x); // ok
-
-    assertThrows(IllegalStateException.class, () -> x.updateIteratorCount(-1)); // underflow
-  }
-
-  @Test
-  public void addIteratorAndThenFreeze() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    DummyFreezable dummy = new DummyFreezable(mutability);
-    dummy.updateIteratorCount(+1);
-    mutability.freeze();
-    // Should fail with frozen error, not temporarily immutable error.
-    assertCheckMutableFailsBecauseFrozen(dummy);
-  }
-
-  @Test
-  public void checkUnsafeShallowFreezePrecondition_FailsWhenAlreadyFrozen() throws Exception {
-    Mutability mutability = Mutability.create("test").freeze();
-    assertThrows(
-        IllegalArgumentException.class,
-        () -> Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability)));
-  }
-
-  @Test
-  public void checkUnsafeShallowFreezePrecondition_FailsWhenDisallowed() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    assertThrows(
-        IllegalArgumentException.class,
-        () -> Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability)));
-  }
-
-  @Test
-  public void checkUnsafeShallowFreezePrecondition_SucceedsWhenAllowed() throws Exception {
-    Mutability mutability = Mutability.createAllowingShallowFreeze("test");
-    Freezable.checkUnsafeShallowFreezePrecondition(new DummyFreezable(mutability));
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java
deleted file mode 100644
index bddabbb..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodePrinterTest.java
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright 2017 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests {@link Node#toString} and {@code NodePrinter}. */
-@RunWith(JUnit4.class)
-public final class NodePrinterTest {
-
-  private static StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    StarlarkFile file = StarlarkFile.parse(input);
-    if (!file.ok()) {
-      throw new SyntaxError.Exception(file.errors());
-    }
-    return file;
-  }
-
-  private static Statement parseStatement(String... lines) throws SyntaxError.Exception {
-    return parseFile(lines).getStatements().get(0);
-  }
-
-  private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
-    return Expression.parse(ParserInput.fromLines(lines));
-  }
-
-  private static String join(String... lines) {
-    return Joiner.on("\n").join(lines);
-  }
-
-  /**
-   * Asserts that the given node's pretty print at a given indent level matches the given string.
-   */
-  private static void assertPrettyMatches(Node node, int indentLevel, String expected) {
-    StringBuilder buf = new StringBuilder();
-    new NodePrinter(buf, indentLevel).printNode(node);
-    assertThat(buf.toString()).isEqualTo(expected);
-  }
-
-  /** Asserts that the given node's pretty print with no indent matches the given string. */
-  private static void assertPrettyMatches(Node node, String expected) {
-    assertPrettyMatches(node, 0, expected);
-  }
-
-  /** Asserts that the given node's pretty print with one indent matches the given string. */
-  private static void assertIndentedPrettyMatches(Node node, String expected) {
-    assertPrettyMatches(node, 1, expected);
-  }
-
-  /** Asserts that the given node's {@code toString} matches the given string. */
-  private static void assertTostringMatches(Node node, String expected) {
-    assertThat(node.toString()).isEqualTo(expected);
-  }
-
-  /**
-   * Parses the given string as an expression, and asserts that its pretty print matches the given
-   * string.
-   */
-  private static void assertExprPrettyMatches(String source, String expected)
-      throws SyntaxError.Exception {
-      Expression node = parseExpression(source);
-      assertPrettyMatches(node, expected);
-  }
-
-  /**
-   * Parses the given string as an expression, and asserts that its {@code toString} matches the
-   * given string.
-   */
-  private static void assertExprTostringMatches(String source, String expected)
-      throws SyntaxError.Exception {
-      Expression node = parseExpression(source);
-      assertThat(node.toString()).isEqualTo(expected);
-  }
-
-  /**
-   * Parses the given string as an expression, and asserts that both its pretty print and {@code
-   * toString} return the original string.
-   */
-  private static void assertExprBothRoundTrip(String source) throws SyntaxError.Exception {
-    assertExprPrettyMatches(source, source);
-    assertExprTostringMatches(source, source);
-  }
-
-  /**
-   * Parses the given string as a statement, and asserts that its pretty print with one indent
-   * matches the given string.
-   */
-  private static void assertStmtIndentedPrettyMatches(String source, String expected)
-      throws SyntaxError.Exception {
-    Statement node = parseStatement(source);
-    assertIndentedPrettyMatches(node, expected);
-  }
-
-  /**
-   * Parses the given string as an statement, and asserts that its {@code toString} matches the
-   * given string.
-   */
-  private static void assertStmtTostringMatches(String source, String expected)
-      throws SyntaxError.Exception {
-    Statement node = parseStatement(source);
-    assertThat(node.toString()).isEqualTo(expected);
-  }
-
-  // Expressions.
-
-  @Test
-  public void abstractComprehension() throws SyntaxError.Exception {
-    // Covers DictComprehension and ListComprehension.
-    assertExprBothRoundTrip("[z for y in x if True for z in y]");
-    assertExprBothRoundTrip("{z: x for y in x if True for z in y}");
-  }
-
-  @Test
-  public void binaryOperatorExpression() throws SyntaxError.Exception {
-    assertExprPrettyMatches("1 + 2", "(1 + 2)");
-    assertExprTostringMatches("1 + 2", "1 + 2");
-
-    assertExprPrettyMatches("1 + (2 * 3)", "(1 + (2 * 3))");
-    assertExprTostringMatches("1 + (2 * 3)", "1 + 2 * 3");
-  }
-
-  @Test
-  public void conditionalExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("1 if True else 2");
-  }
-
-  @Test
-  public void dictExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("{1: \"a\", 2: \"b\"}");
-  }
-
-  @Test
-  public void dotExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("o.f");
-  }
-
-  @Test
-  public void funcallExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("f()");
-    assertExprBothRoundTrip("f(a)");
-    assertExprBothRoundTrip("f(a, b = B, c = C, *d, **e)");
-    assertExprBothRoundTrip("o.f()");
-  }
-
-  @Test
-  public void identifier() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("foo");
-  }
-
-  @Test
-  public void indexExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("a[i]");
-  }
-
-  @Test
-  public void integerLiteral() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("5");
-  }
-
-  @Test
-  public void listLiteralShort() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("[]");
-    assertExprBothRoundTrip("[5]");
-    assertExprBothRoundTrip("[5, 6]");
-    assertExprBothRoundTrip("()");
-    assertExprBothRoundTrip("(5,)");
-    assertExprBothRoundTrip("(5, 6)");
-  }
-
-  @Test
-  public void listLiteralLong() throws SyntaxError.Exception {
-    // List literals with enough elements to trigger the abbreviated toString() format.
-    assertExprPrettyMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, 5, 6]");
-    assertExprTostringMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, +2 more]");
-
-    assertExprPrettyMatches("(1, 2, 3, 4, 5, 6)", "(1, 2, 3, 4, 5, 6)");
-    assertExprTostringMatches("(1, 2, 3, 4, 5, 6)", "(1, 2, 3, 4, +2 more)");
-  }
-
-  @Test
-  public void listLiteralNested() throws SyntaxError.Exception {
-    // Make sure that the inner list doesn't get abbreviated when the outer list is printed using
-    // prettyPrint().
-    assertExprPrettyMatches(
-        "[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]",
-        "[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]");
-    // It doesn't matter as much what toString does.
-    assertExprTostringMatches("[1, 2, 3, [10, 20, 30, 40, 50, 60], 4, 5, 6]", "[1, 2, 3, +4 more]");
-  }
-
-  @Test
-  public void sliceExpression() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("a[b:c:d]");
-    assertExprBothRoundTrip("a[b:c]");
-    assertExprBothRoundTrip("a[b:]");
-    assertExprBothRoundTrip("a[:c:d]");
-    assertExprBothRoundTrip("a[:c]");
-    assertExprBothRoundTrip("a[::d]");
-    assertExprBothRoundTrip("a[:]");
-  }
-
-  @Test
-  public void stringLiteral() throws SyntaxError.Exception {
-    assertExprBothRoundTrip("\"foo\"");
-    assertExprBothRoundTrip("\"quo\\\"ted\"");
-  }
-
-  @Test
-  public void unaryOperatorExpression() throws SyntaxError.Exception {
-    assertExprPrettyMatches("not True", "not (True)");
-    assertExprTostringMatches("not True", "not True");
-    assertExprPrettyMatches("-5", "-(5)");
-    assertExprTostringMatches("-5", "-5");
-  }
-
-  // Statements.
-
-  @Test
-  public void assignmentStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches("x = y", "  x = y\n");
-    assertStmtTostringMatches("x = y", "x = y\n");
-  }
-
-  @Test
-  public void augmentedAssignmentStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches("x += y", "  x += y\n");
-    assertStmtTostringMatches("x += y", "x += y\n");
-  }
-
-  @Test
-  public void expressionStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches("5", "  5\n");
-    assertStmtTostringMatches("5", "5\n");
-  }
-
-  @Test
-  public void defStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches(
-        join("def f(x):",
-             "  print(x)"),
-        join("  def f(x):",
-             "    print(x)",
-             ""));
-    assertStmtTostringMatches(
-        join("def f(x):",
-             "  print(x)"),
-        "def f(x): ...\n");
-
-    assertStmtIndentedPrettyMatches(
-        join("def f(a, b=B, *c, d=D, **e):",
-             "  print(x)"),
-        join("  def f(a, b=B, *c, d=D, **e):",
-             "    print(x)",
-             ""));
-    assertStmtTostringMatches(
-        join(
-            "def f(a, b=B, *c, d=D, **e):", //
-            "  print(x)"),
-        "def f(a, b=B, *c, d=D, **e): ...\n");
-
-    assertStmtIndentedPrettyMatches(
-        join("def f():",
-             "  pass"),
-        join("  def f():",
-             "    pass",
-             ""));
-    assertStmtTostringMatches(
-        join("def f():",
-             "  pass"),
-        "def f(): ...\n");
-  }
-
-  @Test
-  public void flowStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches(
-        join("def f():", "     pass", "     continue", "     break"),
-        join("  def f():", "    pass", "    continue", "    break", ""));
-  }
-
-  @Test
-  public void forStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches(
-        join("for x in y:",
-             "  print(x)"),
-        join("  for x in y:",
-             "    print(x)",
-             ""));
-    assertStmtTostringMatches(
-        join("for x in y:",
-             "  print(x)"),
-        "for x in y: ...\n");
-
-    assertStmtIndentedPrettyMatches(
-        join("for x in y:",
-             "  pass"),
-        join("  for x in y:",
-             "    pass",
-             ""));
-    assertStmtTostringMatches(
-        join("for x in y:",
-             "  pass"),
-        "for x in y: ...\n");
-  }
-
-  @Test
-  public void ifStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches(
-        join("if True:",
-             "  print(x)"),
-        join("  if True:",
-             "    print(x)",
-             ""));
-    assertStmtTostringMatches(
-        join("if True:",
-             "  print(x)"),
-        "if True: ...\n");
-
-    assertStmtIndentedPrettyMatches(
-        join("if True:",
-             "  print(x)",
-             "elif False:",
-             "  print(y)",
-             "else:",
-             "  print(z)"),
-        join("  if True:",
-             "    print(x)",
-             "  elif False:",
-             "    print(y)",
-             "  else:",
-             "    print(z)",
-             ""));
-    assertStmtTostringMatches(
-        join("if True:",
-            "  print(x)",
-            "elif False:",
-            "  print(y)",
-            "else:",
-            "  print(z)"),
-        "if True: ...\n");
-  }
-
-  @Test
-  public void loadStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches(
-        "load(\"foo.bzl\", a=\"A\", \"B\")", "  load(\"foo.bzl\", a=\"A\", \"B\")\n");
-    assertStmtTostringMatches(
-        "load(\"foo.bzl\", a=\"A\", \"B\")\n", "load(\"foo.bzl\", a=\"A\", \"B\")\n");
-  }
-
-  @Test
-  public void returnStatement() throws SyntaxError.Exception {
-    assertStmtIndentedPrettyMatches("return \"foo\"", "  return \"foo\"\n");
-    assertStmtTostringMatches("return \"foo\"", "return \"foo\"\n");
-
-    assertStmtIndentedPrettyMatches("return None", "  return None\n");
-    assertStmtTostringMatches("return None", "return None\n");
-
-    assertStmtIndentedPrettyMatches("return", "  return\n");
-    assertStmtTostringMatches("return", "return\n");
-  }
-
-  // Miscellaneous.
-
-  @Test
-  public void file() throws SyntaxError.Exception {
-    Node node = parseFile("print(x)\nprint(y)");
-    assertIndentedPrettyMatches(
-        node,
-        join("  print(x)",
-             "  print(y)",
-             ""));
-    assertTostringMatches(node, "<StarlarkFile with 2 statements>");
-  }
-
-  @Test
-  public void comment() throws SyntaxError.Exception {
-    ParserInput input =
-        ParserInput.fromLines(
-            "# foo", //
-            "expr # bar");
-    Parser.ParseResult r = Parser.parseFile(input, FileOptions.DEFAULT);
-    Comment c0 = r.comments.get(0);
-    assertIndentedPrettyMatches(c0, "  # foo");
-    assertTostringMatches(c0, "# foo");
-    Comment c1 = r.comments.get(1);
-    assertIndentedPrettyMatches(c1, "  # bar");
-    assertTostringMatches(c1, "# bar");
-  }
-
-  /* Not tested explicitly because they're covered implicitly by tests for other nodes:
-   * - DictExpression.Entry
-   * - Argument / Parameter
-   * - IfStatements
-   */
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
deleted file mode 100644
index 2b7dcaa..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for @{code NodeVisitor} */
-@RunWith(JUnit4.class)
-public final class NodeVisitorTest {
-
-  private static StarlarkFile parse(String... lines) throws SyntaxError.Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    StarlarkFile file = StarlarkFile.parse(input);
-    if (!file.ok()) {
-      throw new SyntaxError.Exception(file.errors());
-    }
-    return file;
-  }
-
-  @Test
-  public void everyIdentifierAndParameterIsVisitedInOrder() throws Exception {
-    final List<String> idents = new ArrayList<>();
-    final List<String> params = new ArrayList<>();
-
-    class IdentVisitor extends NodeVisitor {
-      @Override
-      public void visit(Identifier node) {
-        idents.add(node.getName());
-      }
-
-      @Override
-      public void visit(Parameter node) {
-        params.add(node.toString());
-      }
-    }
-
-    StarlarkFile file =
-        parse(
-            "a = b", //
-            "def c(p1, p2=4, **p3):",
-            "  for d in e: f(g)",
-            "  return h + i.j()");
-    IdentVisitor visitor = new IdentVisitor();
-    file.accept(visitor);
-    assertThat(idents).containsExactly("b", "a", "c", "e", "d", "f", "g", "h", "i", "j").inOrder();
-    assertThat(params).containsExactly("p1", "p2=4", "**p3").inOrder();
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java
deleted file mode 100644
index d231913..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-
-import java.io.IOException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** A test case for {@link ParserInput}. */
-@RunWith(JUnit4.class)
-public class ParserInputTest {
-
-  @Test
-  public void testFromLatin1() throws IOException {
-    String content = "éclair";
-    byte[] bytes = content.getBytes(ISO_8859_1);
-    ParserInput input = ParserInput.fromLatin1(bytes, "foo.txt");
-    assertThat(new String(input.getContent())).isEqualTo(content);
-    assertThat(input.getFile()).isEqualTo("foo.txt");
-  }
-
-  @Test
-  public void testFromString() {
-    String content = "Content provided as a string.";
-    String pathName = "/the/name/of/the/content.txt";
-    ParserInput input = ParserInput.fromString(content, pathName);
-    assertThat(new String(input.getContent())).isEqualTo(content);
-    assertThat(input.getFile()).isEqualTo(pathName);
-  }
-
-  @Test
-  public void testFromCharArray() {
-    String content = "Content provided as a string.";
-    String pathName = "/the/name/of/the/content.txt";
-    char[] contentChars = content.toCharArray();
-    ParserInput input = ParserInput.fromCharArray(contentChars, pathName);
-    assertThat(new String(input.getContent())).isEqualTo(content);
-    assertThat(input.getFile()).isEqualTo(pathName);
-  }
-
-  @Test
-  public void testWillNotTryToReadInputFileIfContentProvidedAsString() {
-    ParserInput.fromString("Content provided as string.", "/will/not/try/to/read");
-  }
-
-  @Test
-  public void testWillNotTryToReadInputFileIfContentProvidedAsChars() {
-    char[] content = "Content provided as char array.".toCharArray();
-    ParserInput.fromCharArray(content, "/will/not/try/to/read");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
deleted file mode 100644
index dd16ea3..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ /dev/null
@@ -1,1315 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of parser. */
-@RunWith(JUnit4.class)
-public final class ParserTest {
-
-  private final List<SyntaxError> events = new ArrayList<>();
-  private boolean failFast = true;
-
-  private SyntaxError assertContainsError(String expectedMessage) {
-    return LexerTest.assertContainsError(events, expectedMessage);
-  }
-
-  private void setFailFast(boolean failFast) {
-    this.failFast = failFast;
-  }
-
-  // Joins the lines, parse, and returns an expression.
-  private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    return Expression.parse(input);
-  }
-
-  // Parses the expression, asserts that parsing fails,
-  // and returns the first error message.
-  private static String parseExpressionError(String src) {
-    ParserInput input = ParserInput.fromLines(src);
-    try {
-      Expression.parse(input);
-      throw new AssertionError("parseExpression(%s) succeeded unexpectedly: " + src);
-    } catch (SyntaxError.Exception ex) {
-      return ex.errors().get(0).message();
-    }
-  }
-
-  // Joins the lines, parses, and returns a file.
-  // Errors are added to this.events, or thrown if this.failFast;
-  private StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    StarlarkFile file = StarlarkFile.parse(input);
-    if (!file.ok()) {
-      if (failFast) {
-        throw new SyntaxError.Exception(file.errors());
-      }
-      // TODO(adonovan): return these, and eliminate a stateful field.
-      events.addAll(file.errors());
-    }
-    return file;
-  }
-
-  // Joins the lines, parses, and returns the sole statement.
-  private Statement parseStatement(String... lines) throws SyntaxError.Exception {
-    return Iterables.getOnlyElement(parseStatements(lines));
-  }
-
-  // Joins the lines, parses, and returns the statements.
-  private ImmutableList<Statement> parseStatements(String... lines) throws SyntaxError.Exception {
-    return parseFile(lines).getStatements();
-  }
-
-  private static String getText(String text, Node node) {
-    return text.substring(node.getStartOffset(), node.getEndOffset());
-  }
-
-  private static void assertLocation(int start, int end, Node node) throws Exception {
-    int actualStart = node.getStartOffset();
-    int actualEnd = node.getEndOffset();
-
-    if (actualStart != start || actualEnd != end) {
-      fail("Expected location = [" + start + ", " + end + "), found ["
-          + actualStart + ", " + actualEnd + ")");
-    }
-  }
-
-  // helper func for testListExpressions:
-  private static int getIntElem(DictExpression.Entry entry, boolean key) {
-    return ((IntegerLiteral) (key ? entry.getKey() : entry.getValue())).getValue();
-  }
-
-  // helper func for testListExpressions:
-  private static int getIntElem(ListExpression list, int index) {
-    return ((IntegerLiteral) list.getElements().get(index)).getValue();
-  }
-
-  // helper func for testListExpressions:
-  private static DictExpression.Entry getElem(DictExpression list, int index) {
-    return list.getEntries().get(index);
-  }
-
-  // helper func for testListExpressions:
-  private static Expression getElem(ListExpression list, int index) {
-    return list.getElements().get(index);
-  }
-
-  // helper func for testing arguments:
-  private static Expression getArg(CallExpression f, int index) {
-    return f.getArguments().get(index).getValue();
-  }
-
-  @Test
-  public void testPrecedence1() throws Exception {
-    BinaryOperatorExpression e =
-      (BinaryOperatorExpression) parseExpression("'%sx' % 'foo' + 'bar'");
-
-    assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
-  }
-
-  @Test
-  public void testPrecedence2() throws Exception {
-    BinaryOperatorExpression e =
-      (BinaryOperatorExpression) parseExpression("('%sx' % 'foo') + 'bar'");
-    assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
-  }
-
-  @Test
-  public void testPrecedence3() throws Exception {
-    BinaryOperatorExpression e =
-      (BinaryOperatorExpression) parseExpression("'%sx' % ('foo' + 'bar')");
-    assertThat(e.getOperator()).isEqualTo(TokenKind.PERCENT);
-  }
-
-  @Test
-  public void testPrecedence4() throws Exception {
-    BinaryOperatorExpression e =
-        (BinaryOperatorExpression) parseExpression("1 + - (2 - 3)");
-    assertThat(e.getOperator()).isEqualTo(TokenKind.PLUS);
-  }
-
-  @Test
-  public void testPrecedence5() throws Exception {
-    BinaryOperatorExpression e =
-        (BinaryOperatorExpression) parseExpression("2 * x | y + 1");
-    assertThat(e.getOperator()).isEqualTo(TokenKind.PIPE);
-  }
-
-  @Test
-  public void testNonAssociativeOperators() throws Exception {
-    assertThat(parseExpressionError("0 < 2 < 4"))
-        .contains("Operator '<' is not associative with operator '<'");
-    assertThat(parseExpressionError("0 == 2 < 4"))
-        .contains("Operator '==' is not associative with operator '<'");
-    assertThat(parseExpressionError("1 in [1, 2] == True"))
-        .contains("Operator 'in' is not associative with operator '=='");
-    assertThat(parseExpressionError("1 >= 2 <= 3"))
-        .contains("Operator '>=' is not associative with operator '<='");
-  }
-
-  @Test
-  public void testNonAssociativeOperatorsWithParens() throws Exception {
-    parseExpression("(0 < 2) < 4");
-    parseExpression("(0 == 2) < 4");
-    parseExpression("(1 in [1, 2]) == True");
-    parseExpression("1 >= (2 <= 3)");
-  }
-
-  @Test
-  public void testUnaryMinusExpr() throws Exception {
-    UnaryOperatorExpression e = (UnaryOperatorExpression) parseExpression("-5");
-    UnaryOperatorExpression e2 = (UnaryOperatorExpression) parseExpression("- 5");
-
-    IntegerLiteral i = (IntegerLiteral) e.getX();
-    assertThat(i.getValue()).isEqualTo(5);
-    IntegerLiteral i2 = (IntegerLiteral) e2.getX();
-    assertThat(i2.getValue()).isEqualTo(5);
-    assertLocation(0, 2, e);
-    assertLocation(0, 3, e2);
-  }
-
-  @Test
-  public void testFuncallExpr() throws Exception {
-    CallExpression e = (CallExpression) parseExpression("foo[0](1, 2, bar=wiz)");
-
-    IndexExpression function = (IndexExpression) e.getFunction();
-    Identifier functionList = (Identifier) function.getObject();
-    assertThat(functionList.getName()).isEqualTo("foo");
-    IntegerLiteral listIndex = (IntegerLiteral) function.getKey();
-    assertThat(listIndex.getValue()).isEqualTo(0);
-
-    assertThat(e.getArguments()).hasSize(3);
-    assertThat(e.getNumPositionalArguments()).isEqualTo(2);
-
-    IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertThat((int) arg0.getValue()).isEqualTo(1);
-
-    IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
-    assertThat((int) arg1.getValue()).isEqualTo(2);
-
-    Argument arg2 = e.getArguments().get(2);
-    assertThat(arg2.getName()).isEqualTo("bar");
-    Identifier arg2val = (Identifier) arg2.getValue();
-    assertThat(arg2val.getName()).isEqualTo("wiz");
-  }
-
-  @Test
-  public void testMethCallExpr() throws Exception {
-    CallExpression e = (CallExpression) parseExpression("foo.foo(1, 2, bar=wiz)");
-
-    DotExpression dotExpression = (DotExpression) e.getFunction();
-    assertThat(dotExpression.getField().getName()).isEqualTo("foo");
-
-    assertThat(e.getArguments()).hasSize(3);
-    assertThat(e.getNumPositionalArguments()).isEqualTo(2);
-
-    IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertThat((int) arg0.getValue()).isEqualTo(1);
-
-    IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
-    assertThat((int) arg1.getValue()).isEqualTo(2);
-
-    Argument arg2 = e.getArguments().get(2);
-    assertThat(arg2.getName()).isEqualTo("bar");
-    Identifier arg2val = (Identifier) arg2.getValue();
-    assertThat(arg2val.getName()).isEqualTo("wiz");
-  }
-
-  @Test
-  public void testChainedMethCallExpr() throws Exception {
-    CallExpression e = (CallExpression) parseExpression("foo.replace().split(1)");
-
-    DotExpression dotExpr = (DotExpression) e.getFunction();
-    assertThat(dotExpr.getField().getName()).isEqualTo("split");
-
-    assertThat(e.getArguments()).hasSize(1);
-    assertThat(e.getNumPositionalArguments()).isEqualTo(1);
-
-    IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertThat((int) arg0.getValue()).isEqualTo(1);
-  }
-
-  @Test
-  public void testPropRefExpr() throws Exception {
-    DotExpression e = (DotExpression) parseExpression("foo.foo");
-
-    Identifier ident = e.getField();
-    assertThat(ident.getName()).isEqualTo("foo");
-  }
-
-  @Test
-  public void testStringMethExpr() throws Exception {
-    CallExpression e = (CallExpression) parseExpression("'foo'.foo()");
-
-    DotExpression dotExpression = (DotExpression) e.getFunction();
-    assertThat(dotExpression.getField().getName()).isEqualTo("foo");
-
-    assertThat(e.getArguments()).isEmpty();
-  }
-
-  @Test
-  public void testStringLiteralOptimizationValue() throws Exception {
-    StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertThat(l.getValue()).isEqualTo("abcdef");
-  }
-
-  @Test
-  public void testStringLiteralOptimizationToString() throws Exception {
-    StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertThat(l.toString()).isEqualTo("\"abcdef\"");
-  }
-
-  @Test
-  public void testStringLiteralOptimizationLocation() throws Exception {
-    StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertThat(l.getStartOffset()).isEqualTo(0);
-    assertThat(l.getEndOffset()).isEqualTo(13);
-  }
-
-  @Test
-  public void testStringLiteralOptimizationDifferentQuote() throws Exception {
-    StringLiteral l = (StringLiteral) parseExpression("'abc' + \"def\"");
-    assertThat(l.getStartOffset()).isEqualTo(0);
-    assertThat(l.getEndOffset()).isEqualTo(13);
-  }
-
-  @Test
-  public void testIndex() throws Exception {
-    IndexExpression e = (IndexExpression) parseExpression("a[i]");
-    assertThat(e.getObject().toString()).isEqualTo("a");
-    assertThat(e.getKey().toString()).isEqualTo("i");
-    assertLocation(0, 4, e);
-  }
-
-  @Test
-  public void testSubstring() throws Exception {
-    SliceExpression s = (SliceExpression) parseExpression("'FOO.CC'[:].lower()[1:]");
-    assertThat(((IntegerLiteral) s.getStart()).getValue()).isEqualTo(1);
-
-    CallExpression e = (CallExpression) parseExpression("'FOO.CC'.lower()[1:].startswith('oo')");
-    DotExpression dotExpression = (DotExpression) e.getFunction();
-    assertThat(dotExpression.getField().getName()).isEqualTo("startswith");
-    assertThat(e.getArguments()).hasSize(1);
-
-    s = (SliceExpression) parseExpression("'FOO.CC'[1:][:2]");
-    assertThat(((IntegerLiteral) s.getStop()).getValue()).isEqualTo(2);
-  }
-
-  @Test
-  public void testSlice() throws Exception {
-    evalSlice("'0123'[:]", "", "", "");
-    evalSlice("'0123'[1:]", 1, "", "");
-    evalSlice("'0123'[:3]", "", 3, "");
-    evalSlice("'0123'[::]", "", "", "");
-    evalSlice("'0123'[1::]", 1, "", "");
-    evalSlice("'0123'[:3:]", "", 3, "");
-    evalSlice("'0123'[::-1]", "", "", -1);
-    evalSlice("'0123'[1:3:]", 1, 3, "");
-    evalSlice("'0123'[1::-1]", 1, "", -1);
-    evalSlice("'0123'[:3:-1]", "", 3, -1);
-    evalSlice("'0123'[1:3:-1]", 1, 3, -1);
-
-    Expression slice = parseExpression("'0123'[1:3:-1]");
-    assertLocation(0, 14, slice);
-  }
-
-  private static void evalSlice(String statement, Object... expectedArgs)
-      throws SyntaxError.Exception {
-    SliceExpression e = (SliceExpression) parseExpression(statement);
-
-    // There is no way to evaluate the expression here, so we rely on string comparison.
-    String start = e.getStart() == null ? "" : e.getStart().toString();
-    String stop = e.getStop() == null ? "" : e.getStop().toString();
-    String step = e.getStep() == null ? "" : e.getStep().toString();
-
-    assertThat(start).isEqualTo(expectedArgs[0].toString());
-    assertThat(stop).isEqualTo(expectedArgs[1].toString());
-    assertThat(step).isEqualTo(expectedArgs[2].toString());
-  }
-
-  @Test
-  public void testErrorRecovery() throws Exception {
-    setFailFast(false);
-
-    // We call parseFile, not parseExpression, as the latter is all-or-nothing.
-    String src = "f(1, [x for foo foo foo foo], 3)";
-    CallExpression e = (CallExpression) ((ExpressionStatement) parseStatement(src)).getExpression();
-
-    assertContainsError("syntax error at 'foo'");
-
-    // Test that the arguments are (1, '[x for foo foo foo foo]', 3),
-    // where the second, errant one is represented as an Identifier.
-
-    Identifier ident = (Identifier) e.getFunction();
-    assertThat(ident.getName()).isEqualTo("f");
-
-    assertThat(e.getArguments()).hasSize(3);
-    assertThat(e.getNumPositionalArguments()).isEqualTo(3);
-
-    IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertThat((int) arg0.getValue()).isEqualTo(1);
-
-    Argument arg1 = e.getArguments().get(1);
-    Identifier arg1val = ((Identifier) arg1.getValue());
-    assertThat(arg1val.getName()).isEqualTo("[x for foo foo foo foo]");
-
-    assertLocation(5, 28, arg1val);
-    assertThat(src.substring(5, 28)).isEqualTo("[x for foo foo foo foo]");
-    assertThat(arg1val.getEndLocation().column()).isEqualTo(29);
-
-    IntegerLiteral arg2 = (IntegerLiteral) e.getArguments().get(2).getValue();
-    assertThat((int) arg2.getValue()).isEqualTo(3);
-  }
-
-  @Test
-  public void testDoesntGetStuck() throws Exception {
-    // Make sure the parser does not get stuck when trying
-    // to parse an expression containing a syntax error.
-    // This usually results in OutOfMemoryError because the
-    // parser keeps filling up the error log.
-    // We need to make sure that we will always advance
-    // in the token stream.
-    parseExpressionError("f(1, ], 3)");
-    parseExpressionError("f(1, ), 3)");
-    parseExpressionError("[ ) for v in 3)");
-  }
-
-  @Test
-  public void testPrimaryLocation() throws SyntaxError.Exception {
-    String expr = "f(1 + 2)";
-    CallExpression call = (CallExpression) parseExpression(expr);
-    Argument arg = call.getArguments().get(0);
-    assertThat(arg.getEndLocation()).isLessThan(call.getEndLocation());
-  }
-
-  @Test
-  public void testAssignLocation() throws Exception {
-    List<Statement> statements = parseStatements("a = b;c = d\n");
-    Statement statement = statements.get(0);
-    assertThat(statement.getEndOffset()).isEqualTo(5);
-  }
-
-  @Test
-  public void testAssignKeyword() throws Exception {
-    assertThat(parseExpressionError("with = 4")).contains("keyword 'with' not supported");
-  }
-
-  @Test
-  public void testBreak() throws Exception {
-    assertThat(parseExpressionError("break"))
-        .contains("syntax error at 'break': expected expression");
-  }
-
-  @Test
-  public void testTry() throws Exception {
-    assertThat(parseExpressionError("try: 1 + 1"))
-        .contains("'try' not supported, all exceptions are fatal");
-  }
-
-  @Test
-  public void testDel() throws Exception {
-    assertThat(parseExpressionError("del d['a']"))
-        .contains("'del' not supported, use '.pop()' to delete");
-  }
-
-  @Test
-  public void testTupleAssign() throws Exception {
-    List<Statement> statements = parseStatements("list[0] = 5; dict['key'] = value\n");
-    assertThat(statements).hasSize(2);
-    assertThat(statements.get(0)).isInstanceOf(AssignmentStatement.class);
-    assertThat(statements.get(1)).isInstanceOf(AssignmentStatement.class);
-  }
-
-  @Test
-  public void testAssign() throws Exception {
-    List<Statement> statements = parseStatements("a, b = 5\n");
-    assertThat(statements).hasSize(1);
-    assertThat(statements.get(0)).isInstanceOf(AssignmentStatement.class);
-    AssignmentStatement assign = (AssignmentStatement) statements.get(0);
-    assertThat(assign.getLHS()).isInstanceOf(ListExpression.class);
-  }
-
-  @Test
-  public void testInvalidAssign() throws Exception {
-    assertThat(parseExpressionError("1 + (b = c)")).contains("syntax error");
-  }
-
-  @Test
-  public void testAugmentedAssign() throws Exception {
-    assertThat(parseStatements("x += 1").toString()).isEqualTo("[x += 1\n]");
-    assertThat(parseStatements("x -= 1").toString()).isEqualTo("[x -= 1\n]");
-    assertThat(parseStatements("x *= 1").toString()).isEqualTo("[x *= 1\n]");
-    assertThat(parseStatements("x /= 1").toString()).isEqualTo("[x /= 1\n]");
-    assertThat(parseStatements("x %= 1").toString()).isEqualTo("[x %= 1\n]");
-    assertThat(parseStatements("x |= 1").toString()).isEqualTo("[x |= 1\n]");
-    assertThat(parseStatements("x &= 1").toString()).isEqualTo("[x &= 1\n]");
-    assertThat(parseStatements("x <<= 1").toString()).isEqualTo("[x <<= 1\n]");
-    assertThat(parseStatements("x >>= 1").toString()).isEqualTo("[x >>= 1\n]");
-  }
-
-  @Test
-  public void testPrettyPrintFunctions() throws Exception {
-    assertThat(parseStatements("x[1:3]").toString()).isEqualTo("[x[1:3]\n]");
-    assertThat(parseStatements("x[1:3:1]").toString()).isEqualTo("[x[1:3:1]\n]");
-    assertThat(parseStatements("x[1:3:2]").toString()).isEqualTo("[x[1:3:2]\n]");
-    assertThat(parseStatements("x[1::2]").toString()).isEqualTo("[x[1::2]\n]");
-    assertThat(parseStatements("x[1:]").toString()).isEqualTo("[x[1:]\n]");
-    assertThat(parseStatements("str[42]").toString()).isEqualTo("[str[42]\n]");
-    assertThat(parseStatements("ctx.actions.declare_file('hello')").toString())
-        .isEqualTo("[ctx.actions.declare_file(\"hello\")\n]");
-    assertThat(parseStatements("new_file(\"hello\")").toString())
-        .isEqualTo("[new_file(\"hello\")\n]");
-  }
-
-  @Test
-  public void testEndLineAndColumnIsExclusive() throws Exception {
-    // The behavior was 'inclusive' for a couple of years (see CL 170723732),
-    // but this was a mistake. Arithmetic on half-open intervals is much simpler.
-    AssignmentStatement stmt = (AssignmentStatement) parseStatement("a = b");
-    assertThat(stmt.getLHS().getEndLocation().toString()).isEqualTo(":1:2");
-  }
-
-  @Test
-  public void testFuncallLocation() throws Exception {
-    List<Statement> statements = parseStatements("a(b);c = d\n");
-    Statement statement = statements.get(0);
-    assertThat(statement.getEndOffset()).isEqualTo(4);
-  }
-
-  @Test
-  public void testListPositions() throws Exception {
-    String expr = "[0,f(1),2]";
-    assertExpressionLocationCorrect(expr);
-    ListExpression list = (ListExpression) parseExpression(expr);
-    assertThat(getText(expr, getElem(list, 0))).isEqualTo("0");
-    assertThat(getText(expr, getElem(list, 1))).isEqualTo("f(1)");
-    assertThat(getText(expr, getElem(list, 2))).isEqualTo("2");
-  }
-
-  @Test
-  public void testDictPositions() throws Exception {
-    String expr = "{1:2,2:f(1),3:4}";
-    assertExpressionLocationCorrect(expr);
-    DictExpression list = (DictExpression) parseExpression(expr);
-    assertThat(getText(expr, getElem(list, 0))).isEqualTo("1:2");
-    assertThat(getText(expr, getElem(list, 1))).isEqualTo("2:f(1)");
-    assertThat(getText(expr, getElem(list, 2))).isEqualTo("3:4");
-  }
-
-  @Test
-  public void testArgumentPositions() throws Exception {
-    String expr = "f(0,g(1,2),2)";
-    assertExpressionLocationCorrect(expr);
-    CallExpression f = (CallExpression) parseExpression(expr);
-    assertThat(getText(expr, getArg(f, 0))).isEqualTo("0");
-    assertThat(getText(expr, getArg(f, 1))).isEqualTo("g(1,2)");
-    assertThat(getText(expr, getArg(f, 2))).isEqualTo("2");
-  }
-
-  @Test
-  public void testSuffixPosition() throws Exception {
-    assertExpressionLocationCorrect("'a'.len");
-    assertExpressionLocationCorrect("'a'[0]");
-    assertExpressionLocationCorrect("'a'[0:1]");
-  }
-
-  @Test
-  public void testTuplePosition() throws Exception {
-    String input = "for a,b in []: pass";
-    ForStatement stmt = (ForStatement) parseStatement(input);
-    assertThat(getText(input, stmt.getVars())).isEqualTo("a,b");
-
-    input = "for (a,b) in []: pass";
-    stmt = (ForStatement) parseStatement(input);
-    assertThat(getText(input, stmt.getVars())).isEqualTo("(a,b)");
-
-    assertExpressionLocationCorrect("a, b");
-    assertExpressionLocationCorrect("(a, b)");
-  }
-
-  @Test
-  public void testComprehensionPosition() throws Exception {
-    assertExpressionLocationCorrect("[[] for x in []]");
-    assertExpressionLocationCorrect("{1: [] for x in []}");
-  }
-
-  @Test
-  public void testUnaryOperationPosition() throws Exception {
-    assertExpressionLocationCorrect("not True");
-  }
-
-  @Test
-  public void testLoadStatementPosition() throws Exception {
-    String input = "load(':foo.bzl', 'bar')";
-    LoadStatement stmt = (LoadStatement) parseStatement(input);
-    assertThat(getText(input, stmt)).isEqualTo(input);
-    // Also try it with another token at the end (newline), which broke the location in the past.
-    stmt = (LoadStatement) parseStatement(input + "\n");
-    assertThat(getText(input, stmt)).isEqualTo(input);
-  }
-
-  @Test
-  public void testElif() throws Exception {
-    IfStatement ifA =
-        (IfStatement)
-            parseStatement(
-                "if a:", //
-                "  pass", "elif b:", "  pass", "else:", "  pass", "");
-    IfStatement ifB = (IfStatement) Iterables.getOnlyElement(ifA.getElseBlock());
-    assertThat(ifB.isElif()).isTrue();
-
-    ifA =
-        (IfStatement)
-            parseStatement(
-                "if a:", //
-                "  pass",
-                "else:",
-                "  if b:",
-                "    pass",
-                "  else:",
-                "    pass",
-                "");
-    ifB = (IfStatement) Iterables.getOnlyElement(ifA.getElseBlock());
-    assertThat(ifB.isElif()).isFalse();
-  }
-
-  @Test
-  public void testIfStatementPosition() throws Exception {
-    assertStatementLocationCorrect("if True:\n  pass");
-    assertStatementLocationCorrect("if True:\n  pass\nelif True:\n  pass");
-    assertStatementLocationCorrect("if True:\n  pass\nelse:\n  pass");
-  }
-
-  @Test
-  public void testForStatementPosition() throws Exception {
-    assertStatementLocationCorrect("for x in []:\n  pass");
-  }
-
-  @Test
-  public void testDefStatementPosition() throws Exception {
-    assertStatementLocationCorrect("def foo():\n  pass");
-  }
-
-  private void assertStatementLocationCorrect(String stmtStr) throws SyntaxError.Exception {
-    Statement stmt = parseStatement(stmtStr);
-    assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
-    // Also try it with another token at the end (newline), which broke the location in the past.
-    stmt = parseStatement(stmtStr + "\n");
-    assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
-  }
-
-  private static void assertExpressionLocationCorrect(String exprStr) throws SyntaxError.Exception {
-    Expression expr = parseExpression(exprStr);
-    assertThat(getText(exprStr, expr)).isEqualTo(exprStr);
-    // Also try it with another token at the end (newline), which broke the location in the past.
-    expr = parseExpression(exprStr + "\n");
-    assertThat(getText(exprStr, expr)).isEqualTo(exprStr);
-  }
-
-  @Test
-  public void testForBreakContinuePass() throws Exception {
-    List<Statement> file =
-        parseStatements(
-            "def foo():", //
-            "  for i in [1, 2]:",
-            "    break",
-            "    continue",
-            "    pass",
-            "    break");
-    assertThat(file).hasSize(1);
-    List<Statement> body = ((DefStatement) file.get(0)).getBody();
-    assertThat(body).hasSize(1);
-
-    List<Statement> loop = ((ForStatement) body.get(0)).getBody();
-    assertThat(loop).hasSize(4);
-
-    assertThat(((FlowStatement) loop.get(0)).getKind()).isEqualTo(TokenKind.BREAK);
-    assertLocation(34, 39, loop.get(0));
-
-    assertThat(((FlowStatement) loop.get(1)).getKind()).isEqualTo(TokenKind.CONTINUE);
-    assertLocation(44, 52, loop.get(1));
-
-    assertThat(((FlowStatement) loop.get(2)).getKind()).isEqualTo(TokenKind.PASS);
-    assertLocation(57, 61, loop.get(2));
-
-    assertThat(((FlowStatement) loop.get(3)).getKind()).isEqualTo(TokenKind.BREAK);
-    assertLocation(66, 71, loop.get(3));
-  }
-
-  @Test
-  public void testListExpressions1() throws Exception {
-    ListExpression list = (ListExpression) parseExpression("[0,1,2]");
-    assertThat(list.isTuple()).isFalse();
-    assertThat(list.getElements()).hasSize(3);
-    assertThat(list.isTuple()).isFalse();
-    for (int i = 0; i < 3; ++i) {
-      assertThat(getIntElem(list, i)).isEqualTo(i);
-    }
-  }
-
-  @Test
-  public void testTupleLiterals2() throws Exception {
-    ListExpression tuple = (ListExpression) parseExpression("(0,1,2)");
-    assertThat(tuple.isTuple()).isTrue();
-    assertThat(tuple.getElements()).hasSize(3);
-    assertThat(tuple.isTuple()).isTrue();
-    for (int i = 0; i < 3; ++i) {
-      assertThat(getIntElem(tuple, i)).isEqualTo(i);
-    }
-  }
-
-  @Test
-  public void testTupleWithoutParens() throws Exception {
-    ListExpression tuple = (ListExpression) parseExpression("0, 1, 2");
-    assertThat(tuple.isTuple()).isTrue();
-    assertThat(tuple.getElements()).hasSize(3);
-    assertThat(tuple.isTuple()).isTrue();
-    for (int i = 0; i < 3; ++i) {
-      assertThat(getIntElem(tuple, i)).isEqualTo(i);
-    }
-  }
-
-  @Test
-  public void testTupleWithTrailingComma() throws Exception {
-    // Unlike Python, we require parens here.
-    assertThat(parseExpressionError("0, 1, 2, 3,")).contains("Trailing comma");
-    assertThat(parseExpressionError("1 + 2,")).contains("Trailing comma");
-
-    ListExpression tuple = (ListExpression) parseExpression("(0, 1, 2, 3,)");
-    assertThat(tuple.isTuple()).isTrue();
-    assertThat(tuple.getElements()).hasSize(4);
-    assertThat(tuple.isTuple()).isTrue();
-    for (int i = 0; i < 4; ++i) {
-      assertThat(getIntElem(tuple, i)).isEqualTo(i);
-    }
-  }
-
-  @Test
-  public void testTupleLiterals3() throws Exception {
-    ListExpression emptyTuple = (ListExpression) parseExpression("()");
-    assertThat(emptyTuple.isTuple()).isTrue();
-    assertThat(emptyTuple.getElements()).isEmpty();
-  }
-
-  @Test
-  public void testTupleLiterals4() throws Exception {
-    ListExpression singletonTuple = (ListExpression) parseExpression("(42,)");
-    assertThat(singletonTuple.isTuple()).isTrue();
-    assertThat(singletonTuple.getElements()).hasSize(1);
-    assertThat(getIntElem(singletonTuple, 0)).isEqualTo(42);
-  }
-
-  @Test
-  public void testTupleLiterals5() throws Exception {
-    IntegerLiteral intLit = (IntegerLiteral) parseExpression("(42)"); // not a tuple!
-    assertThat((int) intLit.getValue()).isEqualTo(42);
-  }
-
-  @Test
-  public void testListExpressions6() throws Exception {
-    ListExpression emptyList = (ListExpression) parseExpression("[]");
-    assertThat(emptyList.isTuple()).isFalse();
-    assertThat(emptyList.getElements()).isEmpty();
-  }
-
-  @Test
-  public void testListExpressions7() throws Exception {
-    ListExpression singletonList = (ListExpression) parseExpression("[42,]");
-    assertThat(singletonList.isTuple()).isFalse();
-    assertThat(singletonList.getElements()).hasSize(1);
-    assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
-  }
-
-  @Test
-  public void testListExpressions8() throws Exception {
-    ListExpression singletonList = (ListExpression) parseExpression("[42]"); // a singleton
-    assertThat(singletonList.isTuple()).isFalse();
-    assertThat(singletonList.getElements()).hasSize(1);
-    assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
-  }
-
-  @Test
-  public void testDictExpressions() throws Exception {
-    DictExpression dictionaryList =
-        (DictExpression) parseExpression("{1:42}"); // a singleton dictionary
-    assertThat(dictionaryList.getEntries()).hasSize(1);
-    DictExpression.Entry tuple = getElem(dictionaryList, 0);
-    assertThat(getIntElem(tuple, true)).isEqualTo(1);
-    assertThat(getIntElem(tuple, false)).isEqualTo(42);
-  }
-
-  @Test
-  public void testDictExpressions1() throws Exception {
-    DictExpression dictionaryList = (DictExpression) parseExpression("{}"); // an empty dictionary
-    assertThat(dictionaryList.getEntries()).isEmpty();
-  }
-
-  @Test
-  public void testDictExpressions2() throws Exception {
-    DictExpression dictionaryList =
-        (DictExpression) parseExpression("{1:42,}"); // a singleton dictionary
-    assertThat(dictionaryList.getEntries()).hasSize(1);
-    DictExpression.Entry tuple = getElem(dictionaryList, 0);
-    assertThat(getIntElem(tuple, true)).isEqualTo(1);
-    assertThat(getIntElem(tuple, false)).isEqualTo(42);
-  }
-
-  @Test
-  public void testDictExpressions3() throws Exception {
-    DictExpression dictionaryList = (DictExpression) parseExpression("{1:42,2:43,3:44}");
-    assertThat(dictionaryList.getEntries()).hasSize(3);
-    for (int i = 0; i < 3; i++) {
-      DictExpression.Entry tuple = getElem(dictionaryList, i);
-      assertThat(getIntElem(tuple, true)).isEqualTo(i + 1);
-      assertThat(getIntElem(tuple, false)).isEqualTo(i + 42);
-    }
-  }
-
-  @Test
-  public void testListExpressions9() throws Exception {
-    ListExpression singletonList =
-        (ListExpression) parseExpression("[ abi + opt_level + \'/include\' ]");
-    assertThat(singletonList.isTuple()).isFalse();
-    assertThat(singletonList.getElements()).hasSize(1);
-  }
-
-  @Test
-  public void testListComprehensionSyntax() throws Exception {
-    assertThat(parseExpressionError("[x for")).contains("syntax error at 'newline'");
-    assertThat(parseExpressionError("[x for x")).contains("syntax error at 'newline'");
-    assertThat(parseExpressionError("[x for x in")).contains("syntax error at 'newline'");
-    assertThat(parseExpressionError("[x for x in []")).contains("syntax error at 'newline'");
-    assertThat(parseExpressionError("[x for x for y in ['a']]")).contains("syntax error at 'for'");
-    assertThat(parseExpressionError("[x for x for y in 1, 2]")).contains("syntax error at 'for'");
-  }
-
-  @Test
-  public void testListComprehensionEmptyList() throws Exception {
-    List<Comprehension.Clause> clauses =
-        ((Comprehension) parseExpression("['foo/%s.java' % x for x in []]")).getClauses();
-    assertThat(clauses).hasSize(1);
-    Comprehension.For for0 = (Comprehension.For) clauses.get(0);
-    assertThat(for0.getIterable().toString()).isEqualTo("[]");
-    assertThat(for0.getVars().toString()).isEqualTo("x");
-  }
-
-  @Test
-  public void testListComprehension() throws Exception {
-    List<Comprehension.Clause> clauses =
-        ((Comprehension) parseExpression("['foo/%s.java' % x for x in ['bar', 'wiz', 'quux']]"))
-            .getClauses();
-    assertThat(clauses).hasSize(1);
-    Comprehension.For for0 = (Comprehension.For) clauses.get(0);
-    assertThat(for0.getVars().toString()).isEqualTo("x");
-    assertThat(for0.getIterable()).isInstanceOf(ListExpression.class);
-  }
-
-  @Test
-  public void testForForListComprehension() throws Exception {
-    List<Comprehension.Clause> clauses =
-        ((Comprehension)
-                parseExpression("['%s/%s.java' % (x, y) for x in ['foo', 'bar'] for y in list]"))
-            .getClauses();
-    assertThat(clauses).hasSize(2);
-    Comprehension.For for0 = (Comprehension.For) clauses.get(0);
-    assertThat(for0.getVars().toString()).isEqualTo("x");
-    assertThat(for0.getIterable()).isInstanceOf(ListExpression.class);
-    Comprehension.For for1 = (Comprehension.For) clauses.get(1);
-    assertThat(for1.getVars().toString()).isEqualTo("y");
-    assertThat(for1.getIterable()).isInstanceOf(Identifier.class);
-  }
-
-  @Test
-  public void testParserRecovery() throws Exception {
-    setFailFast(false);
-    List<Statement> statements =
-        parseStatements(
-            "def foo():",
-            "  a = 2 for 4", // parse error
-            "  b = [3, 4]",
-            "",
-            "d = 4 ada", // parse error
-            "",
-            "def bar():",
-            "  a = [3, 4]",
-            "  b = 2 * * 5", // parse error
-            "");
-
-    assertContainsError("syntax error at 'for': expected newline");
-    assertContainsError("syntax error at 'ada': expected newline");
-    assertContainsError("syntax error at '*': expected expression");
-    assertThat(events).hasSize(3);
-    assertThat(statements).hasSize(3);
-  }
-
-  @Test
-  public void testParserContainsErrors() throws Exception {
-    setFailFast(false);
-    parseFile("*");
-    assertContainsError("syntax error at '*'");
-  }
-
-  @Test
-  public void testSemicolonAndNewline() throws Exception {
-    List<Statement> stmts =
-        parseStatements(
-            "foo='bar'; foo(bar)", //
-            "",
-            "foo='bar'; foo(bar)");
-    assertThat(stmts).hasSize(4);
-  }
-
-  @Test
-  public void testSemicolonAndNewline2() throws Exception {
-    setFailFast(false);
-    List<Statement> stmts = parseStatements("foo='foo' error(bar)", "", "");
-    assertContainsError("syntax error at 'error'");
-    assertThat(stmts).hasSize(1);
-  }
-
-  @Test
-  public void testExprAsStatement() throws Exception {
-    List<Statement> stmts =
-        parseStatements(
-            "li = []", //
-            "li.append('a.c')",
-            "\"\"\" string comment \"\"\"",
-            "foo(bar)");
-    assertThat(stmts).hasSize(4);
-  }
-
-  @Test
-  public void testParseBuildFileWithSingleRule() throws Exception {
-    List<Statement> stmts =
-        parseStatements(
-            "genrule(name = 'foo',", //
-            "   srcs = ['input.csv'],",
-            "   outs = [ 'result.txt',",
-            "           'result.log'],",
-            "   cmd = 'touch result.txt result.log')",
-            "");
-    assertThat(stmts).hasSize(1);
-  }
-
-  @Test
-  public void testParseBuildFileWithMultipleRules() throws Exception {
-    List<Statement> stmts =
-        parseStatements(
-            "genrule(name = 'foo',", //
-            "   srcs = ['input.csv'],",
-            "   outs = [ 'result.txt',",
-            "           'result.log'],",
-            "   cmd = 'touch result.txt result.log')",
-            "",
-            "genrule(name = 'bar',",
-            "   srcs = ['input.csv'],",
-            "   outs = [ 'graph.svg'],",
-            "   cmd = 'touch graph.svg')");
-    assertThat(stmts).hasSize(2);
-  }
-
-  @Test
-  public void testParseBuildFileWithComments() throws Exception {
-    StarlarkFile result =
-        parseFile(
-            "# Test BUILD file", //
-            "# with multi-line comment",
-            "",
-            "genrule(name = 'foo',",
-            "   srcs = ['input.csv'],",
-            "   outs = [ 'result.txt',",
-            "           'result.log'],",
-            "   cmd = 'touch result.txt result.log')");
-    assertThat(result.getStatements()).hasSize(1);
-    assertThat(result.getComments()).hasSize(2);
-  }
-
-  @Test
-  public void testParseBuildFileWithManyComments() throws Exception {
-    StarlarkFile result =
-        parseFile(
-            "# 1", //
-            "# 2",
-            "",
-            "# 4 ",
-            "# 5",
-            "#", // 6 - find empty comment for syntax highlighting
-            "# 7 ",
-            "# 8",
-            "genrule(name = 'foo',",
-            "   srcs = ['input.csv'],",
-            "   # 11",
-            "   outs = [ 'result.txt',",
-            "           'result.log'], # 13",
-            "   cmd = 'touch result.txt result.log')",
-            "# 15");
-    assertThat(result.getStatements()).hasSize(1); // Single genrule
-    StringBuilder commentLines = new StringBuilder();
-    for (Comment comment : result.getComments()) {
-      // Comments start and end on the same line
-      Location start = comment.getStartLocation();
-      Location end = comment.getEndLocation();
-      assertWithMessage(start.line() + " ends on " + end.line())
-          .that(end.line())
-          .isEqualTo(start.line());
-      commentLines.append('(');
-      commentLines.append(start.line());
-      commentLines.append(',');
-      commentLines.append(start.column());
-      commentLines.append(") ");
-    }
-    assertWithMessage("Found: " + commentLines)
-        .that(result.getComments().size()).isEqualTo(10); // One per '#'
-  }
-
-  @Test
-  public void testMissingComma() throws Exception {
-    setFailFast(false);
-    // Regression test.
-    // Note: missing comma after name='foo'
-    parseFile("genrule(name = 'foo'\n"
-              + "      srcs = ['in'])");
-    assertContainsError("syntax error at 'srcs'");
-  }
-
-  @Test
-  public void testDoubleSemicolon() throws Exception {
-    setFailFast(false);
-    // Regression test.
-    parseFile("x = 1; ; x = 2;");
-    assertContainsError("syntax error at ';'");
-  }
-
-  @Test
-  public void testDefSingleLine() throws Exception {
-    List<Statement> statements = parseStatements("def foo(): x = 1; y = 2\n");
-    DefStatement stmt = (DefStatement) statements.get(0);
-    assertThat(stmt.getBody()).hasSize(2);
-  }
-
-  @Test
-  public void testForPass() throws Exception {
-    List<Statement> statements = parseStatements("def foo():", "  pass\n");
-
-    assertThat(statements).hasSize(1);
-    DefStatement stmt = (DefStatement) statements.get(0);
-    assertThat(stmt.getBody().get(0)).isInstanceOf(FlowStatement.class);
-  }
-
-  @Test
-  public void testForLoopMultipleVariables() throws Exception {
-    List<Statement> stmts1 = parseStatements("[ i for i, j, k in [(1, 2, 3)] ]\n");
-    assertThat(stmts1).hasSize(1);
-
-    List<Statement> stmts2 = parseStatements("[ i for i, j in [(1, 2, 3)] ]\n");
-    assertThat(stmts2).hasSize(1);
-
-    List<Statement> stmts3 = parseStatements("[ i for (i, j, k) in [(1, 2, 3)] ]\n");
-    assertThat(stmts3).hasSize(1);
-  }
-
-  @Test
-  public void testReturnNone() throws Exception {
-    List<Statement> defNone = parseStatements("def foo():", "  return None\n");
-    assertThat(defNone).hasSize(1);
-
-    List<Statement> bodyNone = ((DefStatement) defNone.get(0)).getBody();
-    assertThat(bodyNone).hasSize(1);
-
-    ReturnStatement returnNone = (ReturnStatement) bodyNone.get(0);
-    assertThat(((Identifier) returnNone.getResult()).getName()).isEqualTo("None");
-
-    int i = 0;
-    for (String end : new String[]{";", "\n"}) {
-      List<Statement> defNoExpr = parseStatements("def bar" + i + "():", "  return" + end);
-      i++;
-      assertThat(defNoExpr).hasSize(1);
-
-      List<Statement> bodyNoExpr = ((DefStatement) defNoExpr.get(0)).getBody();
-      assertThat(bodyNoExpr).hasSize(1);
-
-      ReturnStatement returnNoExpr = (ReturnStatement) bodyNoExpr.get(0);
-      assertThat(returnNoExpr.getResult()).isNull();
-    }
-  }
-
-  @Test
-  public void testForLoopBadSyntax() throws Exception {
-    setFailFast(false);
-    parseFile("[1 for (a, b, c in var]\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testForLoopBadSyntax2() throws Exception {
-    setFailFast(false);
-    parseFile("[1 for in var]\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testFunCallBadSyntax() throws Exception {
-    setFailFast(false);
-    parseFile("f(1,\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testFunCallBadSyntax2() throws Exception {
-    setFailFast(false);
-    parseFile("f(1, 5, ,)\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testLoadNoSymbol() throws Exception {
-    setFailFast(false);
-    parseFile("load('//foo/bar:file.bzl')\n");
-    assertContainsError("expected at least one symbol to load");
-  }
-
-  @Test
-  public void testLoadOneSymbol() throws Exception {
-    String text = "load('//foo/bar:file.bzl', 'fun_test')\n";
-    List<Statement> statements = parseStatements(text);
-    LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertThat(stmt.getImport().getValue()).isEqualTo("//foo/bar:file.bzl");
-    assertThat(stmt.getBindings()).hasSize(1);
-    Identifier sym = stmt.getBindings().get(0).getLocalName();
-    assertThat(getText(text, sym)).isEqualTo("fun_test"); // apparent location within string literal
-  }
-
-  @Test
-  public void testLoadOneSymbolWithTrailingComma() throws Exception {
-    List<Statement> statements = parseStatements("load('//foo/bar:file.bzl', 'fun_test',)\n");
-    LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertThat(stmt.getImport().getValue()).isEqualTo("//foo/bar:file.bzl");
-    assertThat(stmt.getBindings()).hasSize(1);
-  }
-
-  @Test
-  public void testLoadMultipleSymbols() throws Exception {
-    List<Statement> statements = parseStatements("load(':file.bzl', 'foo', 'bar')\n");
-    LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertThat(stmt.getImport().getValue()).isEqualTo(":file.bzl");
-    assertThat(stmt.getBindings()).hasSize(2);
-  }
-
-  @Test
-  public void testLoadLabelQuoteError() throws Exception {
-    setFailFast(false);
-    parseFile("load(non_quoted, 'a')\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testLoadSymbolQuoteError() throws Exception {
-    setFailFast(false);
-    parseFile("load('label', non_quoted)\n");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testLoadDisallowSameLine() throws Exception {
-    setFailFast(false);
-    parseFile("load('foo.bzl', 'foo') load('bar.bzl', 'bar')");
-    assertContainsError("syntax error");
-  }
-
-  @Test
-  public void testLoadNotAtTopLevel() throws Exception {
-    // "This is not a parse error." --Magritte
-    parseFile("if 1: load('', 'x')\n");
-  }
-
-  @Test
-  public void testLoadModuleNotStringLiteral() throws Exception {
-    setFailFast(false);
-    parseFile("load(123, 'x')");
-    assertContainsError("syntax error at '123': expected string literal");
-  }
-
-  @Test
-  public void testLoadAlias() throws Exception {
-    List<Statement> statements = parseStatements("load('//foo/bar:file.bzl', my_alias = 'lawl')\n");
-    LoadStatement stmt = (LoadStatement) statements.get(0);
-    ImmutableList<LoadStatement.Binding> actualSymbols = stmt.getBindings();
-
-    assertThat(actualSymbols).hasSize(1);
-    Identifier sym = actualSymbols.get(0).getLocalName();
-    assertThat(sym.getName()).isEqualTo("my_alias");
-    int startOffset = sym.getStartOffset();
-    assertWithMessage("getStartOffset()").that(startOffset).isEqualTo(27);
-    assertWithMessage("getEndOffset()").that(sym.getEndOffset()).isEqualTo(startOffset + 8);
-  }
-
-  @Test
-  public void testLoadAliasMultiple() throws Exception {
-    runLoadAliasTestForSymbols(
-        "my_alias = 'lawl', 'lol', next_alias = 'rofl'", "my_alias", "lol", "next_alias");
-  }
-
-  private void runLoadAliasTestForSymbols(String loadSymbolString, String... expectedSymbols)
-      throws SyntaxError.Exception {
-    List<Statement> statements =
-        parseStatements(String.format("load('//foo/bar:file.bzl', %s)\n", loadSymbolString));
-    LoadStatement stmt = (LoadStatement) statements.get(0);
-
-    List<String> actualSymbolNames = new ArrayList<>();
-    for (LoadStatement.Binding binding : stmt.getBindings()) {
-      actualSymbolNames.add(binding.getLocalName().getName());
-    }
-    assertThat(actualSymbolNames).containsExactly((Object[]) expectedSymbols);
-  }
-
-  @Test
-  public void testLoadAliasSyntaxError() throws Exception {
-    setFailFast(false);
-    parseFile("load('//foo:bzl', test1 = )\n");
-    assertContainsError("syntax error at ')': expected string");
-
-    parseFile("load(':foo.bzl', test2 = 1)\n");
-    assertContainsError("syntax error at '1': expected string");
-
-    parseFile("load(':foo.bzl', test3 = old)\n");
-    assertContainsError("syntax error at 'old': expected string");
-  }
-
-  @Test
-  public void testLoadIsASmallStatement() throws Exception {
-    // Regression test for b/148802200.
-    parseFile("a=1; load('file', 'b'); c=3");
-  }
-
-  @Test
-  public void testParseErrorNotComparison() throws Exception {
-    setFailFast(false);
-    parseFile("2 < not 3");
-    assertContainsError("syntax error at 'not'");
-  }
-
-  @Test
-  public void testNotWithArithmeticOperatorsBadSyntax() throws Exception {
-    setFailFast(false);
-    parseFile("0 + not 0");
-    assertContainsError("syntax error at 'not'");
-  }
-
-  @Test
-  public void testElseWithoutIf() throws Exception {
-    setFailFast(false);
-    parseFile(
-        "def func(a):",
-        // no if
-        "  else: return a");
-    assertContainsError("syntax error at 'else': expected expression");
-  }
-
-  @Test
-  public void testForElse() throws Exception {
-    setFailFast(false);
-    parseFile(
-        "def func(a):", //
-        "  for i in range(a):",
-        "    print(i)",
-        "  else: return a");
-    assertContainsError("syntax error at 'else': expected expression");
-  }
-
-  @Test
-  public void testTryStatementInBuild() throws Exception {
-    setFailFast(false);
-    parseFile("try: pass");
-    assertContainsError("'try' not supported, all exceptions are fatal");
-  }
-
-  @Test
-  public void testClassDefinitionInBuild() throws Exception {
-    setFailFast(false);
-    parseFile("class test(object): pass");
-    assertContainsError("keyword 'class' not supported");
-  }
-
-  @Test
-  public void testClassDefinitionInStarlark() throws Exception {
-    setFailFast(false);
-    parseFile("class test(object): pass");
-    assertContainsError("keyword 'class' not supported");
-  }
-
-
-  @Test
-  public void testStringsAreDeduped() throws Exception {
-    StarlarkFile file = parseFile("L1 = ['cat', 'dog', 'fish']", "L2 = ['dog', 'fish', 'cat']");
-    Set<String> uniqueStringInstances = Sets.newIdentityHashSet();
-    NodeVisitor collectAllStringsInStringLiteralsVisitor =
-        new NodeVisitor() {
-          @Override
-          public void visit(StringLiteral stringLiteral) {
-            uniqueStringInstances.add(stringLiteral.getValue());
-          }
-        };
-    collectAllStringsInStringLiteralsVisitor.visit(file);
-    assertThat(uniqueStringInstances).containsExactly("cat", "dog", "fish");
-  }
-
-  @Test
-  public void testConditionalExpressions() throws Exception {
-    assertThat(parseExpressionError("1 if 2"))
-        .contains("missing else clause in conditional expression or semicolon before if");
-  }
-
-  @Test
-  public void testParseFileStackOverflow() throws Exception {
-    StarlarkFile file = StarlarkFile.parse(veryDeepExpression());
-    SyntaxError ex = LexerTest.assertContainsError(file.errors(), "internal error: stack overflow");
-    assertThat(ex.message()).contains("parseDictEntry"); // includes stack
-    assertThat(ex.message()).contains("Please report the bug");
-    assertThat(ex.message()).contains("include the text of foo.star"); // includes file name
-  }
-
-  @Test
-  public void testParseExpressionStackOverflow() throws Exception {
-    SyntaxError.Exception ex =
-        assertThrows(SyntaxError.Exception.class, () -> Expression.parse(veryDeepExpression()));
-    SyntaxError err = LexerTest.assertContainsError(ex.errors(), "internal error: stack overflow");
-    assertThat(err.message()).contains("parseDictEntry"); // includes stack
-    assertThat(err.message())
-        .contains("while parsing Starlark expression <<{{{{"); // includes expression
-    assertThat(err.message()).contains("Please report the bug");
-  }
-
-  private static ParserInput veryDeepExpression() {
-    StringBuilder s = new StringBuilder();
-    for (int i = 0; i < 1000; i++) {
-      s.append("{");
-    }
-    return ParserInput.fromString(s.toString(), "foo.star");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
deleted file mode 100644
index e39c5a1..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.IllegalFormatException;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- *  Test properties of the evaluator's datatypes and utility functions
- *  without actually creating any parse trees.
- */
-@RunWith(JUnit4.class)
-public class PrinterTest {
-
-  @Test
-  public void testPrinter() throws Exception {
-    // Note that str and repr only differ on behaviour of strings at toplevel.
-    assertThat(Starlark.str(createObjWithStr())).isEqualTo("<str marker>");
-    assertThat(Starlark.repr(createObjWithStr())).isEqualTo("<repr marker>");
-
-    assertThat(Starlark.str("foo\nbar")).isEqualTo("foo\nbar");
-    assertThat(Starlark.repr("foo\nbar")).isEqualTo("\"foo\\nbar\"");
-    assertThat(Starlark.str("'")).isEqualTo("'");
-    assertThat(Starlark.repr("'")).isEqualTo("\"'\"");
-    assertThat(Starlark.str("\"")).isEqualTo("\"");
-    assertThat(Starlark.repr("\"")).isEqualTo("\"\\\"\"");
-    assertThat(Starlark.str(3)).isEqualTo("3");
-    assertThat(Starlark.repr(3)).isEqualTo("3");
-    assertThat(Starlark.repr(Starlark.NONE)).isEqualTo("None");
-
-    List<?> list = StarlarkList.of(null, "foo", "bar");
-    List<?> tuple = Tuple.of("foo", "bar");
-
-    assertThat(Starlark.str(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
-    assertThat(Starlark.repr(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
-    assertThat(Starlark.str(StarlarkList.of(null, 1, tuple, 3)))
-        .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
-    assertThat(Starlark.repr(StarlarkList.of(null, 1, tuple, 3)))
-        .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
-
-    Map<Object, Object> dict =
-        ImmutableMap.<Object, Object>of(1, tuple, 2, list, "foo", StarlarkList.of(null));
-    assertThat(Starlark.str(dict))
-        .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
-    assertThat(Starlark.repr(dict))
-        .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
-  }
-
-  private void checkFormatPositionalFails(String errorMessage, String format, Object... arguments) {
-    IllegalFormatException e =
-        assertThrows(IllegalFormatException.class, () -> Starlark.format(format, arguments));
-    assertThat(e).hasMessageThat().isEqualTo(errorMessage);
-  }
-
-  @Test
-  public void testOutputOrderOfMap() throws Exception {
-    Map<Object, Object> map = new LinkedHashMap<>();
-    map.put(5, 5);
-    map.put(3, 3);
-    map.put("foo", 42);
-    map.put(7, "bar");
-    assertThat(Starlark.str(map)).isEqualTo("{5: 5, 3: 3, \"foo\": 42, 7: \"bar\"}");
-  }
-
-  @Test
-  public void testFormatPositional() throws Exception {
-    assertThat(Starlark.formatWithList("%s %d", Tuple.of("foo", 3))).isEqualTo("foo 3");
-    assertThat(Starlark.format("%s %d", "foo", 3)).isEqualTo("foo 3");
-
-    assertThat(Starlark.format("%s %s %s", 1, null, 3)).isEqualTo("1 null 3");
-
-    // Note: formatToString doesn't perform scalar x -> (x) conversion;
-    // The %-operator is responsible for that.
-    assertThat(Starlark.formatWithList("", Tuple.of())).isEmpty();
-    assertThat(Starlark.format("%s", "foo")).isEqualTo("foo");
-    assertThat(Starlark.format("%s", 3.14159)).isEqualTo("3.14159");
-    checkFormatPositionalFails("not all arguments converted during string formatting",
-        "%s", 1, 2, 3);
-    assertThat(Starlark.format("%%%s", "foo")).isEqualTo("%foo");
-    checkFormatPositionalFails("not all arguments converted during string formatting",
-        "%%s", "foo");
-    checkFormatPositionalFails("unsupported format character \" \" at index 1 in \"% %s\"",
-        "% %s", "foo");
-    assertThat(Starlark.format("%s", StarlarkList.of(null, 1, 2, 3))).isEqualTo("[1, 2, 3]");
-    assertThat(Starlark.format("%s", Tuple.of(1, 2, 3))).isEqualTo("(1, 2, 3)");
-    assertThat(Starlark.format("%s", StarlarkList.of(null))).isEqualTo("[]");
-    assertThat(Starlark.format("%s", Tuple.of())).isEqualTo("()");
-    assertThat(Starlark.format("%% %d %r %s", 1, "2", "3")).isEqualTo("% 1 \"2\" 3");
-
-    checkFormatPositionalFails(
-        "invalid argument \"1\" for format pattern %d",
-        "%d", "1");
-    checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.3g\"",
-        "%.3g");
-    checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.3g\"",
-        "%.3g", 1, 2);
-    checkFormatPositionalFails("unsupported format character \".\" at index 1 in \"%.s\"",
-        "%.s");
-  }
-
-  private StarlarkValue createObjWithStr() {
-    return new StarlarkValue() {
-      @Override
-      public void repr(Printer printer) {
-        printer.append("<repr marker>");
-      }
-
-      @Override
-      public void str(Printer printer) {
-        printer.append("<str marker>");
-      }
-    };
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java
deleted file mode 100644
index 3e80252..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/ResolverTest.java
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.devtools.build.lib.syntax.LexerTest.assertContainsError;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of the Starlark resolver. */
-@RunWith(JUnit4.class)
-public class ResolverTest {
-
-  private final FileOptions.Builder options = FileOptions.builder();
-
-  // Resolves a file using the current options,
-  // in an environment with a single predeclared name, pre.
-  // Errors are recorded in file.errors().
-  private StarlarkFile resolveFile(String... lines) throws SyntaxError.Exception {
-    ParserInput input = ParserInput.fromLines(lines);
-    StarlarkFile file = StarlarkFile.parse(input, options.build());
-    Resolver.resolveFile(file, () -> ImmutableSet.of("pre"));
-    return file;
-  }
-
-  // Assertions that parsing and resolution succeeds.
-  private void assertValid(String... lines) throws SyntaxError.Exception {
-    StarlarkFile file = resolveFile(lines);
-    if (!file.ok()) {
-      throw new SyntaxError.Exception(file.errors());
-    }
-  }
-
-  // Asserts that parsing of the program succeeds but resolution fails
-  // with at least the specified error.
-  private void assertInvalid(String expectedError, String... lines) throws SyntaxError.Exception {
-    List<SyntaxError> errors = getResolutionErrors(lines);
-    assertContainsError(errors, expectedError);
-  }
-
-  // Returns the non-empty list of resolution errors of the program.
-  private List<SyntaxError> getResolutionErrors(String... lines) throws SyntaxError.Exception {
-    StarlarkFile file = resolveFile(lines);
-    if (file.ok()) {
-      throw new AssertionError("resolution succeeded unexpectedly");
-    }
-    return file.errors();
-  }
-
-  @Test
-  public void testAssignmentNotValidLValue() throws Exception {
-    assertInvalid("cannot assign to '\"a\"'", "'a' = 1");
-  }
-
-  @Test
-  public void testAssignmentToDotExpression() throws Exception {
-    // According to the spec, this is allowed. TODO(adonovan): implement.
-    // Once it is allowed, we'll need a test (in lib.packages)
-    // that assignments to fields of a Bazel 'struct' are disallowed.
-    assertInvalid("cannot assign to 'pre.field'", "pre.field = ()");
-  }
-
-  @Test
-  public void testAugmentedAssignmentWithMultipleLValues() throws Exception {
-    assertInvalid(
-        "cannot perform augmented assignment on a list or tuple expression", //
-        "a, b += 2, 3");
-  }
-
-  @Test
-  public void testReturnOutsideFunction() throws Exception {
-    assertInvalid(
-        "return statements must be inside a function", //
-        "return 2\n");
-  }
-
-  @Test
-  public void testLoadAfterStatement() throws Exception {
-    options.requireLoadStatementsFirst(true);
-    List<SyntaxError> errors = getResolutionErrors("a = 5", "load(':b.bzl', 'c')");
-    assertContainsError(errors, ":2:1: load statements must appear before any other statement");
-    assertContainsError(errors, ":1:1: \tfirst non-load statement appears here");
-  }
-
-  @Test
-  public void testAllowLoadAfterStatement() throws Exception {
-    options.requireLoadStatementsFirst(false);
-    assertValid(
-        "a = 5", //
-        "load(':b.bzl', 'c')");
-  }
-
-  @Test
-  public void testLoadDuplicateSymbols() throws Exception {
-    assertInvalid(
-        "load statement defines 'x' more than once", //
-        "load('module', 'x', 'x')");
-    assertInvalid(
-        "load statement defines 'x' more than once", //
-        "load('module', 'x', x='y')");
-
-    // Eventually load bindings will be local,
-    // at which point these errors will need adjusting.
-    assertInvalid(
-        "cannot reassign global 'x'", //
-        "x=1; load('module', 'x')");
-    assertInvalid(
-        "cannot reassign global 'x'", //
-        "load('module', 'x'); x=1");
-  }
-
-  @Test
-  public void testForbiddenToplevelIfStatement() throws Exception {
-    assertInvalid(
-        "if statements are not allowed at the top level", //
-        "if pre: a = 2");
-  }
-
-  @Test
-  public void testFunctionLocalVariable() throws Exception {
-    assertInvalid(
-        "name 'a' is not defined", //
-        "def func2(b):",
-        "  c = b",
-        "  c = a",
-        "def func1():",
-        "  a = 1",
-        "  func2(2)");
-  }
-
-  @Test
-  public void testFunctionLocalVariableDoesNotEffectGlobalEnv() throws Exception {
-    assertInvalid(
-        "name 'a' is not defined", //
-        "def func1():",
-        "  a = 1",
-        "def func2(b):",
-        "  b = a");
-  }
-
-  @Test
-  public void testFunctionParameterDoesNotEffectGlobalEnv() throws Exception {
-    assertInvalid(
-        "name 'a' is not defined", //
-        "def func1(a):",
-        "  return a",
-        "def func2():",
-        "  b = a");
-  }
-
-  @Test
-  public void testDefinitionByItself() throws Exception {
-    // Variables are assumed to be statically visible in the block (even if they might not be
-    // initialized).
-    assertValid("a = a");
-    assertValid("a += a");
-    assertValid("[[] for _ in [] for a in a]");
-    assertValid("def f():", "  for a in a: pass");
-  }
-
-  @Test
-  public void testLocalEnvironmentsAreSeparate() throws Exception {
-    assertValid(
-        "def func1():", //
-        "  a = 1",
-        "def func2():",
-        "  a = 'abc'");
-  }
-
-  @Test
-  public void testBuiltinsCanBeShadowed() throws Exception {
-    assertValid("pre = 1");
-  }
-
-  @Test
-  public void testNoGlobalReassign() throws Exception {
-    List<SyntaxError> errors = getResolutionErrors("a = 1", "a = 2");
-    assertContainsError(errors, ":2:1: cannot reassign global 'a'");
-    assertContainsError(errors, ":1:1: 'a' previously declared here");
-  }
-
-  @Test
-  public void testTwoFunctionsWithTheSameName() throws Exception {
-    List<SyntaxError> errors = getResolutionErrors("def foo(): pass", "def foo(): pass");
-    assertContainsError(errors, ":2:5: cannot reassign global 'foo'");
-    assertContainsError(errors, ":1:5: 'foo' previously declared here");
-  }
-
-  @Test
-  public void testFunctionDefRecursion() throws Exception {
-    assertValid("def func():", "  func()\n");
-  }
-
-  @Test
-  public void testMutualRecursion() throws Exception {
-    assertValid("def foo(i):", "  bar(i)", "def bar(i):", "  foo(i)", "foo(4)");
-  }
-
-  @Test
-  public void testFunctionDefinedBelow() throws Exception {
-    assertValid("def bar(): a = foo() + 'a'", "def foo(): return 1\n");
-  }
-
-  @Test
-  public void testGlobalDefinedBelow() throws Exception {
-    assertValid("def bar(): return x", "x = 5\n");
-  }
-
-  @Test
-  public void testLocalVariableDefinedBelow() throws Exception {
-    assertValid(
-        "def bar():",
-        "    for i in pre(5):",
-        "        if i > 2: return x",
-        "        x = i" // x is visible in the entire function block
-        );
-  }
-
-  @Test
-  public void testFunctionDoesNotExist() throws Exception {
-    assertInvalid(
-        "name 'foo' is not defined", //
-        "def bar(): a = foo() + 'a'");
-  }
-
-  @Test
-  public void testTupleLiteralWorksForDifferentTypes() throws Exception {
-    assertValid("('a', 1)");
-  }
-
-  @Test
-  public void testDictExpressionDifferentValueTypeWorks() throws Exception {
-    assertValid("{'a': 1, 'b': 'c'}");
-  }
-
-  // Starlark built-in functions specific tests
-
-  @Test
-  public void testFuncReturningDictAssignmentAsLValue() throws Exception {
-    assertValid(
-        "def my_dict():", //
-        "  return {'a': 1}",
-        "def func():",
-        "  my_dict()['b'] = 2");
-  }
-
-  @Test
-  public void testEmptyLiteralGenericIsSetInLaterConcatWorks() throws Exception {
-    assertValid(
-        "def func():", //
-        "  s = {}",
-        "  s['a'] = 'b'");
-  }
-
-  @Test
-  public void testBuiltinGlobalFunctionsReadOnlyInFuncDefBody() throws Exception {
-    assertValid("def func():", "  rule = 'abc'");
-  }
-
-  @Test
-  public void testBuiltinGlobalFunctionsReadOnlyAsFuncDefArg() throws Exception {
-    assertValid("def func(rule):", "  return rule");
-  }
-
-  @Test
-  public void testTopLevelForFails() throws Exception {
-    assertInvalid(
-        "for loops are not allowed at the top level", //
-        "for i in []: 0\n");
-  }
-
-  @Test
-  public void testNestedFunctionFails() throws Exception {
-    assertInvalid(
-        "nested functions are not allowed. Move the function to the top level", //
-        "def func(a):",
-        "  def bar(): return 0",
-        "  return bar()",
-        "");
-  }
-
-  @Test
-  public void testComprehension() throws Exception {
-    // The operand of the first for clause is resolved outside the comprehension block.
-    assertInvalid("name 'x' is not defined", "[() for x in x]");
-    assertValid("[() for x in () for x in x]"); // forward ref
-  }
-
-  @Test
-  public void testDuplicateParameter() throws Exception {
-    assertInvalid(
-        "duplicate parameter: a",
-        "def func(a, b, a):", //
-        "  a = 1");
-  }
-
-  @Test
-  public void testParameterOrdering() throws Exception {
-    // ordering
-    assertInvalid(
-        "required parameter a may not follow **kwargs", //
-        "def func(**kwargs, a): pass");
-    assertInvalid(
-        "required positional parameter b may not follow an optional parameter", //
-        "def func(a=1, b): pass");
-    assertInvalid(
-        "optional parameter may not follow **kwargs", //
-        "def func(**kwargs, a=1): pass");
-    assertInvalid(
-        "* parameter may not follow **kwargs", //
-        "def func(**kwargs, *args): pass");
-    assertInvalid(
-        "* parameter may not follow **kwargs", //
-        "def func(**kwargs, *): pass");
-    assertInvalid(
-        "bare * must be followed by keyword-only parameters", //
-        "def func(*): pass");
-
-    // duplicate parameters
-    assertInvalid("duplicate parameter: a", "def func(a, a): pass");
-    assertInvalid("duplicate parameter: a", "def func(a, a=1): pass");
-    assertInvalid("duplicate parameter: a", "def func(a, *a): pass");
-    assertInvalid("duplicate parameter: a", "def func(*a, a): pass");
-    assertInvalid("duplicate parameter: a", "def func(*a, a=1): pass");
-    assertInvalid("duplicate parameter: a", "def func(a, **a): pass");
-    assertInvalid("duplicate parameter: a", "def func(*a, **a): pass");
-
-    // multiple *
-    assertInvalid("multiple * parameters not allowed", "def func(a, *, b, *): pass");
-    assertInvalid("multiple * parameters not allowed", "def func(a, *args, b, *): pass");
-    assertInvalid("multiple * parameters not allowed", "def func(a, *, b, *args): pass");
-    assertInvalid("multiple * parameters not allowed", "def func(a, *args, b, *args): pass");
-
-    // multiple **kwargs
-    assertInvalid("multiple ** parameters not allowed", "def func(**kwargs, **kwargs): pass");
-
-    assertValid("def f(a, b, c=1, d=2, *args, e, f=3, g, **kwargs): pass");
-  }
-
-  @Test
-  public void testArgumentOrdering() throws Exception {
-    // positionals go before keywords
-    assertInvalid(
-        "positional argument may not follow keyword", //
-        "pre(a=1, 0)");
-
-    // keywords must be unique
-    assertInvalid(
-        "duplicate keyword argument: a", //
-        "pre(a=1, a=2)");
-
-    // no arguments after **kwargs
-    assertInvalid(
-        "positional argument may not follow **kwargs", //
-        "pre(**0, 0)");
-    assertInvalid(
-        "keyword argument a may not follow **kwargs", //
-        "pre(**0, a=1)");
-    assertInvalid(
-        "*args may not follow **kwargs", //
-        "pre(**0, *0)");
-    assertInvalid(
-        "multiple **kwargs not allowed", //
-        "pre(**0, **0)");
-    assertInvalid(
-        "*args may not follow **kwargs", // also, a parse error
-        "pre(**0, *)");
-
-    // bad arguments after *args
-    assertInvalid(
-        "positional argument may not follow *args", //
-        "pre(*0, 1)");
-    assertInvalid(
-        "keyword argument a may not follow *args", //
-        "pre(*0, a=1)"); // Python (even v2) allows this
-    assertInvalid(
-        "multiple *args not allowed", //
-        "pre(*0, *0)");
-
-    assertValid("pre(0, a=0, *0, **0)");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java
deleted file mode 100644
index ec0e0b3..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkEvaluationTest.java
+++ /dev/null
@@ -1,2059 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.joining;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.errorprone.annotations.DoNotCall;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.ParamType;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkGlobalLibrary;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of Starlark evaluation. */
-// There is no clear distinction between this and EvaluationTest.
-// TODO(adonovan): reorganize.
-@StarlarkGlobalLibrary // required for @StarlarkMethod-annotated methods
-@RunWith(JUnit4.class)
-public final class StarlarkEvaluationTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  static class Bad {
-    Bad () {
-    }
-  }
-
-  @StarlarkMethod(name = "foobar", documented = false)
-  public String foobar() {
-    return "foobar";
-  }
-
-  @DoNotCall("Always throws java.lang.InterruptedException")
-  @StarlarkMethod(name = "interrupted_function", documented = false)
-  public NoneType interruptedFunction() throws InterruptedException {
-    throw new InterruptedException();
-  }
-
-  @StarlarkMethod(name = "stackoverflow", documented = false)
-  public int stackoverflow() {
-    return true ? stackoverflow() : 0; // (defeat static recursion checker)
-  }
-
-  @StarlarkMethod(name = "thrownpe", documented = false)
-  public void thrownpe() {
-    throw new NullPointerException("oops");
-  }
-
-  // A trivial struct-like class with Starlark fields defined by a map.
-  private static class SimpleStruct implements StarlarkValue, ClassObject {
-    final ImmutableMap<String, Object> fields;
-
-    SimpleStruct(ImmutableMap<String, Object> fields) {
-      this.fields = fields;
-    }
-
-    @Override
-    public ImmutableCollection<String> getFieldNames() {
-      return fields.keySet();
-    }
-
-    @Override
-    public Object getValue(String name) {
-      return fields.get(name);
-    }
-
-    @Override
-    public String getErrorMessageForUnknownField(String name) {
-      return null;
-    }
-
-    @Override
-    public void repr(Printer p) {
-      // This repr function prints only the fields.
-      // Any methods are still accessible through dir/getattr/hasattr.
-      p.append("simplestruct(");
-      String sep = "";
-      for (Map.Entry<String, Object> e : fields.entrySet()) {
-        p.append(sep).append(e.getKey()).append(" = ").repr(e.getValue());
-        sep = ", ";
-      }
-      p.append(")");
-    }
-  }
-
-  @StarlarkBuiltin(name = "Mock", doc = "")
-  class Mock implements StarlarkValue {
-    @StarlarkMethod(
-        name = "MockFn",
-        selfCall = true,
-        documented = false,
-        parameters = {
-          @Param(name = "pos", positional = true, type = String.class),
-        })
-    public String selfCall(String myName) {
-      return "I'm a mock named " + myName;
-    }
-
-    @StarlarkMethod(
-        name = "value_of",
-        parameters = {@Param(name = "str", type = String.class)},
-        documented = false)
-    public Integer valueOf(String str) {
-      return Integer.valueOf(str);
-    }
-
-    @StarlarkMethod(
-        name = "is_empty",
-        parameters = {@Param(name = "str", type = String.class)},
-        documented = false)
-    public Boolean isEmpty(String str) {
-      return str.isEmpty();
-    }
-    public void value() {}
-
-    @StarlarkMethod(name = "return_bad", documented = false)
-    public Bad returnBad() {
-      return new Bad(); // not a legal Starlark value
-    }
-
-    @StarlarkMethod(name = "struct_field", documented = false, structField = true)
-    public String structField() {
-      return "a";
-    }
-
-    @StarlarkMethod(
-        name = "struct_field_with_extra",
-        documented = false,
-        structField = true,
-        useStarlarkSemantics = true)
-    public String structFieldWithExtra(StarlarkSemantics sem) {
-      return "struct_field_with_extra("
-        + (sem != null)
-        + ")";
-    }
-
-    @StarlarkMethod(name = "struct_field_callable", documented = false, structField = true)
-    public Object structFieldCallable() {
-      return new BuiltinCallable(StarlarkEvaluationTest.this, "foobar");
-    }
-
-    @StarlarkMethod(name = "interrupted_struct_field", documented = false, structField = true)
-    public Object structFieldInterruptedCallable() throws InterruptedException {
-      throw new InterruptedException();
-    }
-
-    @StarlarkMethod(name = "function", documented = false, structField = false)
-    public String function() {
-      return "a";
-    }
-
-    @SuppressWarnings("unused")
-    @StarlarkMethod(
-        name = "nullfunc_failing",
-        parameters = {
-          @Param(name = "p1", type = String.class),
-          @Param(name = "p2", type = Integer.class),
-        },
-        documented = false,
-        allowReturnNones = false)
-    public StarlarkValue nullfuncFailing(String p1, Integer p2) {
-      return null;
-    }
-
-    @StarlarkMethod(name = "nullfunc_working", documented = false, allowReturnNones = true)
-    public StarlarkValue nullfuncWorking() {
-      return null;
-    }
-
-    @StarlarkMethod(name = "voidfunc", documented = false)
-    public void voidfunc() {}
-
-    @StarlarkMethod(name = "string_list", documented = false)
-    public ImmutableList<String> stringList() {
-      return ImmutableList.<String>of("a", "b");
-    }
-
-    @StarlarkMethod(name = "string", documented = false)
-    public String string() {
-      return "a";
-    }
-
-    @StarlarkMethod(name = "string_list_dict", documented = false)
-    public Map<String, List<String>> stringListDict() {
-      return ImmutableMap.of("a", ImmutableList.of("b", "c"));
-    }
-
-    @StarlarkMethod(
-        name = "with_params",
-        documented = false,
-        parameters = {
-          @Param(name = "pos1"),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(
-              name = "posOrNamed",
-              defaultValue = "False",
-              type = Boolean.class,
-              positional = true,
-              named = true),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-          @Param(
-              name = "optionalNamed",
-              type = Boolean.class,
-              defaultValue = "False",
-              positional = false,
-              named = true),
-          @Param(
-              name = "nonNoneable",
-              type = Object.class,
-              defaultValue = "\"a\"",
-              positional = false,
-              named = true),
-          @Param(
-              name = "noneable",
-              type = Integer.class,
-              defaultValue = "None",
-              noneable = true,
-              positional = false,
-              named = true),
-          @Param(
-              name = "multi",
-              allowedTypes = {
-                @ParamType(type = String.class),
-                @ParamType(type = Integer.class),
-                @ParamType(type = Sequence.class, generic1 = Integer.class),
-              },
-              defaultValue = "None",
-              noneable = true,
-              positional = false,
-              named = true)
-        })
-    public String withParams(
-        Integer pos1,
-        boolean pos2,
-        boolean posOrNamed,
-        boolean named,
-        boolean optionalNamed,
-        Object nonNoneable,
-        Object noneable,
-        Object multi) {
-      return "with_params("
-          + pos1
-          + ", "
-          + pos2
-          + ", "
-          + posOrNamed
-          + ", "
-          + named
-          + ", "
-          + optionalNamed
-          + ", "
-          + nonNoneable
-          + (noneable != Starlark.NONE ? ", " + noneable : "")
-          + (multi != Starlark.NONE ? ", " + multi : "")
-          + ")";
-    }
-
-    @StarlarkMethod(name = "with_extra", documented = false, useStarlarkThread = true)
-    public String withExtraInterpreterParams(StarlarkThread thread) {
-      return "with_extra(" + thread.getCallerLocation().line() + ")";
-    }
-
-    @StarlarkMethod(
-        name = "with_params_and_extra",
-        documented = false,
-        parameters = {
-          @Param(name = "pos1"),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(
-              name = "posOrNamed",
-              defaultValue = "False",
-              type = Boolean.class,
-              positional = true,
-              named = true),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-          @Param(
-              name = "optionalNamed",
-              type = Boolean.class,
-              defaultValue = "False",
-              positional = false,
-              named = true),
-          @Param(
-              name = "nonNoneable",
-              type = Object.class,
-              defaultValue = "\"a\"",
-              positional = false,
-              named = true),
-          @Param(
-              name = "noneable",
-              type = Integer.class,
-              defaultValue = "None",
-              noneable = true,
-              positional = false,
-              named = true),
-          @Param(
-              name = "multi",
-              allowedTypes = {
-                @ParamType(type = String.class),
-                @ParamType(type = Integer.class),
-                @ParamType(type = Sequence.class, generic1 = Integer.class),
-              },
-              defaultValue = "None",
-              noneable = true,
-              positional = false,
-              named = true)
-        },
-        useStarlarkThread = true)
-    public String withParamsAndExtraInterpreterParams(
-        Integer pos1,
-        boolean pos2,
-        boolean posOrNamed,
-        boolean named,
-        boolean optionalNamed,
-        Object nonNoneable,
-        Object noneable,
-        Object multi,
-        StarlarkThread thread) {
-      return "with_params_and_extra("
-          + pos1
-          + ", "
-          + pos2
-          + ", "
-          + posOrNamed
-          + ", "
-          + named
-          + ", "
-          + optionalNamed
-          + ", "
-          + nonNoneable
-          + (noneable != Starlark.NONE ? ", " + noneable : "")
-          + (multi != Starlark.NONE ? ", " + multi : "")
-          + ", "
-          + thread.getCallerLocation().line()
-          + ")";
-    }
-
-    @StarlarkMethod(
-        name = "proxy_methods_object",
-        doc = "Returns a struct containing all callable method objects of this mock",
-        allowReturnNones = true)
-    public ClassObject proxyMethodsObject() {
-      ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
-      Starlark.addMethods(builder, this);
-      return new SimpleStruct(builder.build());
-    }
-
-    @StarlarkMethod(
-        name = "with_args_and_thread",
-        documented = false,
-        parameters = {
-          @Param(name = "pos1", type = Integer.class),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-        },
-        extraPositionals = @Param(name = "args"),
-        useStarlarkThread = true)
-    public String withArgsAndThread(
-        Integer pos1, boolean pos2, boolean named, Sequence<?> args, StarlarkThread thread) {
-      String argsString = debugPrintArgs(args);
-      return "with_args_and_thread("
-          + pos1
-          + ", "
-          + pos2
-          + ", "
-          + named
-          + ", "
-          + argsString
-          + ")";
-    }
-
-    @StarlarkMethod(
-        name = "with_kwargs",
-        documented = false,
-        parameters = {
-          @Param(name = "pos", defaultValue = "False", type = Boolean.class),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-        },
-        extraKeywords = @Param(name = "kwargs"))
-    public String withKwargs(boolean pos, boolean named, Dict<String, Object> kwargs) {
-      String kwargsString =
-          "kwargs("
-              + kwargs
-                  .entrySet()
-                  .stream()
-                  .map(entry -> entry.getKey() + "=" + entry.getValue())
-                  .collect(joining(", "))
-              + ")";
-      return "with_kwargs(" + pos + ", " + named + ", " + kwargsString + ")";
-    }
-
-    @StarlarkMethod(
-        name = "with_args_and_kwargs",
-        documented = false,
-        parameters = {
-          @Param(name = "foo", named = true, positional = true, type = String.class),
-        },
-        extraPositionals = @Param(name = "args"),
-        extraKeywords = @Param(name = "kwargs"))
-    public String withArgsAndKwargs(String foo, Tuple<Object> args, Dict<String, Object> kwargs) {
-      String argsString = debugPrintArgs(args);
-      String kwargsString =
-          "kwargs("
-              + kwargs
-                  .entrySet()
-                  .stream()
-                  .map(entry -> entry.getKey() + "=" + entry.getValue())
-                  .collect(joining(", "))
-              + ")";
-      return "with_args_and_kwargs(" + foo + ", " + argsString + ", " + kwargsString + ")";
-    }
-
-    @StarlarkMethod(name = "raise_unchecked_exception", documented = false)
-    public void raiseUncheckedException() {
-      throw new InternalError("buggy code");
-    }
-
-    @Override
-    public String toString() {
-      return "<mock>";
-    }
-  }
-
-  private static String debugPrintArgs(Iterable<?> args) {
-    Printer p = new Printer();
-    p.append("args(");
-    String sep = "";
-    for (Object arg : args) {
-      p.append(sep).debugPrint(arg);
-      sep = ", ";
-    }
-    return p.append(")").toString();
-  }
-
-  @StarlarkBuiltin(name = "MockInterface", doc = "")
-  static interface MockInterface extends StarlarkValue {
-    @StarlarkMethod(
-        name = "is_empty_interface",
-        parameters = {@Param(name = "str", type = String.class)},
-        documented = false)
-    public Boolean isEmptyInterface(String str);
-  }
-
-  @StarlarkBuiltin(name = "MockSubClass", doc = "")
-  final class MockSubClass extends Mock implements MockInterface {
-    @Override
-    public Boolean isEmpty(String str) {
-      return str.isEmpty();
-    }
-    @Override
-    public Boolean isEmptyInterface(String str) {
-      return str.isEmpty();
-    }
-  }
-
-  @StarlarkBuiltin(name = "ParamterizedMock", doc = "")
-  static interface ParameterizedApi<ObjectT> extends StarlarkValue {
-    @StarlarkMethod(
-        name = "method",
-        documented = false,
-        parameters = {
-          @Param(name = "foo", named = true, positional = true, type = Object.class),
-        })
-    public ObjectT method(ObjectT o);
-  }
-
-  static final class ParameterizedMock implements ParameterizedApi<String> {
-    @Override
-    public String method(String o) {
-      return o;
-    }
-  }
-
-  // Verifies that a method implementation overriding a parameterized annotated interface method
-  // is still treated as Starlark-callable. Concretely, method() below should be treated as
-  // callable even though its method signature isn't an *exact* match of the annotated method
-  // declaration, due to the interface's method declaration being generic.
-  @Test
-  public void testParameterizedMock() throws Exception {
-    ev.new Scenario()
-        .update("mock", new ParameterizedMock())
-        .setUp("result = mock.method('bar')")
-        .testLookup("result", "bar");
-  }
-
-  @Test
-  public void testSimpleIf() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo():", "  a = 0", "  x = 0", "  if x: a = 5", "  return a", "a = foo()")
-        .testLookup("a", 0);
-  }
-
-  @Test
-  public void testIfPass() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo():", "  a = 1", "  x = True", "  if x: pass", "  return a", "a = foo()")
-        .testLookup("a", 1);
-  }
-
-  @Test
-  public void testNestedIf() throws Exception {
-    executeNestedIf(0, 0, 0);
-    executeNestedIf(1, 0, 3);
-    executeNestedIf(1, 1, 5);
-  }
-
-  private void executeNestedIf(int x, int y, int expected) throws Exception {
-    String fun = String.format("foo%s%s", x, y);
-    ev.new Scenario()
-        .setUp(
-            "def " + fun + "():",
-            "  x = " + x,
-            "  y = " + y,
-            "  a = 0",
-            "  b = 0",
-            "  if x:",
-            "    if y:",
-            "      a = 2",
-            "    b = 3",
-            "  return a + b",
-            "x = " + fun + "()")
-        .testLookup("x", expected);
-  }
-
-  @Test
-  public void testIfElse() throws Exception {
-    executeIfElse("foo", "something", 2);
-    executeIfElse("bar", "", 3);
-  }
-
-  private void executeIfElse(String fun, String y, int expected) throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def " + fun + "():",
-            "  y = '" + y + "'",
-            "  x = 5",
-            "  if x:",
-            "    if y: a = 2",
-            "    else: a = 3",
-            "  return a",
-            "z = " + fun + "()")
-        .testLookup("z", expected);
-  }
-
-  @Test
-  public void testIfElifElse_ifExecutes() throws Exception {
-    execIfElifElse(1, 0, 1);
-  }
-
-  @Test
-  public void testIfElifElse_elifExecutes() throws Exception {
-    execIfElifElse(0, 1, 2);
-  }
-
-  @Test
-  public void testIfElifElse_elseExecutes() throws Exception {
-    execIfElifElse(0, 0, 3);
-  }
-
-  private void execIfElifElse(int x, int y, int v) throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  x = " + x + "",
-            "  y = " + y + "",
-            "  if x:",
-            "    return 1",
-            "  elif y:",
-            "    return 2",
-            "  else:",
-            "    return 3",
-            "v = foo()")
-        .testLookup("v", v);
-  }
-
-  @Test
-  public void testForOnList() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  s = ''",
-            "  for i in ['hello', ' ', 'world']:",
-            "    s = s + i",
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "hello world");
-  }
-
-  @Test
-  public void testForAssignmentList() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  d = ['a', 'b', 'c']",
-            "  s = ''",
-            "  for i in d:",
-            "    s = s + i",
-            "    d = ['d', 'e', 'f']", // check that we use the old list
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "abc");
-  }
-
-  @Test
-  public void testForAssignmentDict() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  d = {'a' : 1, 'b' : 2, 'c' : 3}",
-            "  s = ''",
-            "  for i in d:",
-            "    s = s + i",
-            "    d = {'d' : 1, 'e' : 2, 'f' : 3}",
-            "  return s",
-            "s = func()")
-        .testLookup("s", "abc");
-  }
-
-  @Test
-  public void testForUpdateList() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2, 3]",
-            "  for x in xs:",
-            "    if x == 1:",
-            "      xs.append(10)")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration", "foo()");
-  }
-
-  @Test
-  public void testForUpdateDict() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo():", "  d = {'a': 1, 'b': 2, 'c': 3}", "  for k in d:", "    d[k] *= 2")
-        .testIfErrorContains(
-            "dict value is temporarily immutable due to active for-loop iteration", "foo()");
-  }
-
-  @Test
-  public void testForUnlockedAfterBreak() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2]",
-            "  for x in xs:",
-            "    break",
-            "  xs.append(3)",
-            "  return xs")
-        .testEval("foo()", "[1, 2, 3]");
-  }
-
-  @Test
-  public void testForNestedOnSameListStillLocked() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2]",
-            "  ys = []",
-            "  for x1 in xs:",
-            "    for x2 in xs:",
-            "      ys.append(x1 * x2)",
-            "    xs.append(4)",
-            "  return ys")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration", "foo()");
-  }
-
-  @Test
-  public void testForNestedOnSameListUnlockedAtEnd() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2]",
-            "  ys = []",
-            "  for x1 in xs:",
-            "    for x2 in xs:",
-            "      ys.append(x1 * x2)",
-            "  xs.append(4)",
-            "  return ys")
-        .testEval("foo()", "[1, 2, 2, 4]");
-  }
-
-  @Test
-  public void testForNestedWithListCompGood() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2]",
-            "  ys = []",
-            "  for x in xs:",
-            "    zs = [None for x in xs for y in (ys.append(x) or ys)]",
-            "  return ys")
-        .testEval("foo()", "[1, 2, 1, 2]");
-  }
-  @Test
-  public void testForNestedWithListCompBad() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [1, 2, 3]",
-            "  ys = []",
-            "  for x in xs:",
-            "    zs = [None for x in xs for y in (xs.append(x) or ys)]",
-            "  return ys")
-        .testIfErrorContains(
-            "list value is temporarily immutable due to active for-loop iteration", "foo()");
-  }
-
-  @Test
-  public void testForDeepUpdate() throws Exception {
-    // Check that indirectly reachable values can still be manipulated as normal.
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  xs = [['a'], ['b'], ['c']]",
-            "  ys = []",
-            "  for x in xs:",
-            "    for y in x:",
-            "      ys.append(y)",
-            "    xs[2].append(x[0])",
-            "  return ys",
-            "ys = foo()")
-        .testLookup("ys", StarlarkList.of(null, "a", "b", "c", "a", "b"));
-  }
-
-  @Test
-  public void testForNotIterable() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "type 'int' is not iterable",
-            "def func():",
-            "  for i in mock.value_of('1'): a = i",
-            "func()\n");
-  }
-
-  @Test
-  public void testForStringNotIterable() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "type 'string' is not iterable", "def func():", "  for i in 'abc': a = i", "func()\n");
-  }
-
-  @Test
-  public void testForOnDictionary() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  d = {1: 'a', 2: 'b', 3: 'c'}",
-            "  s = ''",
-            "  for i in d: s = s + d[i]",
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "abc");
-  }
-
-  @Test
-  public void testBadDictKey() throws Exception {
-    ev.new Scenario().testIfErrorContains("unhashable type: 'list'", "{ [1, 2]: [3, 4] }");
-  }
-
-  @Test
-  public void testForLoopReuseVariable() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  s = ''",
-            "  for i in ['a', 'b']:",
-            "    for i in ['c', 'd']: s = s + i",
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "cdcd");
-  }
-
-  @Test
-  public void testForLoopMultipleVariables() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  s = ''",
-            "  for [i, j] in [[1, 2], [3, 4]]:",
-            "    s = s + str(i) + str(j) + '.'",
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "12.34.");
-  }
-
-  @Test
-  public void testForLoopBreak() throws Exception {
-    simpleFlowTest("break", 1);
-  }
-
-  @Test
-  public void testForLoopContinue() throws Exception {
-    simpleFlowTest("continue", 10);
-  }
-
-  @SuppressWarnings("unchecked")
-  private void simpleFlowTest(String statement, int expected) throws Exception {
-    ev.exec(
-        "def foo():",
-        "  s = 0",
-        "  hit = 0",
-        "  for i in range(0, 10):",
-        "    s = s + 1",
-        "    " + statement + "",
-        "    hit = 1",
-        "  return [s, hit]",
-        "x = foo()");
-    assertThat((Iterable<Object>) ev.lookup("x")).containsExactly(expected, 0).inOrder();
-  }
-
-  @Test
-  public void testForLoopBreakFromDeeperBlock() throws Exception {
-    flowFromDeeperBlock("break", 1);
-    flowFromNestedBlocks("break", 29);
-  }
-
-  @Test
-  public void testForLoopContinueFromDeeperBlock() throws Exception {
-    flowFromDeeperBlock("continue", 5);
-    flowFromNestedBlocks("continue", 39);
-  }
-
-  private void flowFromDeeperBlock(String statement, int expected) throws Exception {
-    ev.exec(
-        "def foo():",
-        "   s = 0",
-        "   for i in range(0, 10):",
-        "       if i % 2 != 0:",
-        "           " + statement + "",
-        "       s = s + 1",
-        "   return s",
-        "x = foo()");
-    assertThat(ev.lookup("x")).isEqualTo(expected);
-  }
-
-  private void flowFromNestedBlocks(String statement, int expected) throws Exception {
-    ev.exec(
-        "def foo2():",
-        "   s = 0",
-        "   for i in range(1, 41):",
-        "       if i % 2 == 0:",
-        "           if i % 3 == 0:",
-        "               if i % 5 == 0:",
-        "                   " + statement + "",
-        "       s = s + 1",
-        "   return s",
-        "y = foo2()");
-    assertThat(ev.lookup("y")).isEqualTo(expected);
-  }
-
-  @Test
-  public void testNestedForLoopsMultipleBreaks() throws Exception {
-    nestedLoopsTest("break", 2, 6, 6);
-  }
-
-  @Test
-  public void testNestedForLoopsMultipleContinues() throws Exception {
-    nestedLoopsTest("continue", 4, 20, 20);
-  }
-
-  @SuppressWarnings("unchecked")
-  private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
-      int secondExpected) throws Exception {
-    ev.exec(
-        "def foo():",
-        "   outer = 0",
-        "   first = 0",
-        "   second = 0",
-        "   for i in range(0, 5):",
-        "       for j in range(0, 5):",
-        "           if j == 2:",
-        "               " + statement + "",
-        "           first = first + 1",
-        "       for k in range(0, 5):",
-        "           if k == 2:",
-        "               " + statement + "",
-        "           second = second + 1",
-        "       if i == 2:",
-        "           " + statement + "",
-        "       outer = outer + 1",
-        "   return [outer, first, second]",
-        "x = foo()");
-    assertThat((Iterable<Object>) ev.lookup("x"))
-        .containsExactly(outerExpected, firstExpected, secondExpected)
-        .inOrder();
-  }
-
-  @Test
-  public void testForLoopBreakError() throws Exception {
-    flowStatementInsideFunction("break");
-    flowStatementAfterLoop("break");
-  }
-
-  @Test
-  public void testForLoopContinueError() throws Exception {
-    flowStatementInsideFunction("continue");
-    flowStatementAfterLoop("continue");
-  }
-
-  // TODO(adonovan): move this and all tests that use it to ResolverTest.
-  private void assertResolutionError(String expectedError, final String... lines) throws Exception {
-    SyntaxError.Exception error = assertThrows(SyntaxError.Exception.class, () -> ev.exec(lines));
-    assertThat(error).hasMessageThat().contains(expectedError);
-  }
-
-  private void flowStatementInsideFunction(String statement) throws Exception {
-    assertResolutionError(
-        statement + " statement must be inside a for loop",
-        //
-        "def foo():",
-        "  " + statement,
-        "x = foo()");
-  }
-
-  private void flowStatementAfterLoop(String statement) throws Exception {
-    assertResolutionError(
-        statement + " statement must be inside a for loop",
-        //
-        "def foo2():",
-        "   for i in range(0, 3):",
-        "      pass",
-        "   " + statement,
-        "y = foo2()");
-  }
-
-  @Test
-  public void testNoneAssignment() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo(x=None):", "  x = 1", "  x = None", "  return 2", "s = foo()")
-        .testLookup("s", 2);
-  }
-
-  @Test
-  public void testReassignment() throws Exception {
-    ev.exec(
-        "def foo(x=None):", //
-        "  x = 1",
-        "  x = [1, 2]",
-        "  x = 'str'",
-        "  return x",
-        "s = foo()");
-    assertThat(ev.lookup("s")).isEqualTo("str");
-  }
-
-  @Test
-  public void testJavaCalls() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.is_empty('a')")
-        .testLookup("b", Boolean.FALSE);
-  }
-
-  @Test
-  public void testJavaCallsOnSubClass() throws Exception {
-    ev.new Scenario()
-        .update("mock", new MockSubClass())
-        .setUp("b = mock.is_empty('a')")
-        .testLookup("b", Boolean.FALSE);
-  }
-
-  @Test
-  public void testJavaCallsOnInterface() throws Exception {
-    ev.new Scenario()
-        .update("mock", new MockSubClass())
-        .setUp("b = mock.is_empty_interface('a')")
-        .testLookup("b", Boolean.FALSE);
-  }
-
-  @Test
-  public void testJavaCallsNotStarlarkMethod() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError("'Mock' value has no field or method 'value'", "mock.value()");
-  }
-
-  @Test
-  public void testNoOperatorIndex() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError("type 'Mock' has no operator [](int)", "mock[2]");
-  }
-
-  @Test
-  public void testJavaCallsNoMethod() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError("'Mock' value has no field or method 'bad'", "mock.bad()");
-  }
-
-  @Test
-  public void testJavaCallsNoMethodErrorMsg() throws Exception {
-    ev.new Scenario()
-        .testIfExactError("'int' value has no field or method 'bad'", "s = 3.bad('a', 'b', 'c')");
-  }
-
-  @Test
-  public void testJavaCallWithKwargs() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError(
-            "'Mock' value has no field or method 'isEmpty' (did you mean 'is_empty'?)",
-            "mock.isEmpty(str='abc')");
-  }
-
-  @Test
-  public void testStringListDictValues() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "def func(mock):",
-            "  for i, v in mock.string_list_dict().items():",
-            "    modified_list = v + ['extra_string']",
-            "  return modified_list",
-            "m = func(mock)")
-        .testLookup("m", StarlarkList.of(null, "b", "c", "extra_string"));
-  }
-
-  @Test
-  public void testProxyMethodsObject() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("m = mock.proxy_methods_object()", "b = m.with_params(1, True, named=True)")
-        .testLookup("b", "with_params(1, true, false, true, false, a)");
-  }
-
-  /**
-   * This test verifies an error is raised when a method parameter is set both positionally and
-   * by name.
-   */
-  @Test
-  public void testArgSpecifiedBothByNameAndPosition() throws Exception {
-    // in with_params, 'posOrNamed' is positional parameter index 2. So by specifying both
-    // posOrNamed by name and three positional parameters, there is a conflict.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "with_params() got multiple values for argument 'posOrNamed'",
-            "mock.with_params(1, True, True, posOrNamed=True, named=True)");
-  }
-
-  @Test
-  public void testTooManyPositionalArgs() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "with_params() accepts no more than 3 positional arguments but got 4",
-            "mock.with_params(1, True, True, 'toomany', named=True)");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "with_params() accepts no more than 3 positional arguments but got 5",
-            "mock.with_params(1, True, True, 'toomany', 'alsotoomany', named=True)");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "is_empty() accepts no more than 1 positional argument but got 2",
-            "mock.is_empty('a', 'b')");
-  }
-
-  @Test
-  public void testJavaCallWithPositionalAndKwargs() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True)")
-        .testLookup("b", "with_params(1, true, false, true, false, a)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, multi=1)")
-        .testLookup("b", "with_params(1, true, false, true, false, a, 1)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, multi='abc')")
-        .testLookup("b", "with_params(1, true, false, true, false, a, abc)");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, multi=[1,2,3])")
-        .testLookup("b", "with_params(1, true, false, true, false, a, [1, 2, 3])");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "with_params() missing 1 required named argument: named", "mock.with_params(1, True)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "with_params() missing 1 required named argument: named",
-            "mock.with_params(1, True, True)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, True, named=True)")
-        .testLookup("b", "with_params(1, true, true, true, false, a)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, posOrNamed=True)")
-        .testLookup("b", "with_params(1, true, true, true, false, a)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, posOrNamed=True, optionalNamed=True)")
-        .testLookup("b", "with_params(1, true, true, true, true, a)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "with_params() got unexpected keyword argument 'posornamed' (did you mean"
-                + " 'posOrNamed'?)",
-            "mock.with_params(1, True, named=True, posornamed=True)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "with_params() got unexpected keyword argument 'n'",
-            "mock.with_params(1, True, named=True, posOrNamed=True, n=2)");
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "in call to with_params(), parameter 'nonNoneable' cannot be None",
-            "mock.with_params(1, True, True, named=True, optionalNamed=False, nonNoneable=None)");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("")
-        .testIfExactError(
-            "in call to with_params(), parameter 'multi' got value of type 'bool', want 'string or"
-                + " int or sequence or NoneType'",
-            "mock.with_params(1, True, named=True, multi=False)");
-
-    // We do not enforce list item parameter type constraints.
-    // Test for this behavior.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params(1, True, named=True, multi=['a', 'b'])")
-        .testLookup("b", "with_params(1, true, false, true, false, a, [\"a\", \"b\"])");
-  }
-
-  @Test
-  public void testNoJavaCallsWithoutStarlark() throws Exception {
-    ev.new Scenario()
-        .testIfExactError("'int' value has no field or method 'to_string'", "s = 3.to_string()");
-  }
-
-  @Test
-  public void testStructAccess() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.struct_field")
-        .testLookup("v", "a");
-  }
-
-  @Test
-  public void testStructAccessAsFuncallNonCallable() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError("'string' object is not callable", "v = mock.struct_field()");
-  }
-
-  @Test
-  public void testSelfCall() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock('bestmock')")
-        .testLookup("v", "I'm a mock named bestmock");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("mockfunction = mock", "v = mockfunction('bestmock')")
-        .testLookup("v", "I'm a mock named bestmock");
-
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "in call to MockFn(), parameter 'pos' got value of type 'int', want 'string'",
-            "v = mock(1)");
-  }
-
-  @Test
-  public void testStructAccessAsFuncall() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.struct_field_callable()")
-        .testLookup("v", "foobar");
-  }
-
-  @Test
-  public void testCallingInterruptedStructField() throws Exception {
-    ev.update("mock", new Mock());
-    assertThrows(InterruptedException.class, () -> ev.eval("mock.interrupted_struct_field()"));
-  }
-
-  @Test
-  public void testCallingInterruptedFunction() throws Exception {
-    ev.update("interrupted_function", new BuiltinCallable(this, "interrupted_function"));
-    assertThrows(InterruptedException.class, () -> ev.eval("interrupted_function()"));
-  }
-
-  @Test
-  public void testCallingMethodThatRaisesUncheckedException() throws Exception {
-    ev.update("mock", new Mock());
-    assertThrows(InternalError.class, () -> ev.eval("mock.raise_unchecked_exception()"));
-  }
-
-  @Test
-  public void testJavaFunctionWithExtraInterpreterParams() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.with_extra()")
-        .testLookup("v", "with_extra(1)");
-  }
-
-  @Test
-  public void testStructFieldWithExtraInterpreterParams() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.struct_field_with_extra")
-        .testLookup("v", "struct_field_with_extra(true)");
-  }
-
-  @Test
-  public void testJavaFunctionWithParamsAndExtraInterpreterParams() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_params_and_extra(1, True, named=True)")
-        .testLookup("b", "with_params_and_extra(1, true, false, true, false, a, 1)");
-  }
-
-  @Test
-  public void testJavaFunctionWithExtraArgsAndThread() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_args_and_thread(1, True, 'extraArg1', 'extraArg2', named=True)")
-        .testLookup("b", "with_args_and_thread(1, true, true, args(extraArg1, extraArg2))");
-
-    // Use an args list.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "myargs = ['extraArg2']",
-            "b = mock.with_args_and_thread(1, True, 'extraArg1', named=True, *myargs)")
-        .testLookup("b", "with_args_and_thread(1, true, true, args(extraArg1, extraArg2))");
-  }
-
-  @Test
-  public void testJavaFunctionWithExtraKwargs() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_kwargs(True, extraKey1=True, named=True, extraKey2='x')")
-        .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))");
-
-    // Use a kwargs dict.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "mykwargs = {'extraKey2':'x', 'named':True}",
-            "b = mock.with_kwargs(True, extraKey1=True, **mykwargs)")
-        .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))");
-  }
-
-  @Test
-  public void testJavaFunctionWithArgsAndKwargs() throws Exception {
-    // Foo is used positionally
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')")
-        .testLookup(
-            "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))");
-
-    // Use an args list and a kwargs dict
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "mykwargs = {'extraKey1':True}",
-            "myargs = ['baz']",
-            "b = mock.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)")
-        .testLookup(
-            "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))");
-
-    // Foo is used by name
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_args_and_kwargs(foo='foo', extraKey1=True)")
-        .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))");
-
-    // Empty args and kwargs.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("b = mock.with_args_and_kwargs('foo')")
-        .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())");
-  }
-
-  @Test
-  public void testProxyMethodsObjectWithArgsAndKwargs() throws Exception {
-    // Foo is used positionally
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "m = mock.proxy_methods_object()",
-            "b = m.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')")
-        .testLookup(
-            "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))");
-
-    // Use an args list and a kwargs dict
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "mykwargs = {'extraKey1':True}",
-            "myargs = ['baz']",
-            "m = mock.proxy_methods_object()",
-            "b = m.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)")
-        .testLookup(
-            "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))");
-
-    // Foo is used by name
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "m = mock.proxy_methods_object()",
-            "b = m.with_args_and_kwargs(foo='foo', extraKey1=True)")
-        .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))");
-
-    // Empty args and kwargs.
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("m = mock.proxy_methods_object()", "b = m.with_args_and_kwargs('foo')")
-        .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())");
-  }
-
-  @Test
-  public void testStructAccessOfMethod() throws Exception {
-    ev.new Scenario().update("mock", new Mock()).testExpression("type(mock.function)", "function");
-    ev.new Scenario().update("mock", new Mock()).testExpression("mock.function()", "a");
-  }
-
-  @Test
-  public void testStructAccessTypo() throws Exception {
-    ev.new Scenario()
-        .update("mock", new SimpleStruct(ImmutableMap.of("field", 123)))
-        .testIfExactError(
-            "'SimpleStruct' value has no field or method 'fild' (did you mean 'field'?)",
-            "mock.fild");
-  }
-
-  @Test
-  public void testStructAccessType_nonClassObject() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testIfExactError(
-            "'Mock' value has no field or method 'sturct_field' (did you mean 'struct_field'?)",
-            "v = mock.sturct_field");
-  }
-
-  @Test
-  public void testJavaFunctionReturnsIllegalValue() throws Exception {
-    ev.update("mock", new Mock());
-    Starlark.UncheckedEvalException e =
-        assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("mock.return_bad()"));
-    assertThat(e)
-        .hasMessageThat()
-        .contains(
-            "cannot expose internal type to Starlark: class"
-                + " com.google.devtools.build.lib.syntax.StarlarkEvaluationTest$Bad");
-  }
-
-  @Test
-  public void testJavaFunctionReturnsNullFails() throws Exception {
-    ev.update("mock", new Mock());
-    RuntimeException e =
-        assertThrows(RuntimeException.class, () -> ev.eval("mock.nullfunc_failing('abc', 1)"));
-    assertThat(e).hasMessageThat().contains("method invocation returned null");
-  }
-
-  @Test
-  public void testJavaFunctionOverflowsStack() throws Exception {
-    ev.update("stackoverflow", new BuiltinCallable(this, "stackoverflow"));
-    Starlark.UncheckedEvalException e =
-        assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("stackoverflow()"));
-    assertThat(e).hasCauseThat().isInstanceOf(StackOverflowError.class);
-    // Wrapper reveals stack.
-    assertThat(e)
-        .hasMessageThat()
-        .contains(" (Starlark stack: [<expr>@:1:14, stackoverflow@<builtin>])");
-  }
-
-  @Test
-  public void testJavaFunctionThrowsNPE() throws Exception {
-    ev.update("thrownpe", new BuiltinCallable(this, "thrownpe"));
-    Starlark.UncheckedEvalException e =
-        assertThrows(Starlark.UncheckedEvalException.class, () -> ev.eval("thrownpe()"));
-    // Wrapper reveals stack.
-    assertThat(e)
-        .hasMessageThat()
-        .contains("oops (Starlark stack: [<expr>@:1:9, thrownpe@<builtin>])");
-    // The underlying exception is preserved as cause.
-    assertThat(e).hasCauseThat().isInstanceOf(NullPointerException.class);
-    assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("oops");
-  }
-
-  @Test
-  public void testClassObjectAccess() throws Exception {
-    ev.new Scenario()
-        .update("mock", new SimpleStruct(ImmutableMap.of("field", "a")))
-        .setUp("v = mock.field")
-        .testLookup("v", "a");
-  }
-
-  @Test
-  public void testFieldReturnsNonStarlarkValue() throws Exception {
-    ev.update("s", new SimpleStruct(ImmutableMap.of("bad", new StringBuilder())));
-    RuntimeException e = assertThrows(RuntimeException.class, () -> ev.eval("s.bad"));
-    assertThat(e)
-        .hasMessageThat()
-        .contains("invalid Starlark value: class java.lang.StringBuilder");
-  }
-
-  @Test
-  public void testJavaFunctionReturnsNone() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.nullfunc_working()")
-        .testLookup("v", Starlark.NONE);
-  }
-
-  @Test
-  public void testVoidJavaFunctionReturnsNone() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("v = mock.voidfunc()")
-        .testLookup("v", Starlark.NONE);
-  }
-
-  @Test
-  public void testAugmentedAssignment() throws Exception {
-    ev.new Scenario()
-        .setUp("def f1(x):", "  x += 1", "  return x", "", "foo = f1(41)")
-        .testLookup("foo", 42);
-  }
-
-  @Test
-  public void testAugmentedAssignmentHasNoSideEffects() throws Exception {
-    // Check object position.
-    ev.new Scenario()
-        .setUp(
-            "counter = [0]",
-            "value = [1, 2]",
-            "",
-            "def f():",
-            "  counter[0] = counter[0] + 1",
-            "  return value",
-            "",
-            "f()[1] += 1") // `f()` should be called only once here
-        .testLookup("counter", StarlarkList.of(null, 1));
-
-    // Check key position.
-    ev.new Scenario()
-        .setUp(
-            "counter = [0]",
-            "value = [1, 2]",
-            "",
-            "def f():",
-            "  counter[0] = counter[0] + 1",
-            "  return 1",
-            "",
-            "value[f()] += 1") // `f()` should be called only once here
-        .testLookup("counter", StarlarkList.of(null, 1));
-  }
-
-  @Test
-  public void testInvalidAugmentedAssignment_listExpression() throws Exception {
-    assertResolutionError(
-        "cannot perform augmented assignment on a list or tuple expression",
-        //
-        "def f(a, b):",
-        "  [a, b] += []",
-        "f(1, 2)");
-  }
-
-  @Test
-  public void testInvalidAugmentedAssignment_notAnLValue() throws Exception {
-    assertResolutionError(
-        "cannot assign to 'x + 1'",
-        //
-        "x + 1 += 2");
-  }
-
-  @Test
-  public void testAssignmentEvaluationOrder() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "ordinary = []",
-            "augmented = []",
-            "value = [1, 2]",
-            "",
-            "def f(record):",
-            "  record.append('f')",
-            "  return value",
-            "",
-            "def g(record):",
-            "  record.append('g')",
-            "  return value",
-            "",
-            "f(ordinary)[0] = g(ordinary)[1]",
-            "f(augmented)[0] += g(augmented)[1]")
-        .testLookup("ordinary", StarlarkList.of(null, "g", "f")) // This order is consistent
-        .testLookup("augmented", StarlarkList.of(null, "f", "g")); // with Python
-  }
-
-  @Test
-  public void testDictComprehensions_iterationOrder() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def foo():",
-            "  d = {x : x for x in ['c', 'a', 'b']}",
-            "  s = ''",
-            "  for a in d:",
-            "    s += a",
-            "  return s",
-            "s = foo()")
-        .testLookup("s", "cab");
-  }
-
-  @Test
-  public void testDotExpressionOnNonStructObject() throws Exception {
-    ev.new Scenario()
-        .testIfExactError(
-            "'string' value has no field or method 'field' (did you mean 'find'?)",
-            "x = 'a'.field");
-  }
-
-  @Test
-  public void testPlusEqualsOnListMutating() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  l1 = [1, 2]",
-            "  l2 = l1",
-            "  l2 += [3, 4]",
-            "  return l1, l2",
-            "lists = str(func())")
-        .testLookup("lists", "([1, 2, 3, 4], [1, 2, 3, 4])");
-
-    // The same but with += after an IndexExpression
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  l = [1, 2]",
-            "  d = {0: l}",
-            "  d[0] += [3, 4]",
-            "  return l, d[0]",
-            "lists = str(func())")
-        .testLookup("lists", "([1, 2, 3, 4], [1, 2, 3, 4])");
-  }
-
-  @Test
-  public void testPlusEqualsOnTuple() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  t1 = (1, 2)",
-            "  t2 = t1",
-            "  t2 += (3, 4)",
-            "  return t1, t2",
-            "tuples = func()")
-        .testLookup("tuples", Tuple.of(Tuple.of(1, 2), Tuple.of(1, 2, 3, 4)));
-  }
-
-  @Test
-  public void testPlusOnDictDeprecated() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains("unsupported binary operation: dict + dict", "{1: 2} + {3: 4}");
-    ev.new Scenario()
-        .testIfErrorContains(
-            "unsupported binary operation: dict + dict",
-            "def func():",
-            "  d = {1: 2}",
-            "  d += {3: 4}",
-            "func()");
-  }
-
-  @Test
-  public void testDictAssignmentAsLValue() throws Exception {
-    ev.new Scenario()
-        .setUp("def func():", "  d = {'a' : 1}", "  d['b'] = 2", "  return d", "d = func()")
-        .testLookup("d", ImmutableMap.of("a", 1, "b", 2));
-  }
-
-  @Test
-  public void testNestedDictAssignmentAsLValue() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  d = {'a' : 1}",
-            "  e = {'d': d}",
-            "  e['d']['b'] = 2",
-            "  return e",
-            "e = func()")
-        .testLookup("e", ImmutableMap.of("d", ImmutableMap.of("a", 1, "b", 2)));
-  }
-
-  @Test
-  public void testListAssignmentAsLValue() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  a = [1, 2]",
-            "  a[1] = 3",
-            "  a[-2] = 4",
-            "  return a",
-            "a = str(func())")
-        .testLookup("a", "[4, 3]");
-  }
-
-  @Test
-  public void testNestedListAssignmentAsLValue() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():",
-            "  d = [1, 2]",
-            "  e = [3, d]",
-            "  e[1][1] = 4",
-            "  return e",
-            "e = str(func())")
-        .testLookup("e", "[3, [1, 4]]");
-  }
-
-  @Test
-  public void testDictTupleAssignmentAsLValue() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def func():", "  d = {'a' : 1}", "  d['b'], d['c'] = 2, 3", "  return d", "d = func()")
-        .testLookup("d", ImmutableMap.of("a", 1, "b", 2, "c", 3));
-  }
-
-  @Test
-  public void testDictItemPlusEqual() throws Exception {
-    ev.new Scenario()
-        .setUp("def func():", "  d = {'a' : 2}", "  d['a'] += 3", "  return d", "d = func()")
-        .testLookup("d", ImmutableMap.of("a", 5));
-  }
-
-  @Test
-  public void testDictAssignmentAsLValueSideEffects() throws Exception {
-    ev.new Scenario()
-        .setUp("def func(d):", "  d['b'] = 2", "d = {'a' : 1}", "func(d)")
-        .testLookup("d", Dict.of((Mutability) null, "a", 1, "b", 2));
-  }
-
-  @Test
-  public void testAssignmentToListInDictSideEffect() throws Exception {
-    ev.new Scenario()
-        .setUp("l = [1, 2]", "d = {0: l}", "d[0].append(3)")
-        .testLookup("l", StarlarkList.of(null, 1, 2, 3));
-  }
-
-  @Test
-  public void testUserFunctionKeywordArgs() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo(a, b, c):", "  return a + b + c", "s = foo(1, c=2, b=3)")
-        .testLookup("s", 6);
-  }
-
-  @Test
-  public void testFunctionCallOrdering() throws Exception {
-    ev.new Scenario()
-        .setUp("def func(): return foo() * 2", "def foo(): return 2", "x = func()")
-        .testLookup("x", 4);
-  }
-
-  @Test
-  public void testFunctionCallBadOrdering() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "global variable 'foo' is referenced before assignment.",
-            "def func(): return foo() * 2",
-            "x = func()",
-            "def foo(): return 2");
-  }
-
-  @Test
-  public void testLocalVariableDefinedBelow() throws Exception {
-    ev.new Scenario()
-        .setUp(
-            "def beforeEven(li):", // returns the value before the first even number
-            "    for i in li:",
-            "        if i % 2 == 0:",
-            "            return a",
-            "        else:",
-            "            a = i",
-            "res = beforeEven([1, 3, 4, 5])")
-        .testLookup("res", 3);
-  }
-
-  @Test
-  public void testShadowisNotInitialized() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            /* error message */ "local variable 'gl' is referenced before assignment",
-            "gl = 5",
-            "def foo():",
-            "    if False: gl = 2",
-            "    return gl",
-            "res = foo()");
-  }
-
-  @Test
-  public void testShadowBuiltin() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "global variable 'len' is referenced before assignment",
-            "x = len('abc')",
-            "len = 2",
-            "y = x + len");
-  }
-
-  @Test
-  public void testFunctionCallRecursion() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "function 'f' called recursively",
-            "def main():",
-            "  f(5)",
-            "def f(n):",
-            "  if n > 0: g(n - 1)",
-            "def g(n):",
-            "  if n > 0: f(n - 1)",
-            "main()");
-  }
-
-  @Test
-  // TODO(adonovan): move to ResolverTest.
-  public void testTypo() throws Exception {
-    assertResolutionError(
-        "name 'my_variable' is not defined (did you mean 'myVariable'?)",
-        //
-        "myVariable = 2",
-        "x = my_variable + 1");
-  }
-
-  @Test
-  public void testNoneTrueFalseInStarlark() throws Exception {
-    ev.new Scenario()
-        .setUp("a = None", "b = True", "c = False")
-        .testLookup("a", Starlark.NONE)
-        .testLookup("b", Boolean.TRUE)
-        .testLookup("c", Boolean.FALSE);
-  }
-
-  @Test
-  public void testHasattrMethods() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "a = hasattr(mock, 'struct_field')",
-            "b = hasattr(mock, 'function')",
-            "c = hasattr(mock, 'is_empty')",
-            "d = hasattr('str', 'replace')",
-            "e = hasattr(mock, 'other')\n")
-        .testLookup("a", Boolean.TRUE)
-        .testLookup("b", Boolean.TRUE)
-        .testLookup("c", Boolean.TRUE)
-        .testLookup("d", Boolean.TRUE)
-        .testLookup("e", Boolean.FALSE);
-  }
-
-  @Test
-  public void testGetattrMethods() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp(
-            "a = str(getattr(mock, 'struct_field', 'no'))",
-            "b = str(getattr(mock, 'function', 'no'))",
-            "c = str(getattr(mock, 'is_empty', 'no'))",
-            "d = str(getattr('str', 'replace', 'no'))",
-            "e = str(getattr(mock, 'other', 'no'))\n")
-        .testLookup("a", "a")
-        .testLookup("b", "<built-in function function>")
-        .testLookup("c", "<built-in function is_empty>")
-        .testLookup("d", "<built-in function replace>")
-        .testLookup("e", "no");
-  }
-
-  @Test
-  public void testListAnTupleConcatenationDoesNotWorkInStarlark() throws Exception {
-    ev.new Scenario()
-        .testIfExactError("unsupported binary operation: list + tuple", "[1, 2] + (3, 4)");
-  }
-
-  @Test
-  public void testCannotCreateMixedListInStarlark() throws Exception {
-    ev.new Scenario().testExactOrder("['a', 'b', 1, 2]", "a", "b", 1, 2);
-  }
-
-  @Test
-  public void testCannotConcatListInStarlarkWithDifferentGenericTypes() throws Exception {
-    ev.new Scenario().testExactOrder("[1, 2] + ['a', 'b']", 1, 2, "a", "b");
-  }
-
-  @Test
-  public void testConcatEmptyListWithNonEmptyWorks() throws Exception {
-    ev.new Scenario().testExactOrder("[] + ['a', 'b']", "a", "b");
-  }
-
-  @Test
-  public void testFormatStringWithTuple() throws Exception {
-    ev.new Scenario().setUp("v = '%s%s' % ('a', 1)").testLookup("v", "a1");
-  }
-
-  @Test
-  public void testSingletonTuple() throws Exception {
-    ev.new Scenario().testExactOrder("(1,)", 1);
-  }
-
-  @Test
-  public void testDirFindsClassObjectFields() throws Exception {
-    ev.new Scenario()
-        .update("s", new SimpleStruct(ImmutableMap.of("a", 1, "b", 2)))
-        .testExactOrder("dir(s)", "a", "b");
-  }
-
-  @Test
-  public void testDirFindsJavaObjectStructFieldsAndMethods() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .testExactOrder(
-            "dir(mock)",
-            "function",
-            "interrupted_struct_field",
-            "is_empty",
-            "nullfunc_failing",
-            "nullfunc_working",
-            "proxy_methods_object",
-            "raise_unchecked_exception",
-            "return_bad",
-            "string",
-            "string_list",
-            "string_list_dict",
-            "struct_field",
-            "struct_field_callable",
-            "struct_field_with_extra",
-            "value_of",
-            "voidfunc",
-            "with_args_and_kwargs",
-            "with_args_and_thread",
-            "with_extra",
-            "with_kwargs",
-            "with_params",
-            "with_params_and_extra");
-  }
-
-  @Test
-  public void testPrint() throws Exception {
-    ParserInput input =
-        ParserInput.fromLines(
-            "print('hello')", //
-            "print('a', 'b')",
-            "print('a', 'b', sep='x')");
-    List<String> prints = new ArrayList<>();
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      thread.setPrintHandler((unused, msg) -> prints.add(msg));
-      Starlark.execFile(input, FileOptions.DEFAULT, Module.create(), thread);
-    }
-    assertThat(prints).containsExactly("hello", "a b", "axb").inOrder();
-  }
-
-  @Test
-  public void testPrintBadKwargs() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "print() got unexpected keyword argument 'end'", "print(end='x', other='y')");
-  }
-
-  @Test
-  public void testConditionalExpressionAtToplevel() throws Exception {
-    ev.new Scenario().setUp("x = 1 if 2 else 3").testLookup("x", 1);
-  }
-
-  @Test
-  public void testConditionalExpressionInFunction() throws Exception {
-    ev.new Scenario()
-        .setUp("def foo(a, b, c): return a+b if c else a-b\n")
-        .testExpression("foo(23, 5, 0)", 18);
-  }
-
-  // SimpleStructWithMethods augments SimpleStruct's fields with annotated Java methods.
-  private static final class SimpleStructWithMethods extends SimpleStruct {
-
-    // A function that returns "fromValues".
-    private static final Object returnFromValues =
-        new StarlarkCallable() {
-          @Override
-          public String getName() {
-            return "returnFromValues";
-          }
-
-          @Override
-          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
-            return "fromValues";
-          }
-        };
-
-    SimpleStructWithMethods() {
-      super(
-          ImmutableMap.of(
-              "values_only_field",
-              "fromValues",
-              "values_only_method",
-              returnFromValues,
-              "collision_field",
-              "fromValues",
-              "collision_method",
-              returnFromValues));
-    }
-
-    @StarlarkMethod(name = "callable_only_field", documented = false, structField = true)
-    public String getCallableOnlyField() {
-      return "fromStarlarkMethod";
-    }
-
-    @StarlarkMethod(name = "callable_only_method", documented = false, structField = false)
-    public String getCallableOnlyMethod() {
-      return "fromStarlarkMethod";
-    }
-
-    @StarlarkMethod(name = "collision_field", documented = false, structField = true)
-    public String getCollisionField() {
-      return "fromStarlarkMethod";
-    }
-
-    @StarlarkMethod(name = "collision_method", documented = false, structField = false)
-    public String getCollisionMethod() {
-      return "fromStarlarkMethod";
-    }
-  }
-
-  @Test
-  public void testStructFieldDefinedOnlyInValues() throws Exception {
-    ev.new Scenario()
-        .update("val", new SimpleStructWithMethods())
-        .setUp("v = val.values_only_field")
-        .testLookup("v", "fromValues");
-  }
-
-  @Test
-  public void testStructMethodDefinedOnlyInValues() throws Exception {
-    ev.new Scenario()
-        .update("val", new SimpleStructWithMethods())
-        .setUp("v = val.values_only_method()")
-        .testLookup("v", "fromValues");
-  }
-
-  @Test
-  public void testStructFieldDefinedOnlyInStarlarkMethod() throws Exception {
-    ev.new Scenario()
-        .update("val", new SimpleStructWithMethods())
-        .setUp("v = val.callable_only_field")
-        .testLookup("v", "fromStarlarkMethod");
-  }
-
-  @Test
-  public void testStructMethodDefinedOnlyInStarlarkMethod() throws Exception {
-    ev.new Scenario()
-        .update("val", new SimpleStructWithMethods())
-        .setUp("v = val.callable_only_method()")
-        .testLookup("v", "fromStarlarkMethod");
-  }
-
-  @Test
-  public void testStructMethodDefinedInValuesAndStarlarkMethod() throws Exception {
-    // This test exercises the resolution of ambiguity between @StarlarkMethod-annotated
-    // fields and those reported by ClassObject.getValue.
-    ev.new Scenario()
-        .update("val", new SimpleStructWithMethods())
-        .setUp("v = val.collision_method()")
-        .testLookup("v", "fromStarlarkMethod");
-  }
-
-  @Test
-  public void testAttrNotDefined() throws Exception {
-    ev.new Scenario()
-        .update("s", new SimpleStructWithMethods())
-        // dir shows all fields and methods
-        .testEval(
-            "dir(s)",
-            "['callable_only_field', 'callable_only_method', 'collision_field',"
-                + " 'collision_method', 'values_only_field', 'values_only_method']")
-        // field-like non-existent access
-        .testIfExactError(
-            "'SimpleStructWithMethods' value has no field or method 'nonesuch'", "s.nonesuch")
-        // method-like non-existent access (same result)
-        .testIfExactError(
-            "'SimpleStructWithMethods' value has no field or method 'nonesuch'", "s.nonesuch()")
-        // spelling hint
-        .testIfExactError(
-            "'SimpleStructWithMethods' value has no field or method 'collision_metod' (did you"
-                + " mean 'collision_method'?)",
-            "s.collision_metod");
-  }
-
-  @Test
-  public void testListComprehensionsShadowGlobalVariable() throws Exception {
-    ev.exec(
-        "a = 18", //
-        "def foo():",
-        "  b = [a for a in range(3)]",
-        "  return a",
-        "x = foo()");
-    assertThat(ev.lookup("x")).isEqualTo(18);
-  }
-
-  @Test
-  public void testComprehensionsAreLocal() throws Exception {
-    // Regression test for https://github.com/bazelbuild/starlark/issues/92.
-    ev.exec(
-        "x = 1", // this global binding is not affected (even temporarily) by the comprehension
-        "def f():",
-        "  return x",
-        "y = [f() for x in [2]][0]");
-    assertThat(ev.lookup("y")).isEqualTo(1);
-  }
-
-  @Test
-  public void testFunctionEvaluatedBeforeArguments() throws Exception {
-    // ''.nonesuch must be evaluated (and fail) before f().
-    ev.new Scenario()
-        .testIfErrorContains(
-            "'string' value has no field or method 'nonesuch'",
-            "def f(): x = 1//0",
-            "''.nonesuch(f())");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
deleted file mode 100644
index 576c913..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2006 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Joiner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of StarlarkFile parsing. */
-// TODO(adonovan): move tests of parsing into ParserTest.
-@RunWith(JUnit4.class)
-public class StarlarkFileTest {
-
-  /**
-   * Parses the contents of the specified string (using 'foo.star' as the apparent filename) and
-   * returns the AST. Resets the error handler beforehand.
-   */
-  private static StarlarkFile parseFile(String... lines) {
-    String src = Joiner.on("\n").join(lines);
-    ParserInput input = ParserInput.fromString(src, "foo.star");
-    return StarlarkFile.parse(input);
-  }
-
-  @Test
-  public void testParsesFineWithNewlines() throws Exception {
-    StarlarkFile file = parseFile("foo()", "bar()", "something = baz()", "bar()");
-    assertThat(file.getStatements()).hasSize(4);
-  }
-
-  @Test
-  public void testFailsIfNewlinesAreMissing() throws Exception {
-    StarlarkFile file = parseFile("foo() bar() something = baz() bar()");
-
-    SyntaxError error =
-        LexerTest.assertContainsError(file.errors(), "syntax error at \'bar\': expected newline");
-    assertThat(error.location().toString()).isEqualTo("foo.star:1:7");
-  }
-
-  @Test
-  public void testImplicitStringConcatenationFails() throws Exception {
-    // TODO(adonovan): move to ParserTest.
-    StarlarkFile file = parseFile("a = 'foo' 'bar'");
-    SyntaxError error =
-        LexerTest.assertContainsError(
-            file.errors(), "Implicit string concatenation is forbidden, use the + operator");
-    assertThat(error.location().toString()).isEqualTo("foo.star:1:11"); // start of 'bar'
-  }
-
-  @Test
-  public void testImplicitStringConcatenationAcrossLinesIsIllegal() throws Exception {
-    StarlarkFile file = parseFile("a = 'foo'\n  'bar'");
-
-    SyntaxError error = LexerTest.assertContainsError(file.errors(), "indentation error");
-    assertThat(error.location().toString()).isEqualTo("foo.star:2:2");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
deleted file mode 100644
index 082c07e..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import com.google.common.collect.ImmutableMap;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Starlark evaluation tests which verify the infrastructure which toggles build API methods and
- * parameters with semantic flags.
- */
-@RunWith(JUnit4.class)
-public final class StarlarkFlagGuardingTest {
-
-  // We define two arbitrary flags (one experimental, one incompatible) for our testing.
-  private static final String EXPERIMENTAL_FLAG = "-experimental_flag";
-  private static final String INCOMPATIBLE_FLAG = "+incompatible_flag";
-
-  private static final String FLAG1 = EXPERIMENTAL_FLAG;
-  private static final StarlarkSemantics FLAG1_TRUE =
-      StarlarkSemantics.builder().setBool(EXPERIMENTAL_FLAG, true).build();
-  private static final StarlarkSemantics FLAG1_FALSE =
-      StarlarkSemantics.builder().setBool(EXPERIMENTAL_FLAG, false).build();
-
-  private static final String FLAG2 = INCOMPATIBLE_FLAG;
-  private static final StarlarkSemantics FLAG2_TRUE =
-      StarlarkSemantics.builder().setBool(INCOMPATIBLE_FLAG, true).build();
-  private static final StarlarkSemantics FLAG2_FALSE =
-      StarlarkSemantics.builder().setBool(INCOMPATIBLE_FLAG, false).build();
-
-  private EvaluationTestCase ev = new EvaluationTestCase();
-
-  /** Mock containing exposed methods for flag-guarding tests. */
-  @StarlarkBuiltin(name = "Mock", doc = "")
-  public static class Mock implements StarlarkValue {
-
-    @StarlarkMethod(
-        name = "positionals_only_method",
-        documented = false,
-        parameters = {
-          @Param(name = "a", positional = true, named = false, type = Integer.class),
-          @Param(
-              name = "b",
-              positional = true,
-              named = false,
-              type = Boolean.class,
-              enableOnlyWithFlag = EXPERIMENTAL_FLAG,
-              valueWhenDisabled = "False"),
-          @Param(name = "c", positional = true, named = false, type = Integer.class),
-        },
-        useStarlarkThread = true)
-    public String positionalsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
-      return "positionals_only_method(" + a + ", " + b + ", " + c + ")";
-    }
-
-    @StarlarkMethod(
-        name = "keywords_only_method",
-        documented = false,
-        parameters = {
-          @Param(name = "a", positional = false, named = true, type = Integer.class),
-          @Param(
-              name = "b",
-              positional = false,
-              named = true,
-              type = Boolean.class,
-              enableOnlyWithFlag = EXPERIMENTAL_FLAG,
-              valueWhenDisabled = "False"),
-          @Param(name = "c", positional = false, named = true, type = Integer.class),
-        },
-        useStarlarkThread = true)
-    public String keywordsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
-      return "keywords_only_method(" + a + ", " + b + ", " + c + ")";
-    }
-
-    @StarlarkMethod(
-        name = "mixed_params_method",
-        documented = false,
-        parameters = {
-          @Param(name = "a", positional = true, named = false, type = Integer.class),
-          @Param(
-              name = "b",
-              positional = true,
-              named = false,
-              type = Boolean.class,
-              enableOnlyWithFlag = EXPERIMENTAL_FLAG,
-              valueWhenDisabled = "False"),
-          @Param(
-              name = "c",
-              positional = false,
-              named = true,
-              type = Integer.class,
-              enableOnlyWithFlag = EXPERIMENTAL_FLAG,
-              valueWhenDisabled = "3"),
-          @Param(name = "d", positional = false, named = true, type = Boolean.class),
-        },
-        useStarlarkThread = true)
-    public String mixedParamsMethod(
-        Integer a, boolean b, Integer c, boolean d, StarlarkThread thread) {
-      return "mixed_params_method(" + a + ", " + b + ", " + c + ", " + d + ")";
-    }
-
-    @StarlarkMethod(
-        name = "keywords_multiple_flags",
-        documented = false,
-        parameters = {
-          @Param(name = "a", positional = false, named = true, type = Integer.class),
-          @Param(
-              name = "b",
-              positional = false,
-              named = true,
-              type = Boolean.class,
-              disableWithFlag = FLAG2,
-              valueWhenDisabled = "False"),
-          @Param(
-              name = "c",
-              positional = false,
-              named = true,
-              type = Integer.class,
-              enableOnlyWithFlag = FLAG1,
-              valueWhenDisabled = "3"),
-        },
-        useStarlarkThread = true)
-    public String keywordsMultipleFlags(Integer a, boolean b, Integer c, StarlarkThread thread) {
-      return "keywords_multiple_flags(" + a + ", " + b + ", " + c + ")";
-    }
-  }
-
-  @Test
-  public void testPositionalsOnlyGuardedMethod() throws Exception {
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testEval(
-            "mock.positionals_only_method(1, True, 3)", "'positionals_only_method(1, true, 3)'");
-
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "in call to positionals_only_method(), parameter 'b' got value of type 'int', want"
-                + " 'bool'",
-            "mock.positionals_only_method(1, 3)");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testEval("mock.positionals_only_method(1, 3)", "'positionals_only_method(1, false, 3)'");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "in call to positionals_only_method(), parameter 'c' got value of type 'bool', want"
-                + " 'int'",
-            "mock.positionals_only_method(1, True, 3)");
-  }
-
-  @Test
-  public void testKeywordOnlyGuardedMethod() throws Exception {
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testEval(
-            "mock.keywords_only_method(a=1, b=True, c=3)", "'keywords_only_method(1, true, 3)'");
-
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "keywords_only_method() missing 1 required named argument: b",
-            "mock.keywords_only_method(a=1, c=3)");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testEval("mock.keywords_only_method(a=1, c=3)", "'keywords_only_method(1, false, 3)'");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "parameter 'b' is experimental and thus unavailable with the current "
-                + "flags. It may be enabled by setting --experimental_flag",
-            "mock.keywords_only_method(a=1, b=True, c=3)");
-  }
-
-  @Test
-  public void testMixedParamsMethod() throws Exception {
-    // def mixed_params_method(a, b, c = ?, d = ?)
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testEval(
-            "mock.mixed_params_method(1, True, c=3, d=True)",
-            "'mixed_params_method(1, true, 3, true)'");
-
-    ev.new Scenario(FLAG1_TRUE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            // Missing named arguments (d) are not reported
-            // if there are missing positional arguments.
-            "mixed_params_method() missing 1 required positional argument: b",
-            "mock.mixed_params_method(1, c=3)");
-
-    // def mixed_params_method(a, b disabled = False, c disabled = 3, d = ?)
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testEval(
-            "mock.mixed_params_method(1, d=True)", "'mixed_params_method(1, false, 3, true)'");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "mixed_params_method() accepts no more than 1 positional argument but got 2",
-            "mock.mixed_params_method(1, True, d=True)");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .update("mock", new Mock())
-        .testIfErrorContains(
-            "mixed_params_method() accepts no more than 1 positional argument but got 2",
-            "mock.mixed_params_method(1, True, c=3, d=True)");
-  }
-
-  @Test
-  public void testKeywordsMultipleFlags() throws Exception {
-    StarlarkSemantics tf = FLAG1_TRUE.toBuilder().setBool(FLAG2, false).build();
-    ev.new Scenario(tf)
-        .update("mock", new Mock())
-        .testEval(
-            "mock.keywords_multiple_flags(a=42, b=True, c=0)",
-            "'keywords_multiple_flags(42, true, 0)'")
-        .testIfErrorContains(
-            "keywords_multiple_flags() missing 2 required named arguments: b, c",
-            "mock.keywords_multiple_flags(a=42)");
-
-    StarlarkSemantics ft = FLAG1_FALSE.toBuilder().setBool(FLAG2, true).build();
-    ev.new Scenario(ft)
-        .update("mock", new Mock())
-        .testEval("mock.keywords_multiple_flags(a=42)", "'keywords_multiple_flags(42, false, 3)'")
-        .testIfErrorContains(
-            "parameter 'b' is deprecated and will be removed soon. It may be "
-                + "temporarily re-enabled by setting --incompatible_flag=false",
-            "mock.keywords_multiple_flags(a=42, b=True, c=0)");
-  }
-
-  @Test
-  public void testExperimentalFlagGuardedValue() throws Exception {
-    // This test uses an arbitrary experimental flag to verify this functionality. If this
-    // experimental flag were to go away, this test may be updated to use any experimental flag.
-    // The flag itself is unimportant to the test.
-
-    // clumsy way to predeclare
-    ev =
-        new EvaluationTestCase() {
-          @Override
-          protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
-            predeclared.put(
-                "GlobalSymbol",
-                FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(EXPERIMENTAL_FLAG, "foo"));
-            return null; // no client data
-          }
-        };
-
-    String errorMessage =
-        "GlobalSymbol is experimental and thus unavailable with the current "
-            + "flags. It may be enabled by setting --experimental_flag";
-
-    ev.new Scenario(FLAG1_TRUE).setUp("var = GlobalSymbol").testLookup("var", "foo");
-
-    ev.new Scenario(FLAG1_FALSE).testIfErrorContains(errorMessage, "var = GlobalSymbol");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .testIfErrorContains(errorMessage, "def my_function():", "  var = GlobalSymbol");
-
-    ev.new Scenario(FLAG1_FALSE)
-        .setUp("GlobalSymbol = 'other'", "var = GlobalSymbol")
-        .testLookup("var", "other");
-  }
-
-  @Test
-  public void testIncompatibleFlagGuardedValue() throws Exception {
-    // This test uses an arbitrary incompatible flag to verify this functionality. If this
-    // incompatible flag were to go away, this test may be updated to use any incompatible flag.
-    // The flag itself is unimportant to the test.
-
-    ev =
-        new EvaluationTestCase() {
-          @Override
-          protected Object newModuleHook(ImmutableMap.Builder<String, Object> predeclared) {
-            predeclared.put(
-                "GlobalSymbol", FlagGuardedValue.onlyWhenIncompatibleFlagIsFalse(FLAG2, "foo"));
-            return null; // no client data
-          }
-        };
-
-    String errorMessage =
-        "GlobalSymbol is deprecated and will be removed soon. It may be "
-            + "temporarily re-enabled by setting --"
-            + FLAG2.substring(1)
-            + "=false";
-
-    ev.new Scenario(FLAG2_FALSE).setUp("var = GlobalSymbol").testLookup("var", "foo");
-
-    ev.new Scenario(FLAG2_TRUE).testIfErrorContains(errorMessage, "var = GlobalSymbol");
-
-    ev.new Scenario(FLAG2_TRUE)
-        .testIfErrorContains(errorMessage, "def my_function():", "  var = GlobalSymbol");
-
-    ev.new Scenario(FLAG2_TRUE)
-        .setUp("GlobalSymbol = 'other'", "var = GlobalSymbol")
-        .testLookup("var", "other");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java
deleted file mode 100644
index 7d5afa2..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkInterfaceUtilsTest.java
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2016 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import java.lang.reflect.Method;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkInterfaceUtils;
-import net.starlark.java.annot.StarlarkMethod;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Test Starlark interface annotations and utilities. */
-@RunWith(JUnit4.class)
-public class StarlarkInterfaceUtilsTest {
-
-  /** MockClassA */
-  @StarlarkBuiltin(name = "MockClassA", doc = "MockClassA")
-  public static class MockClassA implements StarlarkValue {
-    @StarlarkMethod(name = "foo", doc = "MockClassA#foo")
-    public void foo() {}
-
-    @StarlarkMethod(name = "bar", doc = "MockClassA#bar")
-    public void bar() {}
-
-    public void baz() {}
-  }
-
-  /** MockInterfaceB1 */
-  @StarlarkBuiltin(name = "MockInterfaceB1", doc = "MockInterfaceB1")
-  public static interface MockInterfaceB1 extends StarlarkValue {
-    @StarlarkMethod(name = "foo", doc = "MockInterfaceB1#foo")
-    void foo();
-
-    @StarlarkMethod(name = "bar", doc = "MockInterfaceB1#bar")
-    void bar();
-
-    @StarlarkMethod(name = "baz", doc = "MockInterfaceB1#baz")
-    void baz();
-  }
-
-  /** MockInterfaceB2 */
-  @StarlarkBuiltin(name = "MockInterfaceB2", doc = "MockInterfaceB2")
-  public static interface MockInterfaceB2 extends StarlarkValue {
-    @StarlarkMethod(name = "baz", doc = "MockInterfaceB2#baz")
-    void baz();
-
-    @StarlarkMethod(name = "qux", doc = "MockInterfaceB2#qux")
-    void qux();
-  }
-
-  /** MockClassC */
-  @StarlarkBuiltin(name = "MockClassC", doc = "MockClassC")
-  public static class MockClassC extends MockClassA implements MockInterfaceB1, MockInterfaceB2 {
-    @Override
-    @StarlarkMethod(name = "foo", doc = "MockClassC#foo")
-    public void foo() {}
-
-    @Override
-    public void bar() {}
-    @Override
-    public void baz() {}
-    @Override
-    public void qux() {}
-  }
-
-  /** MockClassD */
-  public static class MockClassD extends MockClassC {
-    @Override
-    @StarlarkMethod(name = "foo", doc = "MockClassD#foo")
-    public void foo() {}
-  }
-
-  /**
-   * A mock class that implements two unrelated module interfaces. This is invalid as the Starlark
-   * type of such an object is ambiguous.
-   */
-  public static class ImplementsTwoUnrelatedInterfaceModules
-      implements MockInterfaceB1, MockInterfaceB2 {
-    @Override
-    public void foo() {}
-    @Override
-    public void bar() {}
-    @Override
-    public void baz() {}
-    @Override
-    public void qux() {}
-  }
-
-  /** ClassAModule test class */
-  @StarlarkBuiltin(name = "ClassAModule", doc = "ClassAModule")
-  public static class ClassAModule implements StarlarkValue {}
-
-  /** ExtendsClassA test class */
-  public static class ExtendsClassA extends ClassAModule {}
-
-  /** InterfaceBModule test interface */
-  @StarlarkBuiltin(name = "InterfaceBModule", doc = "InterfaceBModule")
-  public static interface InterfaceBModule extends StarlarkValue {}
-
-  /** ExtendsInterfaceB test interface */
-  public static interface ExtendsInterfaceB extends InterfaceBModule {}
-
-  /**
-   * A mock class which has two transitive superclasses ({@link ClassAModule} and {@link
-   * InterfaceBModule})) which are unrelated modules. This is invalid as the Starlark type of such
-   * an object is ambiguous.
-   *
-   * <p>In other words: AmbiguousClass -> ClassAModule AmbiguousClass -> InterfaceBModule ... but
-   * ClassAModule and InterfaceBModule have no relation.
-   */
-  public static class AmbiguousClass extends ExtendsClassA implements ExtendsInterfaceB {}
-
-  /** SubclassOfBoth test interface */
-  @StarlarkBuiltin(name = "SubclassOfBoth", doc = "SubclassOfBoth")
-  public static class SubclassOfBoth extends ExtendsClassA implements ExtendsInterfaceB {}
-
-  /**
-   * A mock class similar to {@link AmbiugousClass} in that it has two separate superclass-paths to
-   * Starlark modules, but is resolvable.
-   *
-   * <p>Concretely: UnambiguousClass -> SubclassOfBoth UnambiguousClass -> InterfaceBModule
-   * SubclassOfBoth -> InterfaceBModule
-   *
-   * <p>... so UnambiguousClass is of type SubclassOfBoth.
-   */
-  public static class UnambiguousClass extends SubclassOfBoth implements ExtendsInterfaceB {}
-
-  /** MockClassZ */
-  public static class MockClassZ {
-  }
-
-  // The tests for getStarlarkBuiltin() double as tests for getParentWithStarlarkBuiltin(),
-  // since they share an implementation.
-
-  @Test
-  public void testGetStarlarkBuiltinBasic() throws Exception {
-    // Normal case.
-    StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassA.class);
-    Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassA.class);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassA");
-    assertThat(cls).isNotNull();
-    assertThat(cls).isEqualTo(MockClassA.class);
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinSubclass() throws Exception {
-    // Subclass's annotation is used.
-    StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassC.class);
-    Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassC.class);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassC");
-    assertThat(cls).isNotNull();
-    assertThat(cls).isEqualTo(MockClassC.class);
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinSubclassNoSubannotation() throws Exception {
-    // Falls back on superclass's annotation.
-    StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassD.class);
-    Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassD.class);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassC");
-    assertThat(cls).isNotNull();
-    assertThat(cls).isEqualTo(MockClassC.class);
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinNotFound() throws Exception {
-    // Doesn't exist.
-    StarlarkBuiltin ann = StarlarkInterfaceUtils.getStarlarkBuiltin(MockClassZ.class);
-    Class<?> cls = StarlarkInterfaceUtils.getParentWithStarlarkBuiltin(MockClassZ.class);
-    assertThat(ann).isNull();
-    assertThat(cls).isNull();
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinAmbiguous() throws Exception {
-    assertThrows(IllegalArgumentException.class,
-        () -> StarlarkInterfaceUtils.getStarlarkBuiltin(ImplementsTwoUnrelatedInterfaceModules.class));
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinTransitivelyAmbiguous() throws Exception {
-    assertThrows(IllegalArgumentException.class,
-        () -> StarlarkInterfaceUtils.getStarlarkBuiltin(AmbiguousClass.class));
-  }
-
-  @Test
-  public void testGetStarlarkBuiltinUnambiguousComplex() throws Exception {
-    assertThat(StarlarkInterfaceUtils.getStarlarkBuiltin(SubclassOfBoth.class))
-        .isEqualTo(SubclassOfBoth.class.getAnnotation(StarlarkBuiltin.class));
-
-    assertThat(StarlarkInterfaceUtils.getStarlarkBuiltin(UnambiguousClass.class))
-        .isEqualTo(SubclassOfBoth.class.getAnnotation(StarlarkBuiltin.class));
-  }
-
-  @Test
-  public void testGetStarlarkCallableBasic() throws Exception {
-    // Normal case. Ensure two-arg form is consistent with one-arg form.
-    Method method = MockClassA.class.getMethod("foo");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassA#foo");
-
-    StarlarkMethod ann2 = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
-    assertThat(ann2).isEqualTo(ann);
-  }
-
-  @Test
-  public void testGetStarlarkCallableSubclass() throws Exception {
-    // Subclass's annotation is used.
-    Method method = MockClassC.class.getMethod("foo");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassC#foo");
-  }
-
-  @Test
-  public void testGetStarlarkCallableSubclassNoSubannotation() throws Exception {
-    // Falls back on superclass's annotation. Superclass takes precedence over interface.
-    Method method = MockClassC.class.getMethod("bar");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassA#bar");
-  }
-
-  @Test
-  public void testGetStarlarkCallableTwoargForm() throws Exception {
-    // Ensure that when passing superclass in directly, we bypass subclass's annotation.
-    Method method = MockClassC.class.getMethod("foo");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockClassA#foo");
-  }
-
-  @Test
-  public void testGetStarlarkCallableNotFound() throws Exception {
-    // Null result when no annotation present...
-    Method method = MockClassA.class.getMethod("baz");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNull();
-
-    // ... including when it's only present in a subclass that was bypassed...
-    method = MockClassC.class.getMethod("baz");
-    ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
-    assertThat(ann).isNull();
-
-    // ... or when the method itself is only in the subclass that was bypassed.
-    method = MockClassC.class.getMethod("qux");
-    ann = StarlarkInterfaceUtils.getStarlarkMethod(MockClassA.class, method);
-    assertThat(ann).isNull();
-  }
-
-  @Test
-  public void testGetStarlarkCallableInterface() throws Exception {
-    // Search through parent interfaces. First interface takes priority.
-    Method method = MockClassC.class.getMethod("baz");
-    StarlarkMethod ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockInterfaceB1#baz");
-
-    // Make sure both are still traversed.
-    method = MockClassC.class.getMethod("qux");
-    ann = StarlarkInterfaceUtils.getStarlarkMethod(method);
-    assertThat(ann).isNotNull();
-    assertThat(ann.doc()).isEqualTo("MockInterfaceB2#qux");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java
deleted file mode 100644
index 7ecf257..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkListTest.java
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import java.util.ArrayList;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for Sequence. */
-@RunWith(JUnit4.class)
-public final class StarlarkListTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  @Test
-  public void testIndex() throws Exception {
-    ev.exec("l = [1, '2', 3]");
-    assertThat(ev.eval("l[0]")).isEqualTo(1);
-    assertThat(ev.eval("l[1]")).isEqualTo("2");
-    assertThat(ev.eval("l[2]")).isEqualTo(3);
-
-    ev.exec("t = (1, '2', 3)");
-    assertThat(ev.eval("t[0]")).isEqualTo(1);
-    assertThat(ev.eval("t[1]")).isEqualTo("2");
-    assertThat(ev.eval("t[2]")).isEqualTo(3);
-  }
-
-  @Test
-  public void testIndexOutOfBounds() throws Exception {
-    ev.checkEvalError(
-        "index out of range (index is 3, but sequence has 3 elements)", "['a', 'b', 'c'][3]");
-    ev.checkEvalError(
-        "index out of range (index is 10, but sequence has 3 elements)", "['a', 'b', 'c'][10]");
-    ev.checkEvalError("index out of range (index is 0, but sequence has 0 elements)", "[][0]");
-  }
-
-  @Test
-  public void testNegativeIndices() throws Exception {
-    ev.exec("l = ['a', 'b', 'c']");
-    assertThat(ev.eval("l[0]")).isEqualTo("a");
-    assertThat(ev.eval("l[-1]")).isEqualTo("c");
-    assertThat(ev.eval("l[-2]")).isEqualTo("b");
-    assertThat(ev.eval("l[-3]")).isEqualTo("a");
-    ev.checkEvalError("index out of range (index is -4, but sequence has 3 elements)", "l[-4]");
-    ev.checkEvalError("index out of range (index is -1, but sequence has 0 elements)", "[][-1]");
-  }
-
-  @SuppressWarnings("unchecked")
-  private Sequence<Object> listEval(String... input) throws Exception {
-    return (Sequence<Object>) ev.eval(input);
-  }
-
-  @Test
-  public void testSlice() throws Exception {
-    ev.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();
-    assertThat(listEval("l[0:0]")).isEmpty();
-    assertThat(listEval("l[1:3]")).containsExactly("b", "c").inOrder();
-    assertThat(listEval("l[2:3]")).containsExactly("c").inOrder();
-    assertThat(listEval("l[3:3]")).isEmpty();
-    assertThat(listEval("l[2:1]")).isEmpty();
-    assertThat(listEval("l[3:0]")).isEmpty();
-
-    ev.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 {
-    ev.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();
-  }
-
-  @Test
-  public void testSliceNegative() throws Exception {
-    ev.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();
-    assertThat(listEval("l[-1:1]")).isEmpty();
-  }
-
-  @Test
-  public void testSliceBounds() throws Exception {
-    ev.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();
-    assertThat(listEval("l[-10:-9]")).isEmpty();
-  }
-
-  @Test
-  public void testSliceSkip() throws Exception {
-    ev.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();
-    assertThat(listEval("l[-6:10:2]")).containsExactly("b", "d", "f").inOrder();
-    assertThat(listEval("l[1:5:3]")).containsExactly("b", "e").inOrder();
-    assertThat(listEval("l[-10:3:2]")).containsExactly("a", "c").inOrder();
-    assertThat(listEval("l[-10:10:1]")).containsExactly(
-        "a", "b", "c", "d", "e", "f", "g").inOrder();
-  }
-
-  @Test
-  public void testSliceNegativeSkip() throws Exception {
-    ev.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();
-    assertThat(listEval("l[6::-4]")).containsExactly("g", "c").inOrder();
-    assertThat(listEval("l[7::-4]")).containsExactly("g", "c").inOrder();
-    assertThat(listEval("l[-1::-4]")).containsExactly("g", "c").inOrder();
-    assertThat(listEval("l[-1:-10:-4]")).containsExactly("g", "c").inOrder();
-    assertThat(listEval("l[-1:-3:-4]")).containsExactly("g").inOrder();
-    assertThat(listEval("l[2:5:-1]")).isEmpty();
-    assertThat(listEval("l[-10:5:-1]")).isEmpty();
-    assertThat(listEval("l[1:-8:-1]")).containsExactly("b", "a").inOrder();
-
-    ev.checkEvalError("slice step cannot be zero", "l[2:5:0]");
-  }
-
-  @Test
-  public void testListSize() throws Exception {
-    assertThat(ev.eval("len([42, 'hello, world', []])")).isEqualTo(3);
-  }
-
-  @Test
-  public void testListEmpty() throws Exception {
-    assertThat(ev.eval("8 if [1, 2, 3] else 9")).isEqualTo(8);
-    assertThat(ev.eval("8 if [] else 9")).isEqualTo(9);
-  }
-
-  @Test
-  public void testListConcat() throws Exception {
-    assertThat(ev.eval("[1, 2] + [3, 4]"))
-        .isEqualTo(StarlarkList.of(/*mutability=*/ null, 1, 2, 3, 4));
-  }
-
-  @Test
-  public void testConcatListIndex() throws Exception {
-    ev.exec(
-        "l = [1, 2] + [3, 4]", //
-        "e0 = l[0]",
-        "e1 = l[1]",
-        "e2 = l[2]",
-        "e3 = l[3]");
-    assertThat(ev.lookup("e0")).isEqualTo(1);
-    assertThat(ev.lookup("e1")).isEqualTo(2);
-    assertThat(ev.lookup("e2")).isEqualTo(3);
-    assertThat(ev.lookup("e3")).isEqualTo(4);
-  }
-
-  @Test
-  public void testConcatListHierarchicalIndex() throws Exception {
-    ev.exec(
-        "l = [1] + (([2] + [3, 4]) + [5])", //
-        "e0 = l[0]",
-        "e1 = l[1]",
-        "e2 = l[2]",
-        "e3 = l[3]",
-        "e4 = l[4]");
-    assertThat(ev.lookup("e0")).isEqualTo(1);
-    assertThat(ev.lookup("e1")).isEqualTo(2);
-    assertThat(ev.lookup("e2")).isEqualTo(3);
-    assertThat(ev.lookup("e3")).isEqualTo(4);
-    assertThat(ev.lookup("e4")).isEqualTo(5);
-  }
-
-  @Test
-  public void testConcatListSize() throws Exception {
-    assertThat(ev.eval("len([1, 2] + [3, 4])")).isEqualTo(4);
-  }
-
-  @Test
-  public void testAppend() throws Exception {
-    ev.exec("l = [1, 2]");
-    assertThat(Starlark.NONE).isEqualTo(ev.eval("l.append([3, 4])"));
-    assertThat(ev.eval("[1, 2, [3, 4]]")).isEqualTo(ev.lookup("l"));
-  }
-
-  @Test
-  public void testExtend() throws Exception {
-    ev.exec("l = [1, 2]");
-    assertThat(Starlark.NONE).isEqualTo(ev.eval("l.extend([3, 4])"));
-    assertThat(ev.eval("[1, 2, 3, 4]")).isEqualTo(ev.lookup("l"));
-  }
-
-  @Test
-  public void listAfterRemoveHasExpectedEqualsAndHashCode() throws Exception {
-    ev.exec("l = [1, 2, 3]");
-    ev.exec("l.remove(3)");
-    assertThat(ev.lookup("l")).isEqualTo(ev.eval("[1, 2]"));
-    assertThat(ev.lookup("l").hashCode()).isEqualTo(ev.eval("[1, 2]").hashCode());
-  }
-
-  @Test
-  public void testConcatListToString() throws Exception {
-    assertThat(ev.eval("str([1, 2] + [3, 4])")).isEqualTo("[1, 2, 3, 4]");
-  }
-
-  @Test
-  public void testConcatListNotEmpty() throws Exception {
-    ev.exec("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
-    assertThat(ev.lookup("v")).isEqualTo(1);
-  }
-
-  @Test
-  public void testConcatListEmpty() throws Exception {
-    ev.exec("l = [] + []", "v = 1 if l else 0");
-    assertThat(ev.lookup("v")).isEqualTo(0);
-  }
-
-  @Test
-  public void testListComparison() throws Exception {
-    assertThat(ev.eval("(1, 'two', [3, 4]) == (1, 'two', [3, 4])")).isEqualTo(true);
-    assertThat(ev.eval("[1, 2, 3, 4] == [1, 2] + [3, 4]")).isEqualTo(true);
-    assertThat(ev.eval("[1, 2, 3, 4] == (1, 2, 3, 4)")).isEqualTo(false);
-    assertThat(ev.eval("[1, 2] == [1, 2, 3]")).isEqualTo(false);
-    assertThat(ev.eval("[] == []")).isEqualTo(true);
-    assertThat(ev.eval("() == ()")).isEqualTo(true);
-    assertThat(ev.eval("() == (1,)")).isEqualTo(false);
-    assertThat(ev.eval("(1) == (1,)")).isEqualTo(false);
-  }
-
-  @Test
-  public void testListAddWithIndex() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    StarlarkList<String> list = StarlarkList.newList(mutability);
-    Location loc = null;
-    list.add("a", loc);
-    list.add("b", loc);
-    list.add("c", loc);
-    list.add(0, "d", loc);
-    assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"b\", \"c\"]");
-    list.add(2, "e", loc);
-    assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"c\"]");
-    list.add(4, "f", loc);
-    assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"f\", \"c\"]");
-    list.add(6, "g", loc);
-    assertThat(list.toString()).isEqualTo("[\"d\", \"a\", \"e\", \"b\", \"f\", \"c\", \"g\"]");
-    assertThrows(ArrayIndexOutOfBoundsException.class, () -> list.add(8, "h", loc));
-  }
-
-  @Test
-  public void testMutatorsCheckMutability() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
-    mutability.freeze();
-
-    // The casts force selection of the Starlark add/remove methods,
-    // not the disabled ones like List.add(int, Object).
-    // We could enable the List method, but then it would have to
-    // report failures using unchecked exceptions.
-    EvalException e =
-        assertThrows(EvalException.class, () -> list.add((Object) 4, (Location) null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-    e = assertThrows(EvalException.class, () -> list.add(0, (Object) 4, (Location) null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-    e =
-        assertThrows(
-            EvalException.class, () -> list.addAll(ImmutableList.of(4, 5, 6), (Location) null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-    e = assertThrows(EvalException.class, () -> list.remove(0, (Location) null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-    e = assertThrows(EvalException.class, () -> list.set(0, 10, (Location) null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-  }
-
-  @Test
-  public void testCannotMutateAfterShallowFreeze() throws Exception {
-    Mutability mutability = Mutability.createAllowingShallowFreeze("test");
-    StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
-    list.unsafeShallowFreeze();
-
-    EvalException e = assertThrows(EvalException.class, () -> list.add((Object) 4, null));
-    assertThat(e).hasMessageThat().isEqualTo("trying to mutate a frozen list value");
-  }
-
-  @Test
-  public void testCopyOfTakesCopy() throws EvalException {
-    ArrayList<String> copyFrom = Lists.newArrayList("hi");
-    Mutability mutability = Mutability.create("test");
-    StarlarkList<String> mutableList = StarlarkList.copyOf(mutability, copyFrom);
-    copyFrom.add("added1");
-    mutableList.add("added2", (Location) null);
-
-    assertThat(copyFrom).containsExactly("hi", "added1").inOrder();
-    assertThat(mutableList).containsExactly("hi", "added2").inOrder();
-  }
-
-  @Test
-  public void testWrapTakesOwnershipOfArray() throws EvalException {
-    String[] wrapped = {"hello"};
-    Mutability mutability = Mutability.create("test");
-    StarlarkList<String> mutableList = StarlarkList.wrap(mutability, wrapped);
-
-    // Big no-no, but we're proving a point.
-    wrapped[0] = "goodbye";
-    assertThat(mutableList).containsExactly("goodbye");
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java
deleted file mode 100644
index 2bbc336..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkMutableTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link StarlarkMutable}. */
-@RunWith(JUnit4.class)
-public final class StarlarkMutableTest {
-
-  @Test
-  public void testListViewsCheckMutability() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
-    mutability.freeze();
-
-    {
-      Iterator<?> it = list.iterator();
-      it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> it.remove());
-    }
-    {
-      Iterator<?> it = list.listIterator();
-      it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> it.remove());
-    }
-    {
-      Iterator<?> it = list.listIterator(1);
-      it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> it.remove());
-    }
-    {
-      List<Object> sublist = list.subList(1, 2);
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> sublist.set(0, 4));
-    }
-  }
-
-  @Test
-  public void testDictViewsCheckMutability() throws Exception {
-    Mutability mutability = Mutability.create("test");
-    Dict<Object, Object> dict = Dict.copyOf(mutability, ImmutableMap.of(1, 2, 3, 4));
-    mutability.freeze();
-
-    {
-      Iterator<Map.Entry<Object, Object>> it = dict.entrySet().iterator();
-      Map.Entry<Object, Object> entry = it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> entry.setValue(5));
-    }
-    {
-      Iterator<Object> it = dict.keySet().iterator();
-      it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> it.remove());
-    }
-    {
-      Iterator<Object> it = dict.values().iterator();
-      it.next();
-      assertThrows(
-          UnsupportedOperationException.class,
-          () -> it.remove());
-    }
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
deleted file mode 100644
index b52b482..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2018 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.syntax.Debug.ReadyToPause;
-import com.google.devtools.build.lib.syntax.Debug.Stepping;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of debugging features of StarlarkThread. */
-@RunWith(JUnit4.class)
-public class StarlarkThreadDebuggingTest {
-
-  // TODO(adonovan): rewrite these tests at a higher level.
-
-  private static StarlarkThread newThread() {
-    return new StarlarkThread(Mutability.create("test"), StarlarkSemantics.DEFAULT);
-  }
-
-  // Executes the definition of a trivial function f and returns the function value.
-  private static StarlarkFunction defineFunc() throws Exception {
-    return (StarlarkFunction)
-        Starlark.execFile(
-            ParserInput.fromLines("def f(): pass\nf"),
-            FileOptions.DEFAULT,
-            Module.create(),
-            newThread());
-  }
-
-  @Test
-  public void testListFramesEmptyStack() throws Exception {
-    StarlarkThread thread = newThread();
-    assertThat(Debug.getCallStack(thread)).isEmpty();
-    assertThat(thread.getCallStack()).isEmpty();
-  }
-
-  @Test
-  public void testListFramesFromBuiltin() throws Exception {
-    // f is a built-in that captures the stack using the Debugger API.
-    Object[] result = {null, null};
-    StarlarkCallable f =
-        new StarlarkCallable() {
-          @Override
-          public String getName() {
-            return "f";
-          }
-
-          @Override
-          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
-            result[0] = Debug.getCallStack(thread);
-            result[1] = thread.getCallStack();
-            return Starlark.NONE;
-          }
-
-          @Override
-          public Location getLocation() {
-            return Location.fromFileLineColumn("builtin", 12, 0);
-          }
-
-          @Override
-          public String toString() {
-            return "<debug function>";
-          }
-        };
-
-    // Set up global environment.
-    Module module =
-        Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("a", 1, "b", 2, "f", f));
-
-    // Execute a small file that calls f.
-    ParserInput input =
-        ParserInput.fromString(
-            "def g(a, y, z):\n" // shadows global a
-                + "  f()\n"
-                + "g(4, 5, 6)",
-            "main.star");
-    Starlark.execFile(input, FileOptions.DEFAULT, module, newThread());
-
-    @SuppressWarnings("unchecked")
-    ImmutableList<Debug.Frame> stack = (ImmutableList<Debug.Frame>) result[0];
-
-    // Check the stack captured by f.
-    // We compare printed string forms, as it gives more informative assertion failures.
-    StringBuilder buf = new StringBuilder();
-    for (Debug.Frame fr : stack) {
-      buf.append(
-          String.format(
-              "%s @ %s local=%s\n", fr.getFunction().getName(), fr.getLocation(), fr.getLocals()));
-    }
-    assertThat(buf.toString())
-        .isEqualTo(
-            ""
-                // location is paren of g(4, 5, 6) call:
-                + "<toplevel> @ main.star:3:2 local={}\n"
-                // location is paren of "f()" call:
-                + "g @ main.star:2:4 local={a=4, y=5, z=6}\n"
-                // location is "current PC" in f.
-                + "f @ builtin:12 local={}\n");
-
-    // Same, with "lite" stack API.
-    assertThat(result[1].toString()) // an ImmutableList<StarlarkThread.CallStackEntry>
-        .isEqualTo("[<toplevel>@main.star:3:2, g@main.star:2:4, f@builtin:12]");
-
-    // TODO(adonovan): more tests:
-    // - a stack containing functions defined in different modules.
-    // - changing environment at various program points within a function.
-  }
-
-  @Test
-  public void testStepIntoFunction() throws Exception {
-    StarlarkThread thread = newThread();
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
-    thread.push(defineFunc());
-
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepIntoFallsBackToStepOver() {
-    // test that when stepping into, we'll fall back to stopping at the next statement in the
-    // current frame
-    StarlarkThread thread = newThread();
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
-
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepIntoFallsBackToStepOut() throws Exception {
-    // test that when stepping into, we'll fall back to stopping when exiting the current frame
-    StarlarkThread thread = newThread();
-    thread.push(defineFunc());
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.INTO);
-    thread.pop();
-
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepOverFunction() throws Exception {
-    StarlarkThread thread = newThread();
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.OVER);
-    thread.push(defineFunc());
-
-    assertThat(predicate.test(thread)).isFalse();
-    thread.pop();
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepOverFallsBackToStepOut() throws Exception {
-    // test that when stepping over, we'll fall back to stopping when exiting the current frame
-    StarlarkThread thread = newThread();
-    thread.push(defineFunc());
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.OVER);
-    thread.pop();
-
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepOutOfInnerFrame() throws Exception {
-    StarlarkThread thread = newThread();
-    thread.push(defineFunc());
-
-    ReadyToPause predicate = Debug.stepControl(thread, Stepping.OUT);
-
-    assertThat(predicate.test(thread)).isFalse();
-    thread.pop();
-    assertThat(predicate.test(thread)).isTrue();
-  }
-
-  @Test
-  public void testStepOutOfOutermostFrame() {
-    StarlarkThread thread = newThread();
-
-    assertThat(Debug.stepControl(thread, Stepping.OUT)).isNull();
-  }
-
-  @Test
-  public void testStepControlWithNoSteppingReturnsNull() {
-    StarlarkThread thread = newThread();
-
-    assertThat(Debug.stepControl(thread, Stepping.NONE)).isNull();
-  }
-
-  @Test
-  public void testEvaluateVariableInScope() throws Exception {
-    Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("a", 1));
-
-    StarlarkThread thread = newThread();
-    Object a = Starlark.execFile(ParserInput.fromLines("a"), FileOptions.DEFAULT, module, thread);
-    assertThat(a).isEqualTo(1);
-  }
-
-  @Test
-  public void testEvaluateVariableNotInScopeFails() throws Exception {
-    Module module = Module.create();
-
-    SyntaxError.Exception e =
-        assertThrows(
-            SyntaxError.Exception.class,
-            () ->
-                Starlark.execFile(
-                    ParserInput.fromLines("b"), FileOptions.DEFAULT, module, newThread()));
-
-    assertThat(e).hasMessageThat().isEqualTo("name 'b' is not defined");
-  }
-
-  @Test
-  public void testEvaluateExpressionOnVariableInScope() throws Exception {
-    StarlarkThread thread = newThread();
-    Module module =
-        Module.withPredeclared(
-            StarlarkSemantics.DEFAULT, /*predeclared=*/ ImmutableMap.of("a", "string"));
-
-    assertThat(
-            Starlark.execFile(
-                ParserInput.fromLines("a.startswith('str')"), FileOptions.DEFAULT, module, thread))
-        .isEqualTo(true);
-    Starlark.execFile(ParserInput.fromLines("a = 1"), FileOptions.DEFAULT, module, thread);
-    assertThat(Starlark.execFile(ParserInput.fromLines("a"), FileOptions.DEFAULT, module, thread))
-        .isEqualTo(1);
-  }
-}
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
deleted file mode 100644
index 946098a..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2006 The Bazel Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.syntax;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests of StarlarkThread. */
-@RunWith(JUnit4.class)
-public final class StarlarkThreadTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  // Test the API directly
-  @Test
-  public void testLookupAndUpdate() throws Exception {
-    assertThat(ev.lookup("foo")).isNull();
-    ev.update("foo", "bar");
-    assertThat(ev.lookup("foo")).isEqualTo("bar");
-  }
-
-  @Test
-  public void testDoubleUpdateSucceeds() throws Exception {
-    assertThat(ev.lookup("VERSION")).isNull();
-    ev.update("VERSION", 42);
-    assertThat(ev.lookup("VERSION")).isEqualTo(42);
-    ev.update("VERSION", 43);
-    assertThat(ev.lookup("VERSION")).isEqualTo(43);
-  }
-
-  // Test assign through interpreter, ev.lookup through API:
-  @Test
-  public void testAssign() throws Exception {
-    assertThat(ev.lookup("foo")).isNull();
-    ev.exec("foo = 'bar'");
-    assertThat(ev.lookup("foo")).isEqualTo("bar");
-  }
-
-  // Test update through API, reference through interpreter:
-  @Test
-  public void testReference() throws Exception {
-    SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> ev.eval("foo"));
-    assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
-    ev.update("foo", "bar");
-    assertThat(ev.eval("foo")).isEqualTo("bar");
-  }
-
-  // Test assign and reference through interpreter:
-  @Test
-  public void testAssignAndReference() throws Exception {
-    SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> ev.eval("foo"));
-    assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
-    ev.exec("foo = 'bar'");
-    assertThat(ev.eval("foo")).isEqualTo("bar");
-  }
-
-  @Test
-  public void testBindToNullThrowsException() throws Exception {
-    NullPointerException e =
-        assertThrows(NullPointerException.class, () -> ev.update("some_name", null));
-    assertThat(e).hasMessageThat().isEqualTo("Module.setGlobal(some_name, null)");
-  }
-
-  @Test
-  public void testBuiltinsCanBeShadowed() throws Exception {
-    Module module = Module.create();
-    try (Mutability mu = Mutability.create("test")) {
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-      Starlark.execFile(ParserInput.fromLines("True = 123"), FileOptions.DEFAULT, module, thread);
-    }
-    assertThat(module.getGlobal("True")).isEqualTo(123);
-  }
-
-  @Test
-  public void testVariableIsReferencedBeforeAssignment() throws Exception {
-    ev.new Scenario()
-        .testIfErrorContains(
-            "local variable 'y' is referenced before assignment",
-            "y = 1", // bind => y is global
-            "def foo(x):",
-            "  x += y", // fwd ref to local y
-            "  y = 2", // binding => y is local
-            "  return x",
-            "foo(1)");
-    ev.new Scenario()
-        .testIfErrorContains(
-            "global variable 'len' is referenced before assignment",
-            "print(len)", // fwd ref to global len
-            "len = 1"); // binding => len is local
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java
deleted file mode 100644
index 62e1a86..0000000
--- a/src/test/java/com/google/devtools/build/lib/syntax/StringModuleTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2020 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.syntax;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for StringModule. */
-// TODO(bazel-team): Migrate these test cases back to string_misc.sky, once either
-// 1) --incompatible_string_replace_count has been flipped (#11244) and deleted, or 2) the
-// standalone Starlark interpreter and tests gain the ability to run with semantics flags.
-@RunWith(JUnit4.class)
-public class StringModuleTest {
-
-  private final EvaluationTestCase ev = new EvaluationTestCase();
-
-  private void runReplaceTest(StarlarkSemantics semantics) throws Exception {
-    ev.new Scenario(semantics)
-        .testEval("'banana'.replace('a', 'o')", "'bonono'")
-        .testEval("'banana'.replace('a', 'o', 2)", "'bonona'")
-        .testEval("'banana'.replace('a', 'o', 0)", "'banana'")
-        .testEval("'banana'.replace('a', 'e')", "'benene'")
-        .testEval("'banana'.replace('a', '$()')", "'b$()n$()n$()'")
-        .testEval("'banana'.replace('a', '$')", "'b$n$n$'")
-        .testEval("'b$()n$()n$()'.replace('$()', '$($())')", "'b$($())n$($())n$($())'")
-        .testEval("'banana'.replace('a', 'e', 2)", "'benena'")
-        .testEval("'banana'.replace('a', 'e', 0)", "'banana'")
-        .testEval("'banana'.replace('', '-')", "'-b-a-n-a-n-a-'")
-        .testEval("'banana'.replace('', '-', 2)", "'-b-anana'")
-        .testEval("'banana'.replace('', '-', 0)", "'banana'")
-        .testEval("'banana'.replace('', '')", "'banana'")
-        .testEval("'banana'.replace('a', '')", "'bnn'")
-        .testEval("'banana'.replace('a', '', 2)", "'bnna'");
-  }
-
-  @Test
-  public void testReplaceWithAndWithoutFlag() throws Exception {
-    runReplaceTest(replaceCount(false));
-    runReplaceTest(replaceCount(true));
-  }
-
-  @Test
-  public void testReplaceIncompatibleFlag() throws Exception {
-    // Test the scenario that changes with the incompatible flag
-    ev.new Scenario(replaceCount(false))
-        .testEval("'banana'.replace('a', 'o', -2)", "'banana'")
-        .testEval("'banana'.replace('a', 'e', -1)", "'banana'")
-        .testEval("'banana'.replace('a', 'e', -10)", "'banana'")
-        .testEval("'banana'.replace('', '-', -2)", "'banana'");
-
-    ev.new Scenario(replaceCount(true))
-        .testEval("'banana'.replace('a', 'o', -2)", "'bonono'")
-        .testEval("'banana'.replace('a', 'e', -1)", "'benene'")
-        .testEval("'banana'.replace('a', 'e', -10)", "'benene'")
-        .testEval("'banana'.replace('', '-', -2)", "'-b-a-n-a-n-a-'");
-  }
-
-  @Test
-  public void testReplaceNoneCount() throws Exception {
-    // Passing None as the max number of replacements is disallowed with the incompatible flag.
-    ev.new Scenario(replaceCount(false)).testEval("'banana'.replace('a', 'e', None)", "'benene'");
-    ev.new Scenario(replaceCount(true))
-        .testIfErrorContains("Cannot pass a None count", "'banana'.replace('a', 'e', None)");
-  }
-
-  // Returns semantics for --incompatible_string_replace_count=x.
-  private static final StarlarkSemantics replaceCount(boolean x) {
-    return StarlarkSemantics.builder()
-        .setBool(StarlarkSemantics.INCOMPATIBLE_STRING_REPLACE_COUNT, x)
-        .build();
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD b/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
index 6d594b8..f6828ba 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/BUILD
@@ -13,10 +13,11 @@
     testonly = 1,
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//third_party:guava",
         "//third_party:junit4",
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 f8247fc..dc4e466 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
@@ -23,20 +23,20 @@
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Expression;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsParsingException;
 import java.util.LinkedList;
 import java.util.List;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Expression;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.SyntaxError;
 
 /** Helper class for tests that evaluate Starlark code. */
 // TODO(adonovan): stop extending this class. Prefer composition over inheritance.
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BUILD b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
index 8119e5e..0395805 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
@@ -56,7 +56,6 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/lib/util:os",
@@ -65,6 +64,7 @@
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
         "//third_party:junit4",
@@ -77,7 +77,6 @@
     testonly = 0,
     srcs = ["BazelPackageLoadingListenerForTesting.java"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -85,6 +84,8 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/packages:BazelPackageLoader",
         "//src/main/java/com/google/devtools/build/lib/skyframe/packages:PackageLoader",
         "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
index 29d264b..bd45785 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageLoadingListenerForTesting.java
@@ -26,8 +26,8 @@
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.skyframe.packages.BazelPackageLoader;
 import com.google.devtools.build.lib.skyframe.packages.PackageLoader;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.Root;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * A {@link PackageLoadingListener} for use in tests that a sanity check with {@link
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
index 2ee3f28..7309e94 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
@@ -39,10 +39,10 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.Type;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import java.lang.reflect.Method;
 import java.util.Map;
+import net.starlark.java.syntax.Location;
 
 /**
  * Helper class to provide a RuleClassProvider for tests.
diff --git a/src/test/java/com/google/devtools/build/skydoc/BUILD b/src/test/java/com/google/devtools/build/skydoc/BUILD
index 9096d02..71ad25a 100644
--- a/src/test/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/test/java/com/google/devtools/build/skydoc/BUILD
@@ -21,13 +21,14 @@
     srcs = ["SkydocTest.java"],
     visibility = ["//devtools/blaze/main:__pkg__"],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skydoc:skydoc_lib",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
         "//src/main/java/com/google/devtools/build/skydoc/rendering",
         "//src/main/java/com/google/devtools/build/skydoc/rendering/proto:stardoc_output_java_proto",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
         "//third_party:guava",
         "//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
index b5724c1..c55444b 100644
--- a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
+++ b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
@@ -22,9 +22,6 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; // a bad dependency!
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skydoc.SkydocMain.StarlarkEvaluationException;
@@ -40,6 +37,9 @@
 import java.io.IOException;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.ParserInput;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;