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;
