diff --git a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
index 258f301..0a792b4 100644
--- a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
+++ b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
@@ -24,11 +24,6 @@
 import com.google.devtools.build.docgen.starlark.StarlarkConstructorMethodDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkMethodDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkParamDoc;
-import com.google.devtools.build.lib.syntax.BuiltinCallable;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.OptionsParser;
 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
@@ -43,6 +38,11 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.BuiltinCallable;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /** The main class for the Starlark documentation generator. */
 public class ApiExporter {
diff --git a/src/main/java/com/google/devtools/build/docgen/BUILD b/src/main/java/com/google/devtools/build/docgen/BUILD
index 819a692..7ec1735d 100644
--- a/src/main/java/com/google/devtools/build/docgen/BUILD
+++ b/src/main/java/com/google/devtools/build/docgen/BUILD
@@ -11,7 +11,6 @@
     srcs = glob(["**/*.java"]),
     resources = [":template_files"],
     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/cmdline",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
@@ -46,6 +45,8 @@
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test",
         "//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:builtin_java_proto",
         "//third_party:apache_velocity",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
index e81710b..8d71958 100644
--- a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
+++ b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
@@ -19,9 +19,6 @@
 import com.google.devtools.build.docgen.starlark.StarlarkBuiltinDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkConstructorMethodDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkJavaMethodDoc;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.util.Classpath;
 import com.google.devtools.build.lib.util.Classpath.ClassPathException;
 import java.lang.reflect.Method;
@@ -33,6 +30,9 @@
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A helper class that collects Starlark module documentation. */
 final class StarlarkDocumentationCollector {
@@ -70,11 +70,11 @@
    * a map from the name of each Starlark module to its documentation.
    */
   static ImmutableMap<String, StarlarkBuiltinDoc> collectModules(Iterable<Class<?>> classes) {
-    // Force class loading of com.google.devtools.build.lib.syntax.Starlark before we do any of our
-    // own processing. Otherwise, we're in trouble since com.google.devtools.build.lib.syntax.Dict
+    // Force class loading of net.starlark.java.eval.Starlark before we do any of our
+    // own processing. Otherwise, we're in trouble since net.starlark.java.eval.Dict
     // happens to be the first class on our classpath that we proccess via #collectModuleMethods,
     // but that entails a logical cycle in
-    // com.google.devtools.build.lib.syntax.CallUtils#getCacheValue.
+    // net.starlark.java.eval.CallUtils#getCacheValue.
     // TODO(b/161479826): Address this in a less hacky manner.
     @SuppressWarnings("unused")
     Object forceClassLoading = Starlark.UNIVERSE;
diff --git a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
index ad89034..101c040 100644
--- a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
+++ b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.stubs.ProviderStub;
 import com.google.devtools.build.lib.starlarkbuildapi.stubs.StarlarkAspectStub;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestingBootstrap;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.Classpath.ClassPathException;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeActionsInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeBuildApiGlobals;
@@ -96,6 +95,7 @@
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A helper class that collects Starlark Api symbols including top level modules, native rules and
diff --git a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkConstructorMethodDoc.java b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkConstructorMethodDoc.java
index 710fa46..8b87abd 100644
--- a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkConstructorMethodDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkConstructorMethodDoc.java
@@ -14,11 +14,11 @@
 package com.google.devtools.build.docgen.starlark;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.lang.reflect.Method;
 import java.util.List;
 import net.starlark.java.annot.StarlarkDeprecated;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A class representing a Java method callable from Starlark which constructs a type of Starlark
diff --git a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkDoc.java b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkDoc.java
index 78c1693..c7df5d4 100644
--- a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkDoc.java
@@ -15,11 +15,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-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.syntax.Tuple;
 import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Map;
@@ -27,6 +22,11 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
 import net.starlark.java.annot.StarlarkMethod;
+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 net.starlark.java.eval.Tuple;
 
 /** Abstract class for containing documentation for a Starlark syntactic entity. */
 abstract class StarlarkDoc {
diff --git a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java
index 3653b04..8582e70 100644
--- a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkJavaMethodDoc.java
@@ -15,7 +15,6 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
@@ -23,6 +22,7 @@
 import net.starlark.java.annot.StarlarkDeprecated;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Starlark;
 
 /** A class representing a Java method callable from Starlark with annotation. */
 public final class StarlarkJavaMethodDoc extends StarlarkMethodDoc {
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 5d60ab5..31fac29 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -141,11 +141,11 @@
     visibility = ["//visibility:public"],
     exports = [
         "//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/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/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
 
@@ -154,8 +154,8 @@
     srcs = [],
     visibility = ["//visibility:public"],
     exports = [
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
 
@@ -379,8 +379,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/skyframe:target_pattern_phase_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:top_down_action_cache",
-        "//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/unix",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:TestType",
@@ -406,6 +404,8 @@
         "//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/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:action_cache_java_proto",
         "//src/main/protobuf:analysis_java_proto",
         "//src/main/protobuf:command_line_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index f03fd1b..3ceccee 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -34,10 +34,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.ActionApi;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.Dict;
-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.vfs.BulkDeleter;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.Root;
@@ -47,6 +43,10 @@
 import java.util.Map;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
 
 /**
  * Abstract implementation of Action which implements basic functionality: the inputs, outputs, and
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
index 73e9d68..8fb293e 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
@@ -22,9 +22,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
+import net.starlark.java.syntax.Location;
 
 /**
  * This exception gets thrown if {@link Action#execute(ActionExecutionContext)} is unsuccessful.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
index bf4d4bd..1c1a159 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
@@ -24,8 +24,8 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant;
-import com.google.devtools.build.lib.syntax.Location;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * Contains metadata used for reporting the progress and status of an action.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index 1f480f7..70deb02 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -40,9 +40,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.vfs.Path;
@@ -59,6 +56,9 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
 
 /**
  * An Artifact represents a file used by the build system, whether it's a source file or a derived
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
index e8ef677..7eb5893 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
@@ -21,12 +21,12 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.FileRootApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import java.io.Serializable;
 import java.util.Objects;
+import net.starlark.java.eval.Printer;
 
 /**
  * A root for an artifact. The roots are the directories containing artifacts, and they are mapped
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BUILD b/src/main/java/com/google/devtools/build/lib/actions/BUILD
index 2887382..6ec3d88 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/actions/BUILD
@@ -64,7 +64,6 @@
         ":fileset_output_symlink",
         ":localhost_capacity",
         ":middleman_type",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/bugreport",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream",
@@ -106,6 +105,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/main/protobuf:action_cache_java_proto",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
@@ -175,12 +176,12 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//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/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
         "//third_party/protobuf:protobuf_java",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/FilesetTraversalParams.java b/src/main/java/com/google/devtools/build/lib/actions/FilesetTraversalParams.java
index 7cb17de..b837eb6 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/FilesetTraversalParams.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/FilesetTraversalParams.java
@@ -24,7 +24,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
@@ -32,6 +31,7 @@
 import java.io.IOException;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * Parameters of a filesystem traversal requested by a Fileset rule.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MissingInputFileException.java b/src/main/java/com/google/devtools/build/lib/actions/MissingInputFileException.java
index 78ed120..a06c22c 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MissingInputFileException.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MissingInputFileException.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.lib.actions;
 
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.DetailedExitCode;
+import net.starlark.java.syntax.Location;
 
 /**
  * This exception is thrown during a build when an input file is missing, but the file is not the
diff --git a/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java b/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
index 2e854fa..2835236 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
@@ -18,10 +18,10 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Convenience wrapper around runfiles allowing lazy expansion. */
 // TODO(bazel-team): Ideally we could refer to Runfiles objects directly here, but current package
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
index 068f160..242d354 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ActionsProvider.java
@@ -20,10 +20,10 @@
 import com.google.devtools.build.lib.packages.StarlarkInfo;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.starlarkbuildapi.ActionsInfoProviderApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.HashMap;
 import java.util.Map;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
 
 /**
  * This provides a view over the actions that were created during the analysis of a rule
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 69cf115..28051d4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -26,10 +26,10 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.skyframe.SkyFunction;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * The set of services that are provided to {@link ConfiguredTarget} objects during initialization.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectValue.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectValue.java
index 9da5f0a..58a84d0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectValue.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectValue.java
@@ -20,8 +20,8 @@
 import com.google.devtools.build.lib.packages.Aspect;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.skyframe.AspectValueKey.AspectKey;
-import com.google.devtools.build.lib.syntax.Location;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /** An aspect in the context of the Skyframe graph. */
 public final class AspectValue extends BasicActionLookupValue implements ConfiguredObjectValue {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index bae61ac..92564fd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -422,8 +422,6 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
@@ -437,6 +435,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/main/protobuf:failure_details_java_proto",
         "//src/main/protobuf:test_status_java_proto",
@@ -455,8 +455,8 @@
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
@@ -694,7 +694,7 @@
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -779,7 +779,7 @@
     deps = [
         ":aspect_collection",
         "//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",
     ],
 )
 
@@ -790,7 +790,7 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:auto_value",
     ],
 )
@@ -982,7 +982,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:toolchain_exception",
         "//src/main/java/com/google/devtools/build/lib/skyframe:unloaded_toolchain_context",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -1044,8 +1044,8 @@
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
@@ -1091,7 +1091,7 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
@@ -1336,8 +1336,8 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -1435,9 +1435,9 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//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:string",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -1643,7 +1643,7 @@
         ":config/build_options",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:jsr305",
     ],
 )
@@ -1740,8 +1740,8 @@
         "//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/starlarkbuildapi/config",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
@@ -2015,8 +2015,8 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -2029,7 +2029,7 @@
         ":starlark/starlark_late_bound_default",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
@@ -2044,10 +2044,10 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//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:evaluator",
-        "//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/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
@@ -2068,7 +2068,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/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
@@ -2085,10 +2085,10 @@
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -2100,7 +2100,7 @@
     deps = [
         ":analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
@@ -2113,8 +2113,8 @@
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -2127,7 +2127,7 @@
         ":config/execution_transition_factory",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
@@ -2139,7 +2139,7 @@
         "//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/starlarkbuildapi/test",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index 9927546..1ba4623 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.WorkspaceStatusValue;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
@@ -52,6 +51,7 @@
 import java.util.Set;
 import java.util.TreeMap;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * The implementation of AnalysisEnvironment used for analysis. It tracks metadata for each
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
index 49e5df9..cc1088f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
@@ -26,8 +26,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -36,6 +34,8 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /**
  * Provides shared functionality for parameterized command-line launching.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
index 465d8e0..3b19eb8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
@@ -23,11 +23,11 @@
 import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
 import com.google.devtools.build.lib.analysis.stringtemplate.TemplateContext;
 import com.google.devtools.build.lib.packages.Package;
-import com.google.devtools.build.lib.syntax.Dict;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
 
 /**
  * Implements make variable expansion for make variables that depend on the configuration and the
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index 39dae34..8850f0c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -32,13 +32,13 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.TreeMap;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Extra information about a configured target computed on request of a dependent.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index d24204f..923fe95 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -53,7 +53,6 @@
 import com.google.devtools.build.lib.packages.RuleClass.Builder.ThirdPartyLicenseExistencePolicy;
 import com.google.devtools.build.lib.packages.SymbolGenerator;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDefinition;
 import com.google.devtools.common.options.OptionsProvider;
@@ -71,6 +70,7 @@
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Knows about every rule Blaze supports and the associated configuration options.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
index 80c913c..4d66778 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.actions.Artifact.SourceArtifact;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
-import com.google.devtools.build.lib.syntax.ClassObject;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.ClassObject;
 
 /**
  * A {@link ConfiguredTarget} is conceptually a {@link TransitiveInfoCollection} coupled with the
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
index 76b3e25..a09a4e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
@@ -19,11 +19,11 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.DefaultInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** DefaultInfo is provided by all targets implicitly and contains all standard fields. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index edab353..7547dc4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -56,8 +56,6 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.skyframe.ToolchainContextKey;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -65,6 +63,8 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Resolver for dependencies between configured targets.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java b/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
index f138abc..ebe3cc2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/EventHandlingErrorReporter.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * Base class for implementations of {@link
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExecGroupCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ExecGroupCollection.java
index f257cdd..6059857 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ExecGroupCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ExecGroupCollection.java
@@ -19,14 +19,14 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ExecGroupCollectionApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Identifier;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.List;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.Identifier;
 
 /**
  * A {@link StarlarkIndexable} collection of resolved toolchain contexts that can be exposed to
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/InconsistentAspectOrderException.java b/src/main/java/com/google/devtools/build/lib/analysis/InconsistentAspectOrderException.java
index 87b6503..f211a08 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/InconsistentAspectOrderException.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/InconsistentAspectOrderException.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.analysis.AspectCollection.AspectCycleOnPathException;
 import com.google.devtools.build.lib.packages.Target;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * Signals an inconsistency on an aspect path: an aspect occurs twice on the path and the second
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LabelAndLocation.java b/src/main/java/com/google/devtools/build/lib/analysis/LabelAndLocation.java
index d01d377..d2602d2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LabelAndLocation.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LabelAndLocation.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * Container for some attributes of a {@link Target} that is significantly less heavyweight than an
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
index cb80201..07d593f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
@@ -30,19 +30,19 @@
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.OutputGroupInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
-import com.google.devtools.build.lib.syntax.StarlarkIterable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkIterable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.Location;
 
 /**
  * {@code ConfiguredTarget}s implementing this interface can provide artifacts that <b>can</b> be
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java
index ee6ce9f..439e07b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ResolvedToolchainContext.java
@@ -31,11 +31,11 @@
 import com.google.devtools.build.lib.skyframe.ToolchainException;
 import com.google.devtools.build.lib.skyframe.UnloadedToolchainContext;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainContextApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Represents the data needed for a specific target's use of toolchains and platforms, including
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 266a702..07487fd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -53,8 +53,6 @@
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.packages.Type.LabelClass;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -62,6 +60,8 @@
 import java.util.Map;
 import java.util.TreeMap;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /**
  * Builder class for analyzed rule instances.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index d08e51c..f24f435 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -91,9 +91,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skyframe.SaneAnalysisException;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
@@ -110,6 +107,9 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.Location;
 
 /**
  * The totality of data available during the analysis of a rule.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 481f6c1..d9c79ee 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -36,8 +36,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.RunfilesApi;
 import com.google.devtools.build.lib.starlarkbuildapi.SymlinkEntryApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collections;
@@ -47,6 +45,8 @@
 import java.util.Objects;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.syntax.Location;
 
 /**
  * An object that encapsulates runfiles. Conceptually, the runfiles are a map of paths to files,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/StarlarkProviderValidationUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/StarlarkProviderValidationUtil.java
index e18cd98..90f3c52 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/StarlarkProviderValidationUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/StarlarkProviderValidationUtil.java
@@ -17,8 +17,8 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** Utility class to validate results of executing Starlark rules and aspects. */
 public class StarlarkProviderValidationUtil {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
index 27b3c16..d542743 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
@@ -20,11 +20,11 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.TemplateVariableInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Provides access to make variables from the current fragments. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
index 0ed5b6b..93d6be8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.RequiredProviders;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkIndexable;
 
 /**
  * Multiple {@link TransitiveInfoProvider}s bundled together.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ParameterFileWriteAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ParameterFileWriteAction.java
index 883c081..8e41b91 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ParameterFileWriteAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ParameterFileWriteAction.java
@@ -40,13 +40,13 @@
 import com.google.devtools.build.lib.server.FailureDetails.Spawn.Code;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.Fingerprint;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** Action to write a parameter file for a {@link CommandLine}. */
 @Immutable // if commandLine is immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index b20f8e4..7972e8b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -72,9 +72,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.Spawn.Code;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.LazyString;
@@ -92,6 +89,9 @@
 import java.util.function.Consumer;
 import javax.annotation.CheckReturnValue;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** An Action representing an arbitrary subprocess to be forked and exec'd. */
 public class SpawnAction extends AbstractAction implements CommandAction {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java
index 9340b77..4f63cd3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionAction.java
@@ -38,11 +38,11 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.util.Fingerprint;
 import java.io.IOException;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
 
 /** Action to expand a template and write the expanded content to a file. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java b/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java
index 61597cc..1ce43ce 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java
@@ -15,9 +15,9 @@
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.EventHandler;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * An interface for language-specific configurations.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java
index 1988d78..051a7e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java
@@ -19,8 +19,8 @@
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.starlarkbuildapi.FragmentCollectionApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Represents a collection of configuration fragments in Starlark. */
 // Documentation can be found at ctx.fragments
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index 3e02e59..1cf7e72 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -23,19 +23,19 @@
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+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.Location;
 
 /**
  * Implementation of {@link ConfigurationTransitionApi}.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
index 219ee6d..b9f32fc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
@@ -35,13 +35,13 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * An abstract implementation of ConfiguredTarget in which all properties are assigned trivial
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
index 65b0f11..d980d27 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
@@ -29,8 +29,8 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.Objects;
+import net.starlark.java.eval.Printer;
 
 /**
  * A ConfiguredTarget for an InputFile.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
index 3dd1003..720f720 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
@@ -32,10 +32,10 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.Provider.Key;
 import com.google.devtools.build.lib.starlarkbuildapi.ActionApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
+import net.starlark.java.eval.Printer;
 
 /**
  * A single dependency with its configured target and aspects merged together.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
index 8ba3006..2e57bc5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** A ConfiguredTarget for an OutputFile. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
index ba717ea..89d0aaa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
@@ -46,10 +46,10 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.ActionApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.function.Consumer;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A {@link com.google.devtools.build.lib.analysis.ConfiguredTarget} that is produced by a rule.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 6578c33..be0d6a5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -21,7 +21,6 @@
         exclude = UTIL_SRCS + ["PlatformUtils.java"],
     ),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/config_matching_provider",
         "//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_provider",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -31,6 +30,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:string",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java
index 7cc1443..bcfde54 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java
@@ -32,18 +32,18 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintCollectionApi;
-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.StarlarkSemantics;
 import com.google.devtools.build.lib.util.Fingerprint;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Objects;
 import java.util.function.Function;
 import javax.annotation.Nullable;
+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.StarlarkSemantics;
 
 /** A collection of constraint values. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java
index fffe7e9..01489a3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java
@@ -22,10 +22,10 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintSettingInfoApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.util.Fingerprint;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.syntax.Location;
 
 /** Provider for a platform constraint setting that is available to be fulfilled. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java
index 27c8de3..328fea7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java
@@ -25,10 +25,10 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.util.Fingerprint;
 import java.util.Objects;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.syntax.Location;
 
 /** Provider for a platform constraint value that fulfills a {@link ConstraintSettingInfo}. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
index 81172eb..9fbd1fd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
@@ -24,19 +24,19 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.PlatformInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-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.StarlarkThread;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.StringUtilities;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+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.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Provider for a platform, which is a group of constraints and values. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
index 8d37cd8..c4593eb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
@@ -24,12 +24,12 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * A provider that supplies information about a specific language toolchain, including what platform
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainTypeInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainTypeInfo.java
index 5b1cea2..7422803 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainTypeInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainTypeInfo.java
@@ -21,9 +21,9 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainTypeInfoApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.Objects;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.syntax.Location;
 
 /** A provider that supplies information about a specific toolchain type. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java
index 982f9a0..3db934f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java
@@ -28,22 +28,22 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+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.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /**
  * Implementation of the {@code Args} Starlark type, which, in a builder-like pattern, encapsulates
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/BazelBuildApiGlobals.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/BazelBuildApiGlobals.java
index 50bcee9..5e635c8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/BazelBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/BazelBuildApiGlobals.java
@@ -16,9 +16,9 @@
 
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkBuildApiGlobals;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Bazel implementation of {@link StarlarkBuildApiGlobals}: a collection of global Starlark build
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
index 4611892..36a1fad 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
@@ -28,12 +28,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.common.options.OptionDefinition;
 import com.google.devtools.common.options.OptionsParser;
@@ -47,6 +41,12 @@
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
 
 /**
  * Utility class for common work done across {@link StarlarkAttributeTransitionProvider} and {@link
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
index 5c86270..257f373 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
@@ -51,13 +51,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkActionFactoryApi;
-import com.google.devtools.build.lib.syntax.Dict;
-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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.protobuf.GeneratedMessage;
 import java.nio.charset.StandardCharsets;
@@ -66,6 +59,13 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.UUID;
+import net.starlark.java.eval.Dict;
+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.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Provides a Starlark interface for all action creation needs. */
 public class StarlarkActionFactory implements StarlarkActionFactoryApi {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
index eea769d..e1d0909 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
@@ -43,19 +43,19 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAttrModuleApi;
-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.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import java.util.List;
 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.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * A helper class to provide Attr module in Starlark.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributeTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributeTransitionProvider.java
index f8d7eae..0f28df6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributeTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributeTransitionProvider.java
@@ -34,11 +34,11 @@
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.SplitTransitionProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
 
 /**
  * This class implements {@link TransitionFactory} to provide a starlark-defined transition that
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributesCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributesCollection.java
index d0ba263..ca59e2e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributesCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttributesCollection.java
@@ -26,14 +26,14 @@
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.packages.Type.LabelClass;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAttributesCollectionApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkList;
 
 /** Information about attributes of a rule an aspect is applied to. */
 class StarlarkAttributesCollection implements StarlarkAttributesCollectionApi {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCommandLine.java
index ec5b4f1..a4562b8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCommandLine.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkCommandLineApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A Starlark module class to create memory efficient command lines. */
 public class StarlarkCommandLine implements StarlarkCommandLineApi {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkConfig.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkConfig.java
index c57210f..d637899 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkConfig.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkConfig.java
@@ -22,8 +22,8 @@
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
 import com.google.devtools.build.lib.packages.BuildSetting;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
 
 /** Starlark namespace for creating build settings. */
 // TODO(juliexxia): Consider adding more types of build settings, specifically other label types.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
index dc54573..93c48bb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
@@ -38,16 +38,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.DirectoryExpander;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.FileRootApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-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.StarlarkCallable;
-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.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
@@ -59,6 +49,16 @@
 import java.util.UUID;
 import java.util.function.Consumer;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Supports ctx.actions.args() from Starlark. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkErrorReporter.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkErrorReporter.java
index 96b5fca..e8da1ff 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkErrorReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkErrorReporter.java
@@ -15,8 +15,8 @@
 
 import com.google.devtools.build.lib.analysis.RuleErrorConsumer;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * {@link RuleErrorConsumer} for Native implementations of Starlark APIs.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
index 78cabf1..db0d290 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.LateBoundDefaultApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Map;
@@ -35,6 +34,7 @@
 import javax.annotation.concurrent.Immutable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
+import net.starlark.java.eval.Printer;
 
 /**
  * An implementation of {@link LateBoundDefault} which obtains a late-bound attribute value (of type
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
index 9f982e9..d13363e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
@@ -81,25 +81,25 @@
 import com.google.devtools.build.lib.packages.Type.ConversionException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleFunctionsApi;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Identifier;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Module;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.Pair;
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
+import net.starlark.java.syntax.Identifier;
+import net.starlark.java.syntax.Location;
 
 /** A helper class to provide an easier API for Starlark rule definitions. */
 public class StarlarkRuleClassFunctions implements StarlarkRuleFunctionsApi<Artifact> {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
index dc35bfa..e90a9db 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
@@ -51,22 +51,22 @@
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 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.Mutability;
+import net.starlark.java.eval.Sequence;
+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.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /**
  * A helper class to build Rule Configured Targets via runtime loaded rule implementations defined
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
index b2f7764..e82aa25 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
@@ -77,17 +77,6 @@
 import com.google.devtools.build.lib.shell.ShellUtils;
 import com.google.devtools.build.lib.shell.ShellUtils.TokenizationException;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
-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.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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -98,6 +87,17 @@
 import java.util.Map;
 import java.util.Set;
 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.Printer;
+import net.starlark.java.eval.Sequence;
+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.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
 
 /**
  * A Starlark API for the ruleContext.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleTransitionProvider.java
index d63f656..0cccb89 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleTransitionProvider.java
@@ -31,11 +31,11 @@
 import com.google.devtools.build.lib.packages.Rule;
 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.syntax.Starlark;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Objects;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * This class implements {@link TransitionFactory} to provide a starlark-defined transition that
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/AnalysisFailure.java b/src/main/java/com/google/devtools/build/lib/analysis/test/AnalysisFailure.java
index 50a126d..9855949 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/AnalysisFailure.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/AnalysisFailure.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.test.AnalysisFailureApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Encapsulates information about an analysis-phase error which would have occurred during a build.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
index 9964a40..57df1c7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
@@ -25,16 +25,16 @@
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.starlarkbuildapi.test.CoverageCommonApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.InstrumentedFilesInfoApi;
-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.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.Pair;
 import java.util.Arrays;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
 
 /** Helper functions for Starlark to access coverage-related infrastructure. */
 public class CoverageCommon implements CoverageCommonApi<ConstraintValueInfo, StarlarkRuleContext> {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD
index c479d9d..e7d0c41 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/BUILD
@@ -22,7 +22,6 @@
         "//src/main/java/com/google/devtools/build/lib:loading-phase-threads-option",
         "//src/main/java/com/google/devtools/build/lib:runtime",
         "//src/main/java/com/google/devtools/build/lib:runtime/blaze_command_result",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:no_build_event",
         "//src/main/java/com/google/devtools/build/lib/analysis:no_build_request_finished_event",
         "//src/main/java/com/google/devtools/build/lib/bazel/repository",
@@ -48,6 +47,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/main/protobuf:failure_details_java_proto",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index a15f019..5bf13fc 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -45,7 +45,6 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -60,6 +59,7 @@
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Starlark;
 
 /** Syncs all repositories specified in the workspace file */
 @Command(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
index 8f4b66c..022e0d2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/debug/BUILD
@@ -43,7 +43,7 @@
     deps = [
         ":workspace_log_java_proto",
         "//src/main/java/com/google/devtools/build/lib/events",
-        "//src/main/java/com/google/devtools/build/lib/syntax:frontend",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEvent.java b/src/main/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEvent.java
index 4ebe08d..1973da3 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/debug/WorkspaceRuleEvent.java
@@ -21,10 +21,10 @@
 import com.google.devtools.build.lib.bazel.debug.proto.WorkspaceLogProtos.TemplateEvent;
 import com.google.devtools.build.lib.bazel.debug.proto.WorkspaceLogProtos.WhichEvent;
 import com.google.devtools.build.lib.events.ExtendedEventHandler.ProgressLike;
-import com.google.devtools.build.lib.syntax.Location;
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.syntax.Location;
 
 /** An event to record events happening during workspace rule resolution */
 public final class WorkspaceRuleEvent implements ProgressLike {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD
index c05b568..46ee385 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD
@@ -23,7 +23,6 @@
     deps = [
         "//src/java_tools/singlejar/java/com/google/devtools/build/zip",
         "//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/analysis:rule_definition_environment",
@@ -44,6 +43,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",
         "//third_party:apache_commons_compress",
         "//third_party:auto_value",
         "//third_party:flogger",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
index f0f71e3..81061c8 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
@@ -16,13 +16,13 @@
 
 import com.google.common.base.Optional;
 import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.io.IOException;
 import java.util.Set;
+import net.starlark.java.eval.Starlark;
 
 /**
  * The contents of decompressed archive.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedEvent.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedEvent.java
index 5cbfa80..f86b4b0 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedEvent.java
@@ -28,14 +28,14 @@
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.StructImpl;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.Path;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Event indicating that a repository rule was executed, together with the return value of the rule.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
index 74f4150..ac797b4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
@@ -24,7 +24,6 @@
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.Command;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.common.options.OptionsBase;
 import java.io.File;
 import java.io.IOException;
@@ -32,6 +31,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import net.starlark.java.eval.Printer;
 
 /** Module providing the collection of the resolved values for the repository rules executed. */
 public final class RepositoryResolvedModule extends BlazeModule {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
index 2833627..2af591b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
@@ -37,7 +37,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//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/util",
         "//src/main/java/com/google/devtools/build/lib/util:string",
         "//src/main/java/com/google/devtools/build/lib/util/io",
@@ -46,6 +45,7 @@
         "//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",
         "//third_party:guava",
         "//third_party:java-diff-utils",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkExecutionResult.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkExecutionResult.java
index eee5ed1..a8275f5 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkExecutionResult.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkExecutionResult.java
@@ -25,7 +25,6 @@
 import com.google.devtools.build.lib.shell.CommandResult;
 import com.google.devtools.build.lib.shell.TerminationStatus;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.StarlarkExecutionResultApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.io.DelegatingOutErr;
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.build.lib.util.io.RecordingOutErr;
@@ -35,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A structure callable from Starlark that stores the result of repository_ctx.execute() method. It
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkPath.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkPath.java
index e97702a..92aaca6 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkPath.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkPath.java
@@ -17,9 +17,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryPathApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.vfs.Path;
 import java.io.IOException;
+import net.starlark.java.eval.Printer;
 
 /**
  * A Path object to be used into Starlark remote repository.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
index 7593e87..e1dc5fb 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
@@ -54,13 +54,6 @@
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor.ExecutionResult;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.StarlarkRepositoryContextApi;
-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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.OsUtils;
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.util.io.OutErr;
@@ -89,6 +82,13 @@
 import java.util.List;
 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.Mutability;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Starlark API for the repository_rule's context. */
 public class StarlarkRepositoryContext
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
index c52eaca..5652d97 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
@@ -39,12 +39,6 @@
 import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
 import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
-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.StarlarkCallable;
-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.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -54,6 +48,12 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+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;
 
 /** A repository function to delegate work done by Starlark remote repositories. */
 public class StarlarkRepositoryFunction extends RepositoryFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java
index be3ac04..a45f85f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java
@@ -39,16 +39,16 @@
 import com.google.devtools.build.lib.packages.WorkspaceFactoryHelper;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryModuleApi;
-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.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
 
 /**
  * The Starlark module containing the definition of {@code repository_rule} function to define a
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index afd0ea6..d1c3061 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -38,7 +38,6 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
 import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper;
 import com.google.devtools.build.lib.skyframe.DirectoryListingValue;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -58,6 +57,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
 
 /** Implementation of the {@code android_ndk_repository} rule. */
 public class AndroidNdkRepositoryFunction extends AndroidRepositoryFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index 7f15f08..192c185 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper;
 import com.google.devtools.build.lib.skyframe.DirectoryListingValue;
 import com.google.devtools.build.lib.skyframe.Dirents;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.build.lib.vfs.Dirent;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -49,6 +48,7 @@
 import java.io.InputStream;
 import java.util.Map;
 import java.util.Properties;
+import net.starlark.java.eval.EvalException;
 
 /** Implementation of the {@code android_sdk_repository} rule. */
 public class AndroidSdkRepositoryFunction extends AndroidRepositoryFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
index 3793f15..85db1da 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BUILD
@@ -22,7 +22,6 @@
         ],
     ),
     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/actions:file_metadata",
         "//src/main/java/com/google/devtools/build/lib/analysis:actions/custom_command_line",
@@ -57,6 +56,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/main/protobuf:crosstool_config_java_proto",
         "//third_party:android_common_25_0_0_lite",
         "//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
index 43e7727..5b2cc59 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
@@ -21,7 +21,6 @@
     resources = glob(["*.WORKSPACE"]),
     deps = [
         ":bazel_cpp_semantics",
-        "//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/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/host_transition",
@@ -32,6 +31,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/lib/util:os",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 893af10..7068ddf 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -32,11 +32,11 @@
 import com.google.devtools.build.lib.rules.cpp.FeatureConfigurationForStarlark;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.BazelCcModuleApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
 
 /**
  * A module that contains Starlark utilities for C++ support.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD
index cd37e3d..d5567ca 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/BUILD
@@ -36,13 +36,13 @@
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/skyframe:track_source_directories_flag",
-        "//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/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/protobuf:failure_details_java_proto",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraphRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraphRule.java
index 95907e5..177282e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraphRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaGraphRule.java
@@ -26,9 +26,9 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.FileTypeSet;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * The rule that parses the Ninja graph and symlinks inputs into output_root.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java b/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java
index c869c1f..7bda966 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java
@@ -29,9 +29,6 @@
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.SymlinkForest.Code;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -43,6 +40,9 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Creates a symlink forest based on a package path map. */
 public class SymlinkForest {
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
index 8cf9fd0..f1c790c 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -27,7 +27,6 @@
     deps = [
         ":LabelValidator",
         ":cmdline-primitives",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions:commandline_item",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
@@ -38,6 +37,8 @@
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//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/main/protobuf:failure_details_java_proto",
         "//third_party:error_prone_annotations",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 12b33d8..8febf16 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -25,10 +25,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -42,6 +38,10 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A class to identify a BUILD target. All targets belong to exactly one package. The name of a
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
index 3132422..1bef09e 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
@@ -30,9 +30,9 @@
         "//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/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util:exit_code",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:auto_value",
         "//third_party:error_prone_annotations",
         "//third_party:flogger",
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Depset.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Depset.java
index 4db871c..0254fb7 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Depset.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Depset.java
@@ -18,16 +18,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.Dict;
-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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.annotation.Nullable;
@@ -35,6 +25,16 @@
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkInterfaceUtils;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.Dict;
+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.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A Depset is a Starlark value that wraps a {@link NestedSet}.
diff --git a/src/main/java/com/google/devtools/build/lib/events/BUILD b/src/main/java/com/google/devtools/build/lib/events/BUILD
index 6cf889f..aad49b2 100644
--- a/src/main/java/com/google/devtools/build/lib/events/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/events/BUILD
@@ -12,10 +12,10 @@
     name = "events",
     srcs = glob(["*.java"]),
     deps = [
-        "//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/com/google/devtools/build/lib/util/io:out-err",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/events/Event.java b/src/main/java/com/google/devtools/build/lib/events/Event.java
index 9d764ed..f699405 100644
--- a/src/main/java/com/google/devtools/build/lib/events/Event.java
+++ b/src/main/java/com/google/devtools/build/lib/events/Event.java
@@ -19,9 +19,6 @@
 import static java.util.Comparator.comparing;
 
 import com.google.common.collect.ImmutableClassToInstanceMap;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.build.lib.util.io.FileOutErr;
 import java.io.IOException;
 import java.io.Serializable;
@@ -32,6 +29,9 @@
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.SyntaxError;
 
 /**
  * A situation encountered by the build system that's worth reporting.
diff --git a/src/main/java/com/google/devtools/build/lib/events/ExceptionListener.java b/src/main/java/com/google/devtools/build/lib/events/ExceptionListener.java
index 62432a1..fb29f20 100644
--- a/src/main/java/com/google/devtools/build/lib/events/ExceptionListener.java
+++ b/src/main/java/com/google/devtools/build/lib/events/ExceptionListener.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;
 
 /**
  * The ExceptionListener is the primary means of reporting exceptions. It is a subset of the
diff --git a/src/main/java/com/google/devtools/build/lib/events/Reporter.java b/src/main/java/com/google/devtools/build/lib/events/Reporter.java
index ec20b38..dcfe8be 100644
--- a/src/main/java/com/google/devtools/build/lib/events/Reporter.java
+++ b/src/main/java/com/google/devtools/build/lib/events/Reporter.java
@@ -16,11 +16,11 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.io.OutErr;
 import java.io.PrintStream;
 import java.util.HashSet;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import net.starlark.java.syntax.Location;
 
 /**
  * The reporter is the primary means of reporting events such as errors, warnings, progress
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 9c405bf..1458585 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -40,10 +40,6 @@
 import com.google.devtools.build.lib.packages.Type.LabelClass;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.ClassObject;
-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.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.StringUtil;
@@ -60,6 +56,10 @@
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Metadata of a rule attribute. Contains the attribute name and type, and an default value to be
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeValueSource.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeValueSource.java
index 7effc45..7e013b7 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeValueSource.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeValueSource.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * An enum that represents different types of rule attributes, based on where their values come
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BUILD b/src/main/java/com/google/devtools/build/lib/packages/BUILD
index 74d8a82..3aa84a2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/packages/BUILD
@@ -41,8 +41,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
         "//src/main/java/com/google/devtools/build/lib/util:exit_code",
@@ -53,7 +51,9 @@
         "//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/spelling",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:build_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
index 5f1e36f..f3f81d2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
@@ -17,15 +17,15 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Module;
+import net.starlark.java.eval.Module;
 
 /**
  * BazelModuleContext records Bazel-specific information associated with a .bzl {@link
- * com.google.devtools.build.lib.syntax.Module}.
+ * net.starlark.java.eval.Module}.
  */
 @AutoValue
 public abstract class BazelModuleContext {
-  /** Label associated with the Starlark {@link com.google.devtools.build.lib.syntax.Module}. */
+  /** Label associated with the Starlark {@link net.starlark.java.eval.Module}. */
   public abstract Label label();
 
   /** Returns the name of the module's .bzl file, as provided to the parser. */
@@ -38,19 +38,19 @@
   public abstract ImmutableMap<String, Module> loads();
 
   /**
-   * Transitive digest of the .bzl file of the {@link com.google.devtools.build.lib.syntax.Module}
-   * itself and all files it transitively loads.
+   * Transitive digest of the .bzl file of the {@link net.starlark.java.eval.Module} itself and all
+   * files it transitively loads.
    */
   @SuppressWarnings({"AutoValueImmutableFields", "mutable"})
   @AutoValue.CopyAnnotations
   public abstract byte[] bzlTransitiveDigest();
 
   /**
-   * Returns a label for a {@link com.google.devtools.build.lib.syntax.Module}.
+   * Returns a label for a {@link net.starlark.java.eval.Module}.
    *
    * <p>This is a user-facing value and we rely on this string to be a valid label for the {@link
-   * com.google.devtools.build.lib.syntax.Module} (and that only). Please see the documentation of
-   * {@link com.google.devtools.build.lib.syntax.Module#setClientData(Object)} for more details.
+   * net.starlark.java.eval.Module} (and that only). Please see the documentation of {@link
+   * net.starlark.java.eval.Module#setClientData(Object)} for more details.
    */
   @Override
   public final String toString() {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
index 24a7b3b..813837f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
@@ -19,10 +19,10 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionContext;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Contextual information associated with each Starlark thread created by Bazel. */
 // TODO(adonovan): rename BazelThreadContext, for symmetry with BazelModuleContext.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildSetting.java b/src/main/java/com/google/devtools/build/lib/packages/BuildSetting.java
index d8cddf0..ac5f493 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuildSetting.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuildSetting.java
@@ -15,7 +15,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi.BuildSettingApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Metadata of a build setting rule's properties. This describes the build setting's type (for
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
index 8b495f4..bdf25b7 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
@@ -29,10 +29,6 @@
 import com.google.devtools.build.lib.packages.Type.LabelClass;
 import com.google.devtools.build.lib.packages.Type.ListType;
 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.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -40,6 +36,10 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Collection of data types that are specific to building things, i.e. not inherent to Starlark.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
index 496701b..0ff81ee 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
@@ -15,11 +15,11 @@
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.NativeProvider.NativeKey;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
 
 /**
  * Base class for declared providers {@see Provider} defined in native code.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/CallStack.java b/src/main/java/com/google/devtools/build/lib/packages/CallStack.java
index 65a1880..a08b017 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/CallStack.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/CallStack.java
@@ -15,14 +15,14 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * A CallStack is an opaque immutable stack of Starlark call frames, outermost call first. Its
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
index a4de20e..f56753e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.BuildType.Selector;
 import com.google.devtools.build.lib.packages.BuildType.SelectorList;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -32,6 +31,7 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * {@link AttributeMap} implementation that binds a rule's attribute as follows:
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
index 935d48d..5c041c3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
@@ -20,11 +20,11 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 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.Starlark;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A rule visibility that simply says yes or no. It corresponds to public,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/DefaultPackageArguments.java b/src/main/java/com/google/devtools/build/lib/packages/DefaultPackageArguments.java
index ffca6d7..4ec2aef 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/DefaultPackageArguments.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/DefaultPackageArguments.java
@@ -17,10 +17,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.License.DistributionType;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.List;
 import java.util.Set;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /** Encapsulates the core, default set of {@link PackageArgument}s. */
 final class DefaultPackageArguments {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/EnvironmentGroup.java b/src/main/java/com/google/devtools/build/lib/packages/EnvironmentGroup.java
index 587d626..1f1c850 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/EnvironmentGroup.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/EnvironmentGroup.java
@@ -26,13 +26,13 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.syntax.Location;
 
 /**
  * Model for the "environment_group' rule: the piece of Bazel's rule constraint system that binds
diff --git a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
index 87e7228..cc625fa 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
@@ -23,8 +23,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.starlarkbuildapi.FilesetEntryApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collection;
 import java.util.Collections;
@@ -33,6 +31,8 @@
 import java.util.Locale;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * FilesetEntry is a value object used to represent a "FilesetEntry" inside a "Fileset" BUILD rule.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index ace5f64..5fa594a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -29,10 +29,6 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-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.Starlark;
 import com.google.devtools.build.lib.util.StringUtil;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -44,6 +40,10 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A function interface allowing rules to specify their set of implicit outputs in a more dynamic
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Info.java b/src/main/java/com/google/devtools/build/lib/packages/Info.java
index 99c273d..2d013b2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Info.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Info.java
@@ -13,9 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /**
  * An Info is a unit of information produced by analysis of one configured target and consumed by
diff --git a/src/main/java/com/google/devtools/build/lib/packages/InputFile.java b/src/main/java/com/google/devtools/build/lib/packages/InputFile.java
index 64f1577..40de222 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/InputFile.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/InputFile.java
@@ -18,9 +18,9 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import net.starlark.java.syntax.Location;
 
 /**
  * A file that is an input to the build system.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/InternalModule.java b/src/main/java/com/google/devtools/build/lib/packages/InternalModule.java
index 817f5bb..10bed35 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/InternalModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/InternalModule.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
 
 // TODO(#11437): Factor an API out into skylarkbuildapi, for stardoc's benefit. Otherwise, stardoc
 // can't run on @builtins bzls.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/License.java b/src/main/java/com/google/devtools/build/lib/packages/License.java
index bf70b93..8bbfa39 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/License.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/License.java
@@ -24,13 +24,13 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.LicenseApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
+import net.starlark.java.eval.Printer;
 
 /** Support for license and distribution checking. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java b/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java
index 9592565..1c1eda1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java
@@ -15,10 +15,10 @@
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.Location;
 
 /**
  * Abstract base class for implementations of {@link StructImpl} that expose
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
index 9dac3cf..ed8ebfe 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
@@ -16,10 +16,10 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.util.Pair;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /**
  * Base class for declared providers {@see Provider} defined in native code.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
index 490db8a..3b6c138 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * A generated file that is the output of a rule.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 20c8635..68dd22a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -49,10 +49,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.SerializationException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -73,7 +69,11 @@
 import java.util.Set;
 import java.util.TreeMap;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.spelling.SpellChecker;
+import net.starlark.java.syntax.Location;
 
 /**
  * A package, which is a container of {@link Rule}s, each of which contains a dictionary of named
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageArgument.java b/src/main/java/com/google/devtools/build/lib/packages/PackageArgument.java
index 20f9646..a7aca37 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageArgument.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageArgument.java
@@ -14,8 +14,8 @@
 
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /** Defines an argument to the {@code package()} function. */
 public abstract class PackageArgument<T> {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 02825ae..137e1b5 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -43,35 +43,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import com.google.devtools.build.lib.syntax.Argument;
-import com.google.devtools.build.lib.syntax.CallExpression;
-import com.google.devtools.build.lib.syntax.DefStatement;
-import com.google.devtools.build.lib.syntax.Dict;
-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.ForStatement;
-import com.google.devtools.build.lib.syntax.Identifier;
-import com.google.devtools.build.lib.syntax.IfStatement;
-import com.google.devtools.build.lib.syntax.IntegerLiteral;
-import com.google.devtools.build.lib.syntax.ListExpression;
-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.NodeVisitor;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Program;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-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.syntax.StringLiteral;
-import com.google.devtools.build.lib.syntax.SyntaxError;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -90,6 +61,35 @@
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.atomic.AtomicReference;
 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.NoneType;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
+import net.starlark.java.syntax.Argument;
+import net.starlark.java.syntax.CallExpression;
+import net.starlark.java.syntax.DefStatement;
+import net.starlark.java.syntax.Expression;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ForStatement;
+import net.starlark.java.syntax.Identifier;
+import net.starlark.java.syntax.IfStatement;
+import net.starlark.java.syntax.IntegerLiteral;
+import net.starlark.java.syntax.ListExpression;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.NodeVisitor;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.StringLiteral;
+import net.starlark.java.syntax.SyntaxError;
 
 /**
  * The package factory is responsible for constructing Package instances from a BUILD file's
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java b/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
index ca1aa12..2b12e33 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
@@ -22,11 +22,11 @@
 import com.google.devtools.build.lib.packages.License.DistributionType;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import net.starlark.java.syntax.Location;
 
 /**
  * This class represents a package group BUILD target. It has a name, a list of {@link
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageLoadingListener.java b/src/main/java/com/google/devtools/build/lib/packages/PackageLoadingListener.java
index ce3398d..163743b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageLoadingListener.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageLoadingListener.java
@@ -14,8 +14,8 @@
 
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.List;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /** Listener for package-loading events. */
 public interface PackageLoadingListener {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageUtils.java b/src/main/java/com/google/devtools/build/lib/packages/PackageUtils.java
index 5d8e06d..58af703 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageUtils.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.List;
+import net.starlark.java.eval.EvalException;
 
 /** Miscellaneous utils internal to Packages. */
 final class PackageUtils {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Provider.java b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
index 5c2fb2d..3e623e2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * Declared Provider (a constructor for {@link Info}).
@@ -48,7 +48,7 @@
 
   /**
    * Returns an error message format string for instances to use for their {@link
-   * com.google.devtools.build.lib.syntax.ClassObject#getErrorMessageForUnknownField(String)}.
+   * net.starlark.java.eval.ClassObject#getErrorMessageForUnknownField(String)}.
    *
    * <p>The format string must contain one {@code '%s'} placeholder for the field name.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index 81d8899..e5095e8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -32,14 +32,14 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.License.DistributionType;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.BinaryPredicate;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /**
  * An instance of a build rule in the build language. A rule has a name, a package to which it
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index cf713a3..e14887d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -56,11 +56,6 @@
 import com.google.devtools.build.lib.packages.Type.ConversionException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.StringUtil;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -80,6 +75,11 @@
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * Instances of RuleClass encapsulate the set of attributes of a given "class" of rule, such as
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 7676916..a35a351 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -19,8 +19,8 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.ThirdPartyLicenseExistencePolicy;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * The collection of the supported build rules. Provides an StarlarkThread for Starlark rule
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index e54cc34..b1a402c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -24,13 +24,13 @@
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
 import com.google.devtools.build.lib.packages.PackageFactory.PackageContext;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-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.syntax.StarlarkThread.CallStackEntry;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkThread.CallStackEntry;
+import net.starlark.java.syntax.Location;
 
 /**
  * Given a {@link RuleClass} and a set of attribute values, returns a {@link Rule} instance. Also
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java b/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
index 548149c..7a66a7c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
@@ -18,17 +18,17 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.HasBinary;
-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 com.google.devtools.build.lib.syntax.TokenKind;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.HasBinary;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.TokenKind;
 
 /**
  * An attribute value consisting of a concatenation of native types and selects, e.g:
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SelectorValue.java b/src/main/java/com/google/devtools/build/lib/packages/SelectorValue.java
index 1a484e7..414905f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SelectorValue.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SelectorValue.java
@@ -17,14 +17,14 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 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.HasBinary;
-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 com.google.devtools.build.lib.syntax.TokenKind;
 import java.util.Map;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.HasBinary;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.TokenKind;
 
 /**
  * The value returned by a call to {@code select({...})}, for example:
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspect.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspect.java
index df46dfe..7c65d9b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspect.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAspectApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Represents an aspect which can be attached to a Starlark-defined rule attribute. */
 public interface StarlarkAspect extends StarlarkAspectApi {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
index ec84dac..1f3ef02 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
@@ -18,13 +18,13 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.ClassObject;
-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.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * A helper class for calling Starlark functions from Java, where the argument values are supplied
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
index ffb9794..6c2efab 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
@@ -22,13 +22,13 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
 
 /** A Starlark value that is a result of an 'aspect(..)' function call. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkExportable.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkExportable.java
index 58805bc..0898726 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkExportable.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkExportable.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * {@link StarlarkValue}s that need special handling when they are exported from an extension file.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
index 3f23e2d..d829fe9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
@@ -19,17 +19,17 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.ClassObject;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.HasBinary;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.TokenKind;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.HasBinary;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.TokenKind;
 
 /** An Info (provider instance) for providers defined in Starlark. */
 public final class StarlarkInfo extends StructImpl implements HasBinary, ClassObject {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
index 3fe9883..3a16365 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
@@ -24,18 +24,18 @@
 import com.google.devtools.build.lib.packages.Type.ConversionException;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-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.StarlarkThread;
 import java.util.List;
 import java.util.Set;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * A library of pre-declared Bazel Starlark functions.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeAspect.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeAspect.java
index 114382c..6d0fe86 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeAspect.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** A natively-defined aspect that is may be referenced by Starlark attribute definitions. */
 public abstract class StarlarkNativeAspect extends NativeAspectClass implements StarlarkAspect {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
index 34caa41..2d44acf 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
@@ -32,17 +32,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkNativeModuleApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Mutability;
-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.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -52,6 +41,17 @@
 import java.util.Map;
 import java.util.TreeMap;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Mutability;
+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 net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
+import net.starlark.java.syntax.Location;
 
 /** The Starlark native module. */
 // TODO(cparsons): Move the definition of native.package() to this class.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
index 87d10c8..baadd2a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
@@ -18,15 +18,15 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
 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.Location;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Collection;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * A provider defined in Starlark rather than in native code.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
index 4238bec..ec675f8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
@@ -17,19 +17,19 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.Ordering;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-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.Location;
-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.protobuf.TextFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 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.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
 
 /**
  * An abstract base class for Starlark values that have fields, have to_json and to_proto methods,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
index c196b16..2a1fd88 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * The provider for the built-in type {@code struct}.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Target.java b/src/main/java/com/google/devtools/build/lib/packages/Target.java
index 3d1b8e7..9dc1fc9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Target.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Target.java
@@ -16,9 +16,9 @@
 
 import com.google.devtools.build.lib.packages.License.DistributionType;
 import com.google.devtools.build.lib.starlarkbuildapi.TargetApi;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * A node in the build dependency graph, identified by a Label.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index b45939f..b2ddd09 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -24,9 +24,6 @@
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.actions.ExecutionRequirements;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.Pair;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,6 +31,9 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /**
  * Utility functions over Targets that don't really belong in the base {@link
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java
index 46474c3..0a734ad 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Type.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java
@@ -23,10 +23,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 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.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.LoggingUtil;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
 import java.util.ArrayList;
@@ -38,6 +34,10 @@
 import java.util.Set;
 import java.util.logging.Level;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Root of Type symbol hierarchy for values in the build language.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index fcb462f..4890bd2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -25,19 +25,6 @@
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
 import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension;
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-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.Printer;
-import com.google.devtools.build.lib.syntax.Program;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-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.Tuple;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
@@ -45,6 +32,19 @@
 import java.util.List;
 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.Printer;
+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.eval.Tuple;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.SyntaxError;
 
 /** Parser for WORKSPACE files. Fills in an ExternalPackage.Builder */
 // TODO(adonovan): make a simpler API around a single static function of this form:
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
index 1ffd028..a0eaad8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
@@ -25,12 +25,12 @@
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A helper for the {@link WorkspaceFactory} to create repository rules */
 public class WorkspaceFactoryHelper {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFileValue.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFileValue.java
index c9b6af9..ebfaa96 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFileValue.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFileValue.java
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Module;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -30,6 +29,7 @@
 import com.google.devtools.build.skyframe.SkyValue;
 import java.util.Map;
 import java.util.Objects;
+import net.starlark.java.eval.Module;
 
 /**
  * A SkyValue that contains the result of the parsing of one part of the WORKSPACE file. The parsing
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
index b024078..9321fde 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.packages;
 
-import static com.google.devtools.build.lib.syntax.Starlark.NONE;
+import static net.starlark.java.eval.Starlark.NONE;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -30,13 +30,6 @@
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
 import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException;
 import com.google.devtools.build.lib.starlarkbuildapi.WorkspaceGlobalsApi;
-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.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +38,13 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 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.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A collection of global Starlark build API functions that apply to WORKSPACE files. */
 public class WorkspaceGlobals implements WorkspaceGlobalsApi {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/metrics/BUILD b/src/main/java/com/google/devtools/build/lib/packages/metrics/BUILD
index 35df550..07f7069 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/metrics/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/packages/metrics/BUILD
@@ -22,9 +22,9 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
         "//src/main/java/com/google/devtools/build/lib/collect:extrema",
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:auto_value",
         "//third_party:flogger",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
index 904c780..a43937f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
@@ -15,9 +15,9 @@
 
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.PackageLoadingListener;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.protobuf.util.Durations;
 import javax.annotation.concurrent.GuardedBy;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /** Tracks per-invocation extreme package loading events. */
 public class PackageMetricsPackageLoadingListener implements PackageLoadingListener {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/semantics/BUILD b/src/main/java/com/google/devtools/build/lib/packages/semantics/BUILD
index 16a8d6c..00345cc 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/semantics/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/packages/semantics/BUILD
@@ -20,8 +20,8 @@
     srcs = ["BuildLanguageOptions.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java b/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java
index 023430e..287aa38 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java
@@ -18,7 +18,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Interner;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
@@ -27,6 +26,7 @@
 import com.google.devtools.common.options.OptionsBase;
 import java.io.Serializable;
 import java.util.List;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Options that affect the semantics of Bazel's build language.
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
index bb099a4..b80228a 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
@@ -23,10 +23,6 @@
 import com.google.devtools.build.lib.packages.AspectClass;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleFunction;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.monitoring.runtime.instrumentation.Sampler;
 import com.google.perftools.profiles.ProfileProto.Function;
 import com.google.perftools.profiles.ProfileProto.Line;
@@ -41,6 +37,10 @@
 import java.util.Random;
 import java.util.zip.GZIPOutputStream;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Tracks allocations for memory reporting. */
 @ConditionallyThreadCompatible
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
index e0d1fd7..d0870d6 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerModule.java
@@ -21,10 +21,10 @@
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
 import com.google.devtools.build.lib.runtime.WorkspaceBuilder;
-import com.google.devtools.build.lib.syntax.Debug;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.common.options.OptionsParsingResult;
 import java.util.UUID;
+import net.starlark.java.eval.Debug;
 
 /**
  * A {@link BlazeModule} that can be used to record interesting information about all allocations
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD b/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD
index 3daefef..62a315e 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/BUILD
@@ -18,13 +18,14 @@
         ":allocationtracker",
         ":current_rule_tracker",
         "//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:blaze_directories",
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_version_info",
         "//src/main/java/com/google/devtools/build/lib/analysis:server_directories",
         "//src/main/java/com/google/devtools/build/lib/clock",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party/allocation_instrumenter",
     ],
 )
@@ -45,9 +46,10 @@
     ],
     deps = [
         ":current_rule_tracker",
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/packages",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
         "//third_party/allocation_instrumenter",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD
index b184ff2..752e46a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -23,7 +23,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:file_metadata",
@@ -100,6 +99,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/main/protobuf:analysis_java_proto",
         "//src/main/protobuf:build_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/compat/BUILD b/src/main/java/com/google/devtools/build/lib/query2/compat/BUILD
index 5be5b08..d4db794 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/compat/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/compat/BUILD
@@ -16,7 +16,7 @@
     deps = [
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//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",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/query2/compat/FakeLoadTarget.java b/src/main/java/com/google/devtools/build/lib/query2/compat/FakeLoadTarget.java
index 24c7abb..571edd7 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/compat/FakeLoadTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/compat/FakeLoadTarget.java
@@ -22,9 +22,9 @@
 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.Objects;
 import java.util.Set;
+import net.starlark.java.syntax.Location;
 
 /**
  * A fake Target - Use only so that "blaze query" can report Load files as Targets.
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
index 1481235..1c8fff9 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java
@@ -21,18 +21,18 @@
 import com.google.devtools.build.lib.query2.engine.QueryException;
 import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery.Code;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-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.StarlarkFunction;
-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.OutputStream;
+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.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;
 
 /**
  * Starlark output formatter for cquery results. Each configured target will result in an evaluation
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
index 1ce6898..4fea7461 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
@@ -45,7 +45,6 @@
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import java.io.OutputStream;
 import java.util.Collection;
@@ -55,6 +54,7 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Output formatter that prints {@link ConfigurationTransition} information for rule configured
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/BUILD b/src/main/java/com/google/devtools/build/lib/query2/query/output/BUILD
index e0d8678..6e03651 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/BUILD
@@ -12,7 +12,6 @@
     name = "output",
     srcs = glob(["*.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/collect/compacthashset",
@@ -28,6 +27,8 @@
         "//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/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:build_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:flogger",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
index 1ace23e..85c9f37 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
@@ -29,8 +29,6 @@
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment;
 import com.google.devtools.build.lib.query2.engine.SynchronizedDelegatingOutputFormatterCallback;
 import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
@@ -38,6 +36,8 @@
 import java.util.List;
 import java.util.Set;
 import java.util.function.BiPredicate;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * An output formatter that prints the generating rules using the syntax of the BUILD files. If
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/FormatUtils.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/FormatUtils.java
index e4b9697..7a12a7f 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/FormatUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/FormatUtils.java
@@ -19,11 +19,11 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.query2.common.CommonQueryOptions;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import java.util.Comparator;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * Given a set of query options, returns a BinaryPredicate suitable for passing to {@link
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/LocationOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/LocationOutputFormatter.java
index 1ade9dc..c0d964e 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/LocationOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/LocationOutputFormatter.java
@@ -25,9 +25,9 @@
 import com.google.devtools.build.lib.query2.engine.SynchronizedDelegatingOutputFormatterCallback;
 import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
 import com.google.devtools.build.lib.server.FailureDetails.Query;
-import com.google.devtools.build.lib.syntax.Location;
 import java.io.IOException;
 import java.io.OutputStream;
+import net.starlark.java.syntax.Location;
 
 /**
  * An output formatter that prints the labels of the targets, preceded by
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/ProtoOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/ProtoOutputFormatter.java
index 9ac436d..5e389fd 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/ProtoOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/ProtoOutputFormatter.java
@@ -62,7 +62,6 @@
 import com.google.devtools.build.lib.query2.proto.proto2api.Build.SourceFile;
 import com.google.devtools.build.lib.query2.query.aspectresolvers.AspectResolver;
 import com.google.devtools.build.lib.query2.query.output.QueryOptions.OrderOutput;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -74,6 +73,7 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * An output formatter that outputs a protocol buffer representation
diff --git a/src/main/java/com/google/devtools/build/lib/repository/BUILD b/src/main/java/com/google/devtools/build/lib/repository/BUILD
index 7219732..93a5cd7 100644
--- a/src/main/java/com/google/devtools/build/lib/repository/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/repository/BUILD
@@ -13,8 +13,8 @@
     srcs = ["ExternalPackageException.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/net/starlark/java/eval",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/repository/ExternalPackageException.java b/src/main/java/com/google/devtools/build/lib/repository/ExternalPackageException.java
index 956a6b8..9ada52b 100644
--- a/src/main/java/com/google/devtools/build/lib/repository/ExternalPackageException.java
+++ b/src/main/java/com/google/devtools/build/lib/repository/ExternalPackageException.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.repository;
 
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.skyframe.SkyFunctionException;
 import java.io.IOException;
+import net.starlark.java.eval.EvalException;
 
 /** Exception thrown when something goes wrong accessing a rule. */
 public class ExternalPackageException extends SkyFunctionException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
index 20aab02..cbd6ffc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
@@ -30,11 +30,11 @@
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.ClassObject;
-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 javax.annotation.Nullable;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * This configured target pretends to be whatever type of target "actual" is, returning its label,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/BUILD b/src/main/java/com/google/devtools/build/lib/rules/BUILD
index 63c25c4..82deea9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/BUILD
@@ -129,9 +129,9 @@
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test",
-        "//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/net/starlark/java/eval",
         "//src/main/protobuf:test_status_java_proto",
         "//third_party:guava",
     ],
@@ -163,8 +163,8 @@
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe:build_configuration_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -336,11 +336,11 @@
         "//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/skyframe:directory_listing_value",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//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",
         "//third_party:guava",
     ],
 )
@@ -368,11 +368,11 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline:LabelValidator",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_value",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//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",
         "//third_party:guava",
     ],
 )
@@ -430,14 +430,14 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
         "//src/main/java/com/google/devtools/build/lib/skyframe:sky_value_dirtiness_checker",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/util/io",
         "//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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -487,7 +487,7 @@
     srcs = ["repository/WorkspaceAttributeMapper.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidApplicationResourceInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidApplicationResourceInfo.java
index ecb7c0d..697b34c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidApplicationResourceInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidApplicationResourceInfo.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidApplicationResourceInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A provider for Android resource APKs (".ap_") and related info. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
index fbcf8b5..84c3b06 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
@@ -25,9 +25,9 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidAssetsInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.Optional;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Provides information about transitive Android assets. */
 public final class AndroidAssetsInfo extends NativeInfo
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java
index e0f55c6..c961f84 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidBinaryDataInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provides information on Android resource, asset, and manifest information specific to binaries.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
index a66f6c0..543a88e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidCcLinkParamsProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A target that provides C++ libraries to be linked into Android targets. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
index 0309843..7432277 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDeviceBrokerInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Supplies the device broker type string, passed to the Android test runtime. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java
index ac09a67..30f1aa8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java
@@ -31,9 +31,9 @@
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.rules.config.ConfigFeatureFlag;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidFeatureFlagSetProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.Map;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provider for checking the set of feature flags used by an android_binary.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
index 5b27fab..215663b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
@@ -28,14 +28,14 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidIdeInfoProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** An Android target provider to provide Android-specific info to IDEs. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
index 4da98c0..852a87d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidIdlProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Configured targets implementing this provider can contribute Android IDL information to the
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
index d424202..062e8a3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidInstrumentationInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A provider for targets that create Android instrumentations. Consumed by Android testing rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
index 51e093e..92accf0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
@@ -25,10 +25,10 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidLibraryAarInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * A target that can provide the aar artifact of Android libraries and all the manifests that are
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
index 275f587..8b5acd5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidLibraryResourceClassJarProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A provider which contains the resource class jars from android_library rules. See {@link
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
index f2ecffa..42b0ccd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidNativeLibsInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provider of transitively available ZIPs of native libs that should be directly copied into the
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidPreDexJarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidPreDexJarProvider.java
index ccbd2da..5b4a2bb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidPreDexJarProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidPreDexJarProvider.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidPreDexJarProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A provider of the final Jar to be dexed for targets that build APKs. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
index cb07cd5..816c076 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
@@ -20,8 +20,8 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.rules.java.ProguardLibrary;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidProguardInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * A target that can provide local proguard specifications, returned by the {@link
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
index 78d842a..1312244 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidResourcesInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A provider that supplies ResourceContainers from its transitive closure. */
 @Immutable
@@ -255,7 +255,7 @@
     private static <T> NestedSet<T> nestedSet(Object from, Class<T> with, String fieldName)
         throws EvalException {
       Preconditions.checkArgument(
-          from instanceof Depset || from == com.google.devtools.build.lib.syntax.Starlark.UNBOUND);
+          from instanceof Depset || from == net.starlark.java.eval.Starlark.UNBOUND);
 
       if (from instanceof Depset) {
         return nestedSet((Depset) from, with, fieldName);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index ce674ef..a0f3190 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -66,10 +66,10 @@
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidSplitTransititionApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import java.util.List;
+import net.starlark.java.eval.Printer;
 
 /** Rule definitions for Android rules. */
 public final class AndroidRuleClasses {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
index 514d36e..6982175 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java
@@ -25,8 +25,8 @@
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.rules.java.BootClassPathInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidSdkProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Description of the tools Blaze needs from an Android SDK. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
index b89b878..77ced86 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
@@ -40,19 +40,19 @@
 import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidBinaryDataSettingsApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDataProcessingApi;
-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.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import javax.annotation.Nullable;
+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 net.starlark.java.eval.StarlarkThread;
 
 /** Starlark-visible methods for working with Android data (manifests, resources, and assets). */
 public abstract class AndroidStarlarkData
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
index d45ddf9..b5312eb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
@@ -19,10 +19,10 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ApkInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** A provider for targets that produce an apk file. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/BUILD b/src/main/java/com/google/devtools/build/lib/rules/android/BUILD
index 3ea1e8d..559a5de 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -81,13 +81,13 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android",
-        "//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:os",
         "//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/common/options",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/protobuf:android_deploy_info_java_proto",
         "//third_party:android_common_25_0_0_lite",
         "//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProguardMappingProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProguardMappingProvider.java
index 5d428e8..8c5822d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ProguardMappingProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProguardMappingProvider.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ProguardMappingProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A target that can provide a proguard obfuscation mapping to Android binaries or tests. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
index d0e23f4..fa46add 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
@@ -18,11 +18,11 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ValidatedAndroidDataApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.Objects;
 import java.util.Optional;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** Wraps validated and packaged Android resource information */
 public class ValidatedAndroidResources extends MergedAndroidResources
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
index 91cfe8b..01a60f0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
@@ -23,9 +23,9 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.DataBindingV2ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * A provider that exposes this enables <a
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/UsesDataBindingProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/UsesDataBindingProvider.java
index 9fb3b88..49f9910 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/UsesDataBindingProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/UsesDataBindingProvider.java
@@ -18,9 +18,9 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.android.UsesDataBindingProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import java.util.Collection;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * A provider that exposes this enables <a
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index f0aa5fe..a84b1c1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleBitcodeModeApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
 import com.google.devtools.common.options.EnumConverter;
 import com.google.devtools.common.options.Option;
@@ -39,6 +38,7 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.Printer;
 
 /** Command-line options for building for Apple platforms. */
 public class AppleCommandLineOptions extends FragmentOptions {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
index 3fbe29f..7759984 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java
@@ -23,11 +23,11 @@
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ApplePlatformApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ApplePlatformTypeApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.HashMap;
 import java.util.Locale;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.syntax.Location;
 
 /** An enum that can be used to distinguish between various apple platforms. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD
index f1ace74..a8bcaca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD
@@ -17,7 +17,6 @@
     name = "apple",
     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",
@@ -42,6 +41,8 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple",
         "//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:xcode_java_proto",
         "//third_party:flogger",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
index 90538cd..821fcbe 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
@@ -24,12 +24,12 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.DottedVersionApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.ArrayList;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
 
 /**
  * Represents Xcode versions and allows parsing them.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigInfo.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigInfo.java
index c8ac555..b440c9f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigInfo.java
@@ -22,10 +22,10 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.XcodeConfigInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /**
  * The set of Apple versions computed from command line options and the {@code xcode_config} rule.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/BUILD b/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
index 40eac38..c03df96 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/BUILD
@@ -14,7 +14,6 @@
     name = "config",
     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:artifact_owner",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
@@ -56,6 +55,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",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java
index c8e1497..2f3b850 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java
@@ -38,9 +38,9 @@
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
 import com.google.devtools.build.lib.packages.AttributeMap;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.List;
 import java.util.Optional;
+import net.starlark.java.eval.Starlark;
 
 /**
  * The implementation of the config_feature_flag rule for defining custom flags for Android rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
index f088dfe..e820c51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
@@ -24,11 +24,11 @@
 import com.google.devtools.build.lib.packages.RequiredProviders;
 import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigFeatureFlagProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Provider for exporting value and valid value predicate of feature flags to consuming targets. */
 // TODO(adonovan): rename this to *Info and its constructor to *Provider.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
index 91533d2..457ce14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
@@ -23,16 +23,16 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigGlobalLibraryApi;
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
-import com.google.devtools.build.lib.syntax.Dict;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.HashSet;
 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.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Implementation of {@link ConfigGlobalLibraryApi}.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
index 847ee47..46249c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
@@ -15,9 +15,9 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
 import java.util.Arrays;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.syntax.Location;
 
 /**
  * A category of artifacts that are candidate input/output to an action, for which the toolchain can
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
index 49c2f3f..50cc994 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -32,7 +32,6 @@
     deps = [
         ":cpp_interface",
         ":denied_implicit_outputs_marker_provider",
-        "//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",
@@ -118,6 +117,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:crosstool_config_java_proto",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index f16ea74..178ae1d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -72,10 +72,6 @@
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
 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.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.Tuple;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -89,6 +85,10 @@
 import java.util.Set;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.Tuple;
 
 /**
  * A ConfiguredTarget for <code>cc_binary</code> rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 3b2c472..d0198f9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -58,8 +58,6 @@
 import com.google.devtools.build.lib.shell.ShellUtils;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -72,6 +70,8 @@
 import java.util.regex.PatternSyntaxException;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Common parts of the implementation of cc rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index c2cf2b3..a8fe47f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -39,7 +39,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationContextApi;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -55,6 +54,7 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkList;
 
 /**
  * Immutable store of information needed for C++ compilation that is aggregated across dependencies.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
index e7a2e75..16eb175 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
@@ -21,11 +21,11 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationOutputsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** A structured representation of the compilation outputs of a C++ rule. */
 public class CcCompilationOutputs implements CcCompilationOutputsApi<Artifact> {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
index 7442b0f..c802de3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
@@ -22,10 +22,10 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.Collection;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** Provider for C++ compilation and linking information. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index a5af8be..f0ac8dd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -52,7 +52,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
@@ -62,6 +61,7 @@
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A ConfiguredTarget for <code>cc_library</code> rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
index e76510c..2a8c200 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java
@@ -31,16 +31,16 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcLinkingContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LinkerInputApi;
-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.StarlarkSemantics;
 import com.google.devtools.build.lib.util.Fingerprint;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+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.StarlarkSemantics;
 
 /** Structure of CcLinkingContext. */
 public class CcLinkingContext implements CcLinkingContextApi<Artifact> {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index dd3acea..a41b395 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -41,12 +41,12 @@
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.rules.cpp.Link.Picness;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LinkingInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A class to create C/C++ link actions in a way that is consistent with cc_library. Rules that
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 487f1c0..a80ff57 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -61,15 +61,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.starlarkbuildapi.cpp.CcModuleApi;
-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.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.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.StringUtil;
@@ -81,6 +72,15 @@
 import java.util.Locale;
 import java.util.Set;
 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.NoneType;
+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 net.starlark.java.eval.Tuple;
 
 /** A module that contains Starlark utilities for C++ support. */
 public abstract class CcModule
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 855c65c..110fb5b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -26,9 +26,9 @@
 import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.Location;
 import java.io.Serializable;
 import java.util.HashMap;
+import net.starlark.java.syntax.Location;
 
 /**
  * Implementation for the cc_toolchain rule.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
index 32fc6d3..c5521d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CcToolchain.AdditionalBuildVariablesComputer;
-import com.google.devtools.build.lib.syntax.Location;
+import net.starlark.java.syntax.Location;
 
 /**
  * Provider encapsulating all the information from the cc_toolchain rule that affects creation of
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
index 7e8a4c1..d5bed42 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
@@ -34,11 +34,11 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.Expandable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcToolchainConfigInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.ToolPath;
+import net.starlark.java.eval.EvalException;
 
 /** Information describing C++ toolchain derived from CROSSTOOL file. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
index 63189d6..dfad3d6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
@@ -37,8 +37,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.StringValueParser;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.StringUtil;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -53,6 +51,8 @@
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Provides access to features supported by a specific toolchain.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index b332a30..62a23f8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -36,11 +36,11 @@
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcToolchainProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.syntax.Location;
 
 /** Information about a C++ compiler used by the <code>cc_*</code> rules. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index 3d4f253..61ab9d6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -38,8 +38,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.rules.cpp.CcToolchain.AdditionalBuildVariablesComputer;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.EnumSet;
@@ -47,6 +45,8 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** Helper responsible for creating CcToolchainProvider */
 public class CcToolchainProviderHelper {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
index ae7e477..7617111 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
@@ -32,8 +32,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcToolchainVariablesApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -43,6 +41,8 @@
 import java.util.Set;
 import java.util.Stack;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Configured build variables usable by the toolchain configuration.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java
index 4666a91..601541a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java
@@ -26,10 +26,10 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.VariablesExtension;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
 
 /** Enum covering all build variables we create for all various {@link CppCompileAction}. */
 public enum CompileBuildVariables {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
index 33a3cea..b7237ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -76,9 +76,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.skyframe.ActionExecutionValue;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.DependencySet;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -108,6 +105,9 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** Action that represents some kind of C++ compilation step. */
 @ThreadCompatible
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
index 9076f39..37f55a5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
@@ -34,12 +34,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.cpp.CcCompilationHelper.SourceCategory;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** An {@link ActionTemplate} that expands into {@link CppCompileAction}s at execution time. */
 public final class CppCompileActionTemplate extends ActionKeyCacher
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 2cff1bc..0f29222 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -67,8 +67,6 @@
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.shell.ShellUtils;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.Pair;
@@ -78,6 +76,8 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Helper class for functionality shared by cpp related rules.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
index 0359646..9f72386 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
@@ -59,9 +59,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.ShellEscaper;
@@ -70,6 +67,9 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** Action that represents a linking step. */
 @ThreadCompatible
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index 3a20665..30e4b1f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -48,7 +48,6 @@
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkerOrArchiver;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
@@ -61,6 +60,7 @@
 import java.util.Set;
 import java.util.regex.Matcher;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Builder class to construct {@link CppLinkAction}s. */
 public class CppLinkActionBuilder {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureConfigurationForStarlark.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureConfigurationForStarlark.java
index a41b6df..14d0367 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureConfigurationForStarlark.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureConfigurationForStarlark.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.FeatureConfigurationApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Wrapper for {@link FeatureConfiguration}, {@link CppConfiguration}, and {@link BuildOptions}.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
index e2b4f92..c6a296d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
@@ -37,10 +37,10 @@
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoContextInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoPackageInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-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.Tuple;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Tuple;
 
 /**
  * Fake stub implementations for C++-related Starlark API which are unsupported without use of
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index 986c462..d92f7c6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -24,11 +24,11 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LibraryToLinkApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /**
  * Encapsulates information for linking a library.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariables.java
index 68a67c4..88d45fe 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariables.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariables.java
@@ -21,8 +21,8 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.SequenceBuilder;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import net.starlark.java.eval.EvalException;
 
 /** Enum covering all build variables we create for all various {@link CppLinkAction}. */
 public enum LinkBuildVariables {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index 8fa8c30..1669890 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -50,7 +50,6 @@
         ":RpcSupport",
         ":java-compilation",
         ":java-implicit-attributes",
-        "//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:actions/custom_command_line",
@@ -96,6 +95,8 @@
         "//src/main/java/com/google/devtools/build/lib/util:os",
         "//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/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -167,7 +168,6 @@
         "proto/GeneratedExtensionRegistryProvider.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/actions:commandline_item",
@@ -225,6 +225,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/main/protobuf:deps_java_proto",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
index 81f0629..c1249cc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
@@ -24,16 +24,16 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /** Information about the system APIs for a Java compilation. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 7544ca0..c95201a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -52,7 +52,6 @@
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
 import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -60,6 +59,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import net.starlark.java.eval.EvalException;
 
 /** An implementation of java_binary. */
 public class JavaBinary implements RuleConfiguredTargetFactory {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
index ae6887c..3bf4412 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCcLinkParamsProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A target that provides C++ libraries to be linked into Java targets. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index a5a4df8..a1bbb00 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -69,9 +69,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.JavaCompile.Code;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.CommandLineArgsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.LazyString;
@@ -85,6 +82,9 @@
 import java.util.Map;
 import java.util.UUID;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** Action that represents a Java compilation. */
 @ThreadCompatible
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
index 6b32881..b6dac49 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
@@ -22,10 +22,10 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.shell.ShellUtils;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
 import java.util.List;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /** Utility methods for use by Java-related parts of Bazel. */
 // TODO(bazel-team): Merge with JavaUtil.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 59123e8..9d21f31 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -37,19 +37,19 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-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.syntax.StarlarkValue;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
+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 net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /** A Starlark declared provider that encapsulates all providers that are needed by Java rules. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 1af7f95..f837710 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -39,16 +39,16 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.shell.ShellUtils;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Implements logic for creating JavaInfo from different set of input parameters. */
 final class JavaInfoBuildHelper {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java
index 5b2c52b..61fa7c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaNativeLibraryInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A target that provides native libraries in the transitive closure of its deps that are needed for
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
index a5cf8a8..87679ed 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -26,11 +26,11 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaRuleOutputJarsProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.OutputJarApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.Collection;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
 
 /** Provides information about jar files produced by a Java rule. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeInfo.java
index 0af7741..22552e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeInfo.java
@@ -30,9 +30,9 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaRuntimeInfoApi;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /** Information about the Java runtime used by the <code>java_*</code> rules. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
index ea80528..6434491 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
@@ -26,10 +26,10 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCommonApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaToolchainStarlarkApiProviderApi;
-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.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A module that contains Starlark utilities for Java support. */
 public class JavaStarlarkCommon
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
index c9be452..a7e75ad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
@@ -34,11 +34,11 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaToolchainStarlarkApiProviderApi;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
 import java.util.Iterator;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.syntax.Location;
 
 /** Information about the JDK used by the <code>java_*</code> rules. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
index 6576bc9..df4ca74 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
@@ -24,16 +24,16 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /** Marks configured targets that are able to supply message bundles to their dependents. */
 @AutoCodec
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
index b356e73..2950dcd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.java.ProguardSpecProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A target that can provide proguard specifications to Android binaries. */
 @Immutable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
index 74f923b..b1de0eb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.java.GeneratedExtensionRegistryProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A {@link com.google.devtools.build.lib.analysis.TransitiveInfoProvider} for {@link Artifact}s
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoStarlarkCommon.java
index e3764e9..2b556b7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoStarlarkCommon.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.rules.proto.ProtoInfo;
 import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaProtoCommonApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** A class that exposes Java common methods for proto compilation. */
 public class JavaProtoStarlarkCommon
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
index b6fee9f..3530893 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStarlarkCommon.java
@@ -43,16 +43,16 @@
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
 import com.google.devtools.build.lib.starlarkbuildapi.SplitTransitionProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleCommonApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-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.StarlarkValue;
 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.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.syntax.Location;
 
 /** A class that exposes apple rule implementation internals to Starlark. */
 public class AppleStarlarkCommon
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryInfo.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryInfo.java
index 19b9023..3e69875 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryInfo.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleStaticLibraryInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provider containing information regarding multi-architecture Apple static libraries, as is
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
index d12c157..7313f0f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
@@ -14,7 +14,6 @@
     name = "objc",
     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:artifacts",
         "//src/main/java/com/google/devtools/build/lib/analysis:actions/custom_command_line",
@@ -69,6 +68,8 @@
         "//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/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
index 8f78c22..0a9ecd7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
@@ -45,11 +45,11 @@
 import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.PlatformRule;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.SplitTransitionProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * {@link TransitionFactory} implementation for multi-architecture apple rules which can accept
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index f377b1d..beb1c64 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -56,12 +56,12 @@
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Contains information common to multiple objc_* rules, and provides a unified API for extracting
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 8172c21..3268de5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -41,17 +41,17 @@
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ObjcProviderApi;
-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.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 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 net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * A provider that provides all compiling and linking information in the transitive closure of its
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderStarlarkConverters.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderStarlarkConverters.java
index 04560e8..986d8d3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderStarlarkConverters.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderStarlarkConverters.java
@@ -22,9 +22,9 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** A utility class for converting ObjcProvider values between java and Starlark representation. */
 public class ObjcProviderStarlarkConverters {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD b/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
index 3d1fcac..db13c34 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
@@ -49,13 +49,13 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//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/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
index d47ac2e..9c3691b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
@@ -32,12 +32,12 @@
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.Location;
 
 /**
  * Utility functions for proto_library and proto aspect implementations.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
index 112e98c..243df22 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
@@ -24,9 +24,9 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.starlarkbuildapi.ProtoInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.proto.ProtoBootstrap;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.Pair;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * Configured target classes that implement this class can contribute .proto files to the
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/BUILD b/src/main/java/com/google/devtools/build/lib/rules/python/BUILD
index f61630d..63b821d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/BUILD
@@ -45,14 +45,14 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python",
-        "//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:filetype",
         "//src/main/java/com/google/devtools/build/lib/util:os",
         "//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/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",
         "//third_party:error_prone_annotations",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
index 4f779cf..c9da2de 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.python;
 
-import static com.google.devtools.build.lib.syntax.Starlark.NONE;
+import static net.starlark.java.eval.Starlark.NONE;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -50,8 +50,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
 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.Starlark;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -62,6 +60,8 @@
 import java.util.Map;
 import java.util.UUID;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** A helper class for analyzing a Python configured target. */
 public final class PyCommon {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
index d56959c..e1824ab 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
@@ -24,12 +24,12 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Instance of the provider type for the Python rules. */
 public final class PyInfo implements Info, PyInfoApi<Artifact> {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
index 4947a2e..7325ed2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
@@ -23,9 +23,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.FileType;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Static helper class for creating and accessing Python provider information.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
index bb8f264..1e816e3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.rules.python;
 
-import static com.google.devtools.build.lib.syntax.Starlark.NONE;
+import static net.starlark.java.eval.Starlark.NONE;
 
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -25,13 +25,13 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyRuntimeInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * Instance of the provider type that describes Python runtimes.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyStarlarkTransitions.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyStarlarkTransitions.java
index 622d3e0..eb7ac6d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyStarlarkTransitions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyStarlarkTransitions.java
@@ -21,8 +21,8 @@
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.packages.AttributeTransitionData;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyStarlarkTransitionsApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Exposes a native transition to Starlark for changing the Python version.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyStructUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyStructUtils.java
index c2dc8ee..48d972f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyStructUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyStructUtils.java
@@ -23,8 +23,8 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 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.syntax.Starlark;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /** Static helper class for creating and accessing instances of the legacy "py" struct provider. */
 // TODO(b/153363654): Remove this file.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
index 5d6899f..61661f2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
@@ -18,11 +18,11 @@
 import com.google.common.base.Verify;
 import com.google.devtools.build.lib.analysis.config.Fragment;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.common.options.TriState;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * The configuration fragment containing information about the various pieces of infrastructure
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
index e4714b8..cbc5779 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
@@ -20,7 +20,6 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.events.ExtendedEventHandler.ResolvedEvent;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -30,6 +29,7 @@
 import java.io.IOException;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Access a repository on the local filesystem.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
index 8b326f4..6d1403b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.events.ExtendedEventHandler.ResolvedEvent;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.skyframe.DirectoryListingValue;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -36,6 +35,7 @@
 import com.google.devtools.build.skyframe.SkyValue;
 import java.io.IOException;
 import java.util.Map;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Create a repository from a directory on the local filesystem.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
index 1576e23..c63f322 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue;
-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.vfs.Root;
@@ -33,6 +32,7 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import java.io.IOException;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Encapsulates the 2-step behavior of creating workspace and build files for the new_*_repository
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index beb0553..55e658e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -39,8 +39,6 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -57,6 +55,8 @@
 import java.util.Map;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Implementation of fetching various external repository types.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
index c71948f..553eb41 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
@@ -23,16 +23,6 @@
 import com.google.devtools.build.lib.packages.NoSuchThingException;
 import com.google.devtools.build.lib.rules.repository.ResolvedFileValue.ResolvedFileKey;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
-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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -42,6 +32,16 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+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.ParserInput;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.SyntaxError;
 
 /** Function computing the Starlark value of 'resolved' in a file. */
 public class ResolvedFileFunction implements SkyFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java
index c63cc84..95ddff2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceAttributeMapper.java
@@ -21,9 +21,9 @@
 import com.google.devtools.build.lib.packages.BuildType.SelectorList;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Type;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
 
 /**
  * An attribute mapper for workspace rules. Similar to NonconfigurableAttributeWrapper, but throws
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/StarlarkTestingModule.java b/src/main/java/com/google/devtools/build/lib/rules/test/StarlarkTestingModule.java
index 28ff317..08f938c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/StarlarkTestingModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/StarlarkTestingModule.java
@@ -16,8 +16,8 @@
 import com.google.devtools.build.lib.analysis.test.ExecutionInfo;
 import com.google.devtools.build.lib.analysis.test.TestEnvironmentInfo;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestingModuleApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** A class that exposes testing infrastructure to Starlark. */
 public class StarlarkTestingModule implements TestingModuleApi {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index c43f2b7..45612d8 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -48,7 +48,6 @@
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
-import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.AnsiStrippingOutputStream;
 import com.google.devtools.build.lib.util.DebugLoggerConfigurator;
@@ -73,6 +72,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.logging.Level;
+import net.starlark.java.eval.Starlark;
 
 /**
  * Dispatches to the Blaze commands; that is, given a command line, this abstraction looks up the
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 539e0a2..15c8148 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -81,7 +81,6 @@
 import com.google.devtools.build.lib.shell.JavaSubprocessFactory;
 import com.google.devtools.build.lib.shell.SubprocessBuilder;
 import com.google.devtools.build.lib.shell.SubprocessFactory;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
 import com.google.devtools.build.lib.util.CustomExitCodePublisher;
@@ -139,6 +138,7 @@
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * The BlazeRuntime class encapsulates the immutable configuration of the current instance. These
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/LocationPrinter.java b/src/main/java/com/google/devtools/build/lib/runtime/LocationPrinter.java
index d6e2bfe..94acb32 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/LocationPrinter.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/LocationPrinter.java
@@ -16,11 +16,11 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 class LocationPrinter {
   private final boolean attemptToPrintRelativePaths;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/UiEventHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/UiEventHandler.java
index ee0ca7c..5f3f4b0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/UiEventHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/UiEventHandler.java
@@ -45,7 +45,6 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.ConfigurationPhaseStartedEvent;
 import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.util.io.AnsiTerminal;
 import com.google.devtools.build.lib.util.io.AnsiTerminal.Color;
 import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
@@ -69,6 +68,7 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Supplier;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /** An experimental new output stream. */
 public class UiEventHandler implements EventHandler {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BUILD b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BUILD
index dbc6246..f88e38f 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/BUILD
@@ -20,13 +20,13 @@
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/util:debug-logger-configurator",
         "//src/main/java/com/google/devtools/build/lib/util:process",
         "//src/main/java/com/google/devtools/build/lib/util:string",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
         "//src/main/protobuf:build_java_proto",
         "//third_party:flogger",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
index 6a7aea7..7fb3456 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/info/StarlarkSemanticsInfoItem.java
@@ -20,8 +20,8 @@
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.InfoItem;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.OptionsParsingResult;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * Info item for the effective current set of Starlark semantics option values.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index b378532..8882681 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -20,12 +20,6 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Resolver;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-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.lib.vfs.RootedPath;
@@ -37,6 +31,12 @@
 import java.io.IOException;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.Resolver;
+import net.starlark.java.syntax.StarlarkFile;
 
 /**
  * A Skyframe function that reads, parses, and resolves the .bzl file denoted by a Label.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java
index 440a198..842b953 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java
@@ -20,7 +20,6 @@
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.skyframe.NotComparableSkyValue;
 import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -28,6 +27,7 @@
 import com.google.errorprone.annotations.FormatMethod;
 import java.util.Objects;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.StarlarkFile;
 
 // TODO(adonovan): Ensure the result is always resolved and update the docstring.
 /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index 3f6f62a..c053b8c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -78,7 +78,6 @@
 import com.google.devtools.build.lib.skyframe.ArtifactFunction.MissingFileArtifactValue;
 import com.google.devtools.build.lib.skyframe.ArtifactNestedSetFunction.ArtifactNestedSetEvalException;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionPostprocessing;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.io.FileOutErr;
@@ -107,6 +106,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.IntFunction;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * A {@link SkyFunction} that creates {@link ActionExecutionValue}s. There are four points where
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 47da2a4..0e8ad98 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -293,8 +293,6 @@
         "//src/main/java/com/google/devtools/build/lib/rules/cpp:cpp_interface",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/skyframe/trimming:trimmed_configuration_cache",
-        "//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",
         "//src/main/java/com/google/devtools/build/lib/util:TestType",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
@@ -309,6 +307,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/main/protobuf:analysis_java_proto",
         "//src/main/protobuf:analysis_v2_java_proto",
         "//src/main/protobuf:failure_details_java_proto",
@@ -883,10 +883,10 @@
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//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/vfs",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:error_prone_annotations",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -1743,11 +1743,11 @@
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
         "//src/main/java/com/google/devtools/build/lib/repository:external_package_helper",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -1876,9 +1876,9 @@
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
         "//src/main/java/com/google/devtools/build/lib/remote/options",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
@@ -2347,9 +2347,9 @@
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/eval",
         "//third_party:guava",
     ],
 )
@@ -2730,9 +2730,9 @@
         ":sky_functions",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
-        "//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/skyframe:skyframe-objects",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
index abe9f8a..d6e3320 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
@@ -43,16 +43,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.skyframe.ASTFileLookupFunction.ASTLookupFailedException;
 import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.LoadStatement;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-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.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -70,6 +60,16 @@
 import java.util.Map;
 import java.util.function.Consumer;
 import javax.annotation.Nullable;
+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.LoadStatement;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.Statement;
 
 /**
  * A Skyframe function to look up and load a single .bzl module.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadValue.java
index 37b30c8..b8732a2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadValue.java
@@ -20,13 +20,13 @@
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.Module;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.util.Objects;
+import net.starlark.java.eval.Module;
 
 /**
  * A value that represents the .bzl module loaded by a Starlark {@code load()} statement.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index e337aa5..4b93f82 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -80,7 +80,6 @@
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor.BuildViewProvider;
-import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -100,6 +99,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /**
  * SkyFunction for {@link ConfiguredTargetValue}s.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index f92fb2d..12829ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -61,13 +61,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
 import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
 import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
-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.ParserInput;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.util.Pair;
@@ -98,6 +91,13 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.Location;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
 
 /** A SkyFunction for {@link PackageValue}s. */
 public class PackageFunction implements SkyFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index 183ea8a..020aae3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -30,8 +30,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.repository.ExternalPackageHelper;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -43,6 +41,8 @@
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * SkyFunction for {@link PackageLookupValue}s.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingFunction.java
index 2799fcc..58e3d42 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformMappingFunction.java
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration;
 import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
@@ -44,6 +43,7 @@
 import java.util.Map;
 import java.util.Optional;
 import javax.annotation.Nullable;
+import net.starlark.java.syntax.Location;
 
 /**
  * Function that reads the contents of a mapping file specified in {@code --platform_mappings} and
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index dc1419b..b03a8f7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.remote.options.RemoteOutputsMode;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.skyframe.AbstractSkyKey;
 import com.google.devtools.build.skyframe.Injectable;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -32,6 +31,7 @@
 import java.util.Map;
 import java.util.UUID;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
 
 /**
  * A value that represents something computed outside of the skyframe framework. These values are
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index ec30b71..61038e1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -159,8 +159,6 @@
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
 import com.google.devtools.build.lib.skyframe.trimming.TrimmedConfigurationCache;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -226,6 +224,8 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.StarlarkFile;
 
 /**
  * A helper object to support Skyframe-driven execution.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
index ce86d3b..2568eff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
@@ -30,13 +30,13 @@
 import com.google.devtools.build.lib.packages.StarlarkDefinedAspect;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
-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.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 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.Starlark;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A factory for aspects that are defined in Starlark. */
 public class StarlarkAspectFactory implements ConfiguredAspectFactory {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
index af12f35..4031514 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java
@@ -20,10 +20,6 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.PackageFactory.InjectionException;
 import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException;
-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.Starlark;
 import com.google.devtools.build.skyframe.RecordingSkyFunctionEnvironment;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -31,6 +27,10 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 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.Starlark;
 
 // TODO(#11437): Teach ASTFileLookup about builtins keys, then have them modify their env the same
 // way as BzlLoadFunction. This will   allow us to define the _internal symbol for @builtins.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
index fc045e4..4981746 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
@@ -28,13 +28,6 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.rules.repository.ResolvedFileValue;
-import com.google.devtools.build.lib.syntax.FileOptions;
-import com.google.devtools.build.lib.syntax.LoadStatement;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -48,6 +41,13 @@
 import java.util.Map;
 import java.util.Optional;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.LoadStatement;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.Statement;
 
 /** A SkyFunction to parse WORKSPACE files into a StarlarkFile. */
 public class WorkspaceASTFunction implements SkyFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java
index 6397c79..2b99196 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java
@@ -18,12 +18,12 @@
 import com.google.common.collect.Interner;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.AbstractSkyKey;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.util.List;
+import net.starlark.java.syntax.StarlarkFile;
 
 /**
  * A SkyValue that stores the parsed WORKSPACE file as a list of AST. Each AST contains the part
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 5622827..3922667 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -28,10 +28,6 @@
 import com.google.devtools.build.lib.packages.WorkspaceFactory;
 import com.google.devtools.build.lib.packages.WorkspaceFileValue;
 import com.google.devtools.build.lib.packages.WorkspaceFileValue.WorkspaceFileKey;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -39,6 +35,10 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.io.IOException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.StarlarkFile;
 
 /** A SkyFunction to parse the WORKSPACE file at a given path. */
 public class WorkspaceFileFunction implements SkyFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index ac00dc7..55ccad7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -79,8 +79,6 @@
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceNameFunction;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-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.PathFragment;
@@ -115,6 +113,8 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.syntax.StarlarkFile;
 
 /**
  * Abstract base class of a {@link PackageLoader} implementation that has no incrementality or
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
index a868913..a8b6824 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
@@ -28,7 +28,6 @@
     srcs = ["AbstractPackageLoader.java"],
     deps = [
         ":PackageLoader",
-        "//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",
@@ -60,6 +59,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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/BUILD
index 94a1ad5..d856710 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/BUILD
@@ -22,11 +22,12 @@
         "//src/test/java/com/google/devtools/build/lib/vfs/util",  # For FileSystem modules
     ],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//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/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:flogger",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
index 54221dc..7403beb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
@@ -24,14 +24,14 @@
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Mutability;
 
 /** Helpers for serialization tests. */
 public class TestUtils {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ActionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ActionApi.java
index 8b40d54..2c04544 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ActionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ActionApi.java
@@ -16,15 +16,15 @@
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.io.IOException;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for actions in Starlark. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BUILD
index 4087238..fcf8414 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BUILD
@@ -41,7 +41,8 @@
     deps = [
         "//third_party:guava",
         "//src/main/java/net/starlark/java/annot",
-        "//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/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         # TODO(cparsons): Remove dependency on Label implementation.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BuildConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BuildConfigurationApi.java
index 7923d1f..0b58466 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BuildConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/BuildConfigurationApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a configuration object which holds information about the build environment. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
index 263f2e6..f6fb50b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
@@ -15,16 +15,16 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Command line args module. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
index 2e3e808..b02030a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
@@ -17,13 +17,13 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A provider that gives general information about a target's direct and transitive files. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
index b78398e..3bcdfbe 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A class that can be used to expand directories at execution time. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ExecGroupApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ExecGroupApi.java
index 36dd936..0366c93 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ExecGroupApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ExecGroupApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A unit of toolchain resolution. Every rule has one or more of these. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileApi.java
index 92866b6..5e494f5 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The interface for files in Starlark. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileProviderApi.java
index 9e47955..781f90e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileProviderApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A representation of the concept "this builds these files". */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileRootApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileRootApi.java
index a85ff78..f836d7f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileRootApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FileRootApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A root for a file. The roots are the directories containing files, and they are mapped together
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesToRunProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesToRunProviderApi.java
index 956450b..559c64e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesToRunProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesToRunProviderApi.java
@@ -14,11 +14,11 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Returns information about executables produced by a target and the files needed to run it. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesetEntryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesetEntryApi.java
index 72e9dc7..207d564 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesetEntryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesetEntryApi.java
@@ -14,8 +14,8 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A value object used to represent an entry inside a "Fileset" BUILD rule. */
 @StarlarkBuiltin(name = "FilesetEntry", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
index c3bbcb8..72c2968 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.ClassObject;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Represents a collection of configuration fragments in Starlark. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LateBoundDefaultApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LateBoundDefaultApi.java
index 9d49286..38d42f7 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LateBoundDefaultApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LateBoundDefaultApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The interface for late bound defaults in Starlark. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LicenseApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LicenseApi.java
index fea2954..287fbe3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LicenseApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/LicenseApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The interface for a license in Starlark. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
index 91ebf79..3cc0f04 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
@@ -16,13 +16,13 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** Interface for an info object that indicates what output groups a rule has. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ProtoConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ProtoConfigurationApi.java
index 6549277..b88cd92 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ProtoConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/ProtoConfigurationApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A configuration fragment representing protocol buffers. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
index 15479cf9..fa35845 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** An interface for a set of runfiles. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SplitTransitionProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SplitTransitionProviderApi.java
index ba722a0..50a7bea 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SplitTransitionProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SplitTransitionProviderApi.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a type representing a split configuration transition. */
 public interface SplitTransitionProviderApi extends StarlarkValue {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
index bc27d9d..2694b95 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
@@ -16,16 +16,16 @@
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Module providing functions to create actions. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAspectApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAspectApi.java
index e1b9848..8d5667b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAspectApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAspectApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The interface for Starlark-defined aspects in the Build API. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
index 2f95d56..e28837e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
@@ -16,17 +16,17 @@
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * The "attr" module of the Build API.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttributesCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttributesCollectionApi.java
index 456eaad..b7f61d5 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttributesCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttributesCollectionApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a type containing information about the attributes of a rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
index 5dc6b93..66fb472 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
@@ -14,11 +14,11 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 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.StarlarkThread;
 
 /** A collection of global Starlark build API functions that belong in the global namespace. */
 @StarlarkGlobalLibrary
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
index c9d2daf..9e14edd 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
@@ -15,13 +15,13 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDeprecated;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a module associated with creating efficient command lines. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
index 2dd9820..67b901e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * The "config" module of the Build API.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
index 0c62ff4..e7995b8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
@@ -14,16 +14,16 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a module with native rule and package helper functions. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
index aabec03..7963a17 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
@@ -24,19 +24,19 @@
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ExecGroupCollectionApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainContextApi;
-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.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
 
 /** Interface for a context object given to rule implementation functions. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
index 9f5de36..98c919cf 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
@@ -18,18 +18,18 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi.BuildSettingApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 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.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Interface for a global Starlark library containing rule-related helper and registration
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SymlinkEntryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SymlinkEntryApi.java
index 22f8ec0..07f770e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SymlinkEntryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/SymlinkEntryApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a single runfiles symlink represented by a link name and target. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TargetApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TargetApi.java
index a9fa8fa..ab6e2a2 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TargetApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TargetApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.cmdline.Label;
-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;
 
 /** A node in the build dependency graph, identified by a Label. */
 @StarlarkBuiltin(name = "target", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
index 8be5fbf..6af8770 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
@@ -17,13 +17,13 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Provides access to make variables from the current fragments. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TopLevelBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TopLevelBootstrap.java
index 142344a..42070ee 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TopLevelBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TopLevelBootstrap.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.OutputGroupInfoApi.OutputGroupInfoApiProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A {@link Bootstrap} for top-level libraries of the build API.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
index 63fcb4c..8168c4c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
@@ -16,14 +16,14 @@
 package com.google.devtools.build.lib.starlarkbuildapi;
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A collection of global Starlark build API functions that apply to WORKSPACE files. */
 @StarlarkGlobalLibrary
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
index d033994..336e23b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
@@ -16,11 +16,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Supplies a resource apk file (".ap_") and related info. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
index bb38010..6a7b4ab 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
@@ -19,13 +19,13 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Provides information about transitive Android assets. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
index 76b3866..8b7d480 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
@@ -16,12 +16,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provides information on Android resource, asset, and manifest information specific to binaries.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataSettingsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataSettingsApi.java
index da2f124..a9f38f3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataSettingsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataSettingsApi.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Wraps common settings for working with android binary assets, resources, and manifests. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
index e0f3298..5090891 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
@@ -23,8 +23,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidResourcesInfoApi.AndroidResourcesInfoApiProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ApkInfoApi.ApkInfoApiProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
-import com.google.devtools.build.lib.syntax.FlagGuardedValue;
 import java.util.Map;
+import net.starlark.java.eval.FlagGuardedValue;
 
 /** {@link Bootstrap} for Starlark objects related to Android rules. */
 public class AndroidBootstrap implements Bootstrap {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
index b0ffb8e..aa0436e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
@@ -18,12 +18,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A target that provides C++ libraries to be linked into Android targets. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidConfigurationApi.java
index a30048d..06bf18c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidConfigurationApi.java
@@ -14,10 +14,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
 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.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Configuration fragment for Android rules. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataContextApi.java
index 665fb2e..26535be 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataContextApi.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Wraps common tools and settings used for working with Android assets, resources, and manifests.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
index faabbeb..4e0e963 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
@@ -19,14 +19,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Starlark-visible methods for working with Android data (manifests, resources, and assets). */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
index 27b7c8d..2f1c464 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
@@ -15,11 +15,11 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Supplies the device broker type string, passed to the Android test runtime. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
index 595caf4..05d370f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
@@ -17,11 +17,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FilesToRunProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.NoneType;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.NoneType;
 
 /**
  * Supplies the pregenerate_oat_files_for_tests attribute of type boolean provided by android_device
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
index d3a2481..8eef428 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
@@ -17,13 +17,13 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
index 9bf5d30..e667b64 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
@@ -20,14 +20,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.OutputJarApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * Configured targets implementing this provider can contribute Android-specific info to IDE to the
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
index e2134a5..b2ad3ad 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Configured targets implementing this provider can contribute Android IDL information to the
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
index 9c76e3f..46aebd8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
@@ -15,12 +15,12 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /**
  * A provider for targets that create Android instrumentations. Consumed by Android testing rules.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
index 930478f..ab43927 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
@@ -17,13 +17,13 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** A target that can provide the aar artifact of Android libraries */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
index 0b03f66..32ea703 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Provides resource class jars from android_library rules. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestApi.java
index 9a648b0..d55d25d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestApi.java
@@ -13,9 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Wraps an Android Manifest and provides utilities for working with it */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
index 8139408..14dc173 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
@@ -16,11 +16,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A provider of information about this target's manifest. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
index 9f51ea0..27f0738 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
@@ -17,11 +17,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Provider of transitively available ZIPs of native libs that should be directly copied into the
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
index a9f9990..49adc3c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A provider of the final Jar to be dexed for targets that build APKs. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
index 960c260..c377a2e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** A target that can provide local proguard specifications. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
index c89b847..737ce1b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
@@ -18,12 +18,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A provider that supplies resource information from its transitive closure. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
index 8207fce..b4fc5a2 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
@@ -18,13 +18,13 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Configured targets implementing this provider can contribute Android Sdk information to the
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSplitTransititionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSplitTransititionApi.java
index 2801b3d..69d496b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSplitTransititionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSplitTransititionApi.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Android configuration for properly handling native dependencies */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkApiProviderApi.java
index 8bf2c66..227ddf3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkApiProviderApi.java
@@ -18,11 +18,11 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.OutputJarApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A class that exposes the Android providers to Starlark. It is intended to provide a simple and
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
index 161aaf8..e6fa3de 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
@@ -16,10 +16,10 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Common utilities for Starlark rules related to Android. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ApkInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ApkInfoApi.java
index 8aa51bb..9b73771 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ApkInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ApkInfoApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** A provider for targets that produce an apk file. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BUILD
index 14778ea..a46c0e6 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BUILD
@@ -20,7 +20,6 @@
     name = "android",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
@@ -29,6 +28,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java",
         "//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:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
index ac05188..482d39e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -18,14 +18,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * An interface for a provider that exposes the use of <a
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ParsedAndroidAssetsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ParsedAndroidAssetsApi.java
index 5c649f3..3a6c682 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ParsedAndroidAssetsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ParsedAndroidAssetsApi.java
@@ -13,9 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.android;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Parsed Android assets which can be merged together with assets from dependencies. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
index 15ba487..1eb2224 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
@@ -16,12 +16,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A target that can provide a proguard obfuscation mapping to Android binaries or tests. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
index 74bc9d4..8acf0f9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * An interface for a provider that exposes the use of <a
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ValidatedAndroidDataApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ValidatedAndroidDataApi.java
index 2edfce5..3911e4b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ValidatedAndroidDataApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ValidatedAndroidDataApi.java
@@ -15,12 +15,12 @@
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Validated Android data which can be merged together with assets from dependencies. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleBitcodeModeApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleBitcodeModeApi.java
index 52bcc47..97c7409 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleBitcodeModeApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleBitcodeModeApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Interface for an enum describing the bitcode mode to use when compiling Objective-C and Swift
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
index d485801..df5417d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
@@ -24,14 +24,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a module with useful functions for creating apple-related rule implementations. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
index c07bc1f..fbaf900 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
@@ -14,12 +14,12 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDeprecated;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** An interface for a configuration type containing info for Apple platforms and tools. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformApi.java
index 19792e4..5b5f5f0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** An interface for an object representing an Apple platform. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformTypeApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformTypeApi.java
index f7ef612..6ce8302 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformTypeApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ApplePlatformTypeApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a descriptor for an Apple platform type, such as such as iOS or macOS. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
index 843b4e3..e096c3f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /**
  * Interface for an info type containing information regarding multi-architecture Apple static
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
index be70c7b..c60aba5 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a utility module involving the Apple toolchain. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/BUILD
index 327f8b0..1f6687c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/BUILD
@@ -27,7 +27,8 @@
         "//src/main/java/net/starlark/java/annot",
         # TODO(b/80307387): Remove dependency on Depset.
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
-        "//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/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
index 1ce8cbe..124f05b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
@@ -14,11 +14,11 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Interface for a value representing a version with multiple components, separated by periods, such
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/J2ObjcConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/J2ObjcConfigurationApi.java
index 60cbc24..0a1865c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/J2ObjcConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/J2ObjcConfigurationApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
 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.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A configuration fragment for j2objc. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
index ad6b1c7..a4929e2 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A configuration fragment for Objective C. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcProviderApi.java
index bc81269..f6740bf 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcProviderApi.java
@@ -18,11 +18,11 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationContextApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * An interface for an info type that provides all compiling and linking information in the
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/SwiftConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/SwiftConfigurationApi.java
index 51825ef..b4d5c75 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/SwiftConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/SwiftConfigurationApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.apple;
 
 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.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A configuration fragment for Swift tools. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
index 6aed023..5c1c330 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
@@ -16,13 +16,13 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /**
  * An interface for an info type containing the set of Apple versions computed from command line
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/BUILD
index dc234fc..7f63b48 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/BUILD
@@ -20,10 +20,11 @@
     name = "config",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigBootstrap.java
index fcc804a..e60c408 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigBootstrap.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A {@link Bootstrap} for config-related libraries of the build API.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
index 0fa54fb..93fcc37 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
@@ -14,15 +14,15 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.config;
 
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 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.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
 
 /** A collection of top-level Starlark functions pertaining to configuration. */
 @StarlarkGlobalLibrary
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigStarlarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigStarlarkCommonApi.java
index 1817613..b0ad1e5 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigStarlarkCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigStarlarkCommonApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi.config;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-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;
 
 /** Helper utility containing functions regarding configurations.ss */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigurationTransitionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigurationTransitionApi.java
index ab20127..36b38de 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigurationTransitionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigurationTransitionApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.config;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Represents a configuration transition across a dependency edge. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/BUILD
index 574e52c..1ed8449 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/BUILD
@@ -24,8 +24,9 @@
     name = "core",
     srcs = glob(["*.java"]),
     deps = [
-        "//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",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/ProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/ProviderApi.java
index b79e638..9e5bec0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/ProviderApi.java
@@ -13,9 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.core;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for provider objects (constructors for {@link StructApi} objects). */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
index 943a766..40ba2bc 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
@@ -14,15 +14,15 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.core;
 
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for the "struct" object in the build API. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java
index 2445636..c4b8400 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/TransitiveInfoCollectionApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.core;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a build target. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BUILD
index 883566e..129d072 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BUILD
@@ -20,7 +20,6 @@
     name = "cpp",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
@@ -29,6 +28,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//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:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index f18321f..bf16581 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -19,15 +19,15 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkActionFactoryApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
 
 /** Utilites related to C++ support. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
index df8b252..81a332b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcBootstrap.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import net.starlark.java.eval.FlagGuardedValue;
 
 /** {@link Bootstrap} for Starlark objects related to cpp rules. */
 public class CcBootstrap implements Bootstrap {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationContextApi.java
index 8f38781..0fee722 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationContextApi.java
@@ -16,11 +16,11 @@
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Interface for a store of information needed for C++ compilation aggregated across dependencies.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java
index 3ccb3e3..6fd33da 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a structured representation of the compilation outputs of a C++ rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
index 8e6f7cc..5638629 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
@@ -17,14 +17,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 
 /** Wrapper for every C++ compilation and linking provider. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingContextApi.java
index cd01171..ea1db27 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingContextApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Wrapper for every C++ linking provider. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingOutputsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingOutputsApi.java
index fae10d8..05b03e0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcLinkingOutputsApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a structured representation of the linking outputs of a C++ rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
index ddf10db..9cd50a8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
@@ -22,17 +22,17 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-import com.google.devtools.build.lib.syntax.Tuple;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Tuple;
 
 /** Utilites related to C++ support. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcStarlarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcStarlarkApiProviderApi.java
index 9bacc71..2e842f6 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcStarlarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcStarlarkApiProviderApi.java
@@ -17,10 +17,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Object with information about C++ rules. Every C++-related target should provide this. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
index ab2333f..4684e35 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Information about the C++ toolchain. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainVariablesApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainVariablesApi.java
index ff7c786..05ccff8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainVariablesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainVariablesApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Type encapsulating build variables. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CompilationInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CompilationInfoApi.java
index 5f6fc2a..4c82da0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CompilationInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CompilationInfoApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Interface for a helper class containing CC compilation providers. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
index f2b8a1d..3e179a6 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
@@ -16,11 +16,11 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The C++ configuration fragment. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/FeatureConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/FeatureConfigurationApi.java
index b165dd9..25a3bab 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/FeatureConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/FeatureConfigurationApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Class used to construct command lines from CROSSTOOL features. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
index f703f67..2917dd3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A target that provides C++ libraries to be linked into Go targets. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
index aa86c22..1845b9b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
@@ -23,15 +23,15 @@
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoContextInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoPackageInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Tuple;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Tuple;
 
 /**
  * Helper class for the C++ functionality needed from Starlark specifically to implement go_wrap_cc.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LibraryToLinkApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LibraryToLinkApi.java
index 956a0da..5ae3b39 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LibraryToLinkApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LibraryToLinkApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A library the user can link to. This is different from a simple linker input in that it also has
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkerInputApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkerInputApi.java
index cdb95bf..d294d18 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkerInputApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkerInputApi.java
@@ -16,13 +16,13 @@
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Either libraries, flags or other files that may be passed to the linker as inputs. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkingInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkingInfoApi.java
index 322dd17..2909167 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkingInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/LinkingInfoApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Helper object containing CC linking info objects. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
index 63330ed..a5425c1 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
@@ -19,12 +19,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.RunfilesApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /**
  * Helper class for the C++ aspects of {py,java,go}_wrap_cc. Provides methods to create the swig and
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
index c416dca..fe854e8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
@@ -19,14 +19,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FilesToRunProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Helper class for the C++ aspects of {py,java,go}_wrap_cc. Provides methods to create the swig and
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/BUILD
index f377a19..8d12eec 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/BUILD
@@ -20,8 +20,9 @@
     name = "go",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/GoConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/GoConfigurationApi.java
index 26a08cf..65ad88e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/GoConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go/GoConfigurationApi.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.go;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A configuration fragment for Go. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/BUILD
index 93c72f4..f6228fc 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/BUILD
@@ -20,7 +20,6 @@
     name = "java",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
@@ -29,6 +28,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//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:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
index 9c9c99d..64afe59 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
@@ -18,12 +18,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Provides information about generated proto extensions. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaAnnotationProcessingApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaAnnotationProcessingApi.java
index e32733c..249f714 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaAnnotationProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaAnnotationProcessingApi.java
@@ -17,11 +17,11 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Interface for an info object containing information about jars that are a result of annotation
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaBootstrap.java
index d6a05aa..41c518c4 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaBootstrap.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi.JavaInfoProviderApi;
-import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import net.starlark.java.eval.FlagGuardedValue;
 
 /** {@link Bootstrap} for Starlark objects related to the java language. */
 public class JavaBootstrap implements Bootstrap {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
index 873d28c..7b27939 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
@@ -18,13 +18,13 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A target that provides C++ libraries to be linked into Java targets. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
index bb939a9..c139273 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
@@ -23,14 +23,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Utilities for Java compilation support in Starlark. */
 @StarlarkBuiltin(name = "java_common", doc = "Utilities for Java compilation support in Starlark.")
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
index 218bc8f..82b44a7 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCompilationInfoProviderApi.java
@@ -17,10 +17,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Info object for compilation information for java rules. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java
index 1804349..2aa6546 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java
@@ -16,10 +16,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A java compiler configuration. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
index ce7a4cd..3dcf336 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
@@ -18,14 +18,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Info object encapsulating all information by java rules. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
index 486ec58..279a8e5 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
@@ -20,12 +20,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LibraryToLinkApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** A target that provides C++ {@link LibraryToLinkApi}s to be linked into Java targets. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
index 8b7f08a..0ac1f5f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
@@ -18,11 +18,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Helper class for Java proto compilation. */
 @StarlarkBuiltin(name = "java_proto_common", doc = "Helper class for Java proto compilation.")
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuleOutputJarsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
index 55ca2e3..ac7c18a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
@@ -16,10 +16,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Info object about outputs of a Java rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuntimeClasspathProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
index 90d65fa6..20c1dcc 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi.java;
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
-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;
 
 /** Provider for the runtime classpath contributions of a Java binary. */
 @StarlarkBuiltin(name = "JavaRuntimeClasspathProvider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaStarlarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaStarlarkApiProviderApi.java
index e1eeff3..21811da 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaStarlarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaStarlarkApiProviderApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.java;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDeprecated;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Provides access to information about Java rules. Every Java-related target provides this struct,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaToolchainStarlarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaToolchainStarlarkApiProviderApi.java
index 161785c..dbba910 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaToolchainStarlarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaToolchainStarlarkApiProviderApi.java
@@ -17,10 +17,10 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ToolchainInfoApi;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
 
 /**
  * Provides access to information about the Java toolchain rule. Accessible as a 'java_toolchain'
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/OutputJarApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/OutputJarApi.java
index 3fc4d8e..6550dd7 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/OutputJarApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/OutputJarApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi.java;
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A tuple of a java classes jar and its associated source and interface archives. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
index 9d59d0e..3d49b1c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
@@ -17,12 +17,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
 
 /** Provides information about proguard specs for Android binaries. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/BUILD
index 1294777..0f382f6 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/BUILD
@@ -20,11 +20,12 @@
     name = "javascript",
     srcs = glob(["*.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/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
index 9a6ccdd..6425b66 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
@@ -19,14 +19,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Info object propagating information about protocol buffer sources. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/BUILD
index 74b3778..2c02ccd 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/BUILD
@@ -20,11 +20,12 @@
     name = "platform",
     srcs = glob(["*.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/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//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:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
index 91c4cba..cf140bf 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
@@ -15,14 +15,14 @@
 package com.google.devtools.build.lib.starlarkbuildapi.platform;
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Info object representing data about a specific platform. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ExecGroupCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ExecGroupCollectionApi.java
index c5b3045..ffda138 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ExecGroupCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ExecGroupCollectionApi.java
@@ -13,12 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.starlarkbuildapi.platform;
 
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Stores {@link com.google.devtools.build.lib.packages.ExecGroup}s available to a given rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformCommonApi.java
index 9101ef0..95f8b29 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformCommonApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi.platform;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-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;
 
 /** Module containing functions to interact with the platform APIs. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformConfigurationApi.java
index 33694d7..264aaec 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformConfigurationApi.java
@@ -16,10 +16,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** The platform configuration. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
index 2338069..8292d5f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
@@ -18,16 +18,16 @@
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Info object representing data about a specific platform. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java
index e7096ac..990863e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainContextApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.platform;
 
-import com.google.devtools.build.lib.syntax.StarlarkIndexable;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.eval.StarlarkIndexable;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Stores toolchains available to a given rule. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainInfoApi.java
index f10d686..bfd6a6a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ToolchainInfoApi.java
@@ -16,13 +16,13 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Info object representing data about a specific toolchain. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/BUILD
index b8eb8f6..0452a4d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/BUILD
@@ -20,12 +20,13 @@
     name = "proto",
     srcs = glob(["*.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/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/net/starlark/java/annot",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoBootstrap.java
index 2160d87..f58bfb8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoBootstrap.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAspectApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import net.starlark.java.eval.FlagGuardedValue;
 
 /** A {@link Bootstrap} for Starlark objects related to protocol buffers. */
 public class ProtoBootstrap implements Bootstrap {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoCommonApi.java
index ca2453a..020d7a9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoCommonApi.java
@@ -14,8 +14,8 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.proto;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Interface for protocol buffers support in Bazel.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoRegistryProviderApi.java
index f180b9e..d2ce84d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoRegistryProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto/ProtoRegistryProviderApi.java
@@ -17,10 +17,10 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Sequence;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Sequence;
 
 /** Provides information about flavors for all built protos. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/BUILD
index 1acb981..8694043 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/BUILD
@@ -20,12 +20,13 @@
     name = "python",
     srcs = glob(["*.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/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//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:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java
index 484569d..d38e325 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyInfoApi.PyInfoProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyRuntimeInfoApi.PyRuntimeInfoProviderApi;
-import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import net.starlark.java.eval.FlagGuardedValue;
 
 /** {@link Bootstrap} for Starlark objects related to the Python rules. */
 public class PyBootstrap implements Bootstrap {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
index 766275d..a6e6dca 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
@@ -17,14 +17,14 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Provider instance for the Python rules. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
index d83b2f8..52983c7 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
@@ -17,15 +17,15 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Provider instance for {@code py_runtime}. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyStarlarkTransitionsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyStarlarkTransitionsApi.java
index 360cda1..3619b89 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyStarlarkTransitionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyStarlarkTransitionsApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi.python;
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-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;
 
 /**
  * DO NOT USE. Skarlark module exposing Python transitions for Python 2 to 3 migration purposes
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/BUILD
index fb0fcf5..ed3ab56 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/BUILD
@@ -23,7 +23,8 @@
         "//third_party:guava",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/net/starlark/java/annot",
-        "//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/packages/semantics",
         # TODO(cparsons): Remove dependency on Label implementation.
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryBootstrap.java
index fc7d246..17fd2aa 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryBootstrap.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap;
-import com.google.devtools.build.lib.syntax.Starlark;
+import net.starlark.java.eval.Starlark;
 
 /**
  * A {@link Bootstrap} for repository-related libraries of the build API.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
index 0d38eec..572f316 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
@@ -15,14 +15,14 @@
 package com.google.devtools.build.lib.starlarkbuildapi.repository;
 
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkGlobalLibrary;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * The Starlark module containing the definition of {@code repository_rule} function to define a
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
index c518472..e03367a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.starlarkbuildapi.repository;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.io.IOException;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A structure representing a file to be used inside a repository. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkExecutionResultApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkExecutionResultApi.java
index cf65241..f0a37da 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkExecutionResultApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkExecutionResultApi.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.repository;
 
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * A structure callable from Starlark that stores the result of repository_ctx.execute() method. It
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkOSApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkOSApi.java
index 66efb09..feac8ef 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkOSApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkOSApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.starlarkbuildapi.repository;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /** A Starlark structure to deliver information about the system we are running on. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
index 7f414ec..d278f0f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
@@ -16,16 +16,16 @@
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Starlark API for the repository_rule's context. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/BUILD
index a9929b1..4633859 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/BUILD
@@ -19,8 +19,9 @@
     name = "stubs",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/ProviderStub.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/ProviderStub.java
index c5e9865..6459d18a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/ProviderStub.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/ProviderStub.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.starlarkbuildapi.stubs;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Stub implementation of {@link ProviderApi}. Should only be used for experimental, unimplemented
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/StarlarkAspectStub.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/StarlarkAspectStub.java
index 5b709e0..7c85107 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/StarlarkAspectStub.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/stubs/StarlarkAspectStub.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.starlarkbuildapi.stubs;
 
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAspectApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Stub implementation of {@link StarlarkAspectApi}. Should only be used for experimental,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureApi.java
index 4382730..5024f53 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.lib.starlarkbuildapi.test;
 
 import com.google.devtools.build.lib.cmdline.Label;
-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;
 
 /**
  * Encapsulates information about an analysis-phase error which would have occurred during a build.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureInfoApi.java
index cff9393..a467557 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisFailureInfoApi.java
@@ -16,9 +16,9 @@
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-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;
 
 /**
  * Encapsulates information about an analysis-phase error which would have occurred during a build.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
index 3582708..631daa0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.lib.starlarkbuildapi.test;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkConstructor;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkValue;
 
 /**
  * Encapsulates information about an analysis-phase error which would have occurred during a build.
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/BUILD
index ce9dc9f..1ec4920 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/BUILD
@@ -27,7 +27,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/net/starlark/java/annot",
-        "//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/starlarkbuildapi",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
index b7f48bf..bb04ace 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
@@ -16,12 +16,12 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Helper functions for Starlark to access coverage-related infrastructure */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
index 81ecbbf..c63d515 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
@@ -14,12 +14,12 @@
 
 package com.google.devtools.build.lib.starlarkbuildapi.test;
 
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Helper module for accessing test infrastructure. */
 @StarlarkBuiltin(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/BUILD
index edab2b8..6e4bcbe 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/BUILD
@@ -14,10 +14,11 @@
     deps = [
         ":options",
         "//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/events",
         "//src/main/java/com/google/devtools/build/lib/starlarkdebug/server",
         "//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",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/StarlarkDebuggerModule.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/StarlarkDebuggerModule.java
index 25339e7..7ed17db 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/StarlarkDebuggerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/module/StarlarkDebuggerModule.java
@@ -21,9 +21,9 @@
 import com.google.devtools.build.lib.runtime.Command;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.starlarkdebug.server.StarlarkDebugServer;
-import com.google.devtools.build.lib.syntax.Debug;
 import com.google.devtools.common.options.OptionsBase;
 import java.io.IOException;
+import net.starlark.java.eval.Debug;
 
 /** Blaze module for setting up Starlark debugging. */
 public final class StarlarkDebuggerModule extends BlazeModule {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
index d0127f9..cb1c23a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/BUILD
@@ -12,10 +12,11 @@
     name = "server",
     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/starlarkdebug/proto:starlark_debugging_java_proto",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebugEventHelper.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebugEventHelper.java
index 9a2cc9e..c2da173 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebugEventHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebugEventHelper.java
@@ -32,13 +32,13 @@
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.ThreadContinuedEvent;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.ThreadPausedEvent;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.syntax.Location;
 
 /**
  * Helper class for constructing event or response protos to be sent from the debug server to a
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
index d11630b..c0f17d3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
@@ -18,15 +18,15 @@
 import com.google.common.collect.Ordering;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.ClassObject;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkSemantics;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.lang.reflect.Array;
 import java.util.Map;
 import java.util.Set;
+import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Helper class for creating {@link StarlarkDebuggingProtos.Value} from Starlark objects. */
 final class DebuggerSerialization {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServer.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServer.java
index 8b19aa3..9283485 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServer.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServer.java
@@ -19,13 +19,13 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos;
-import com.google.devtools.build.lib.syntax.Debug;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.util.List;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Manages the network socket and debugging state for threads running Starlark code. */
 public final class StarlarkDebugServer implements Debug.Debugger {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/ThreadHandler.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/ThreadHandler.java
index fa86a7a..a47bdc3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/ThreadHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/ThreadHandler.java
@@ -23,15 +23,6 @@
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.Error;
 import com.google.devtools.build.lib.starlarkdebugging.StarlarkDebuggingProtos.PauseReason;
 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.Location;
-import com.google.devtools.build.lib.syntax.Module;
-import com.google.devtools.build.lib.syntax.ParserInput;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -40,6 +31,15 @@
 import java.util.concurrent.Semaphore;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
+import net.starlark.java.eval.Debug;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Starlark;
+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 net.starlark.java.syntax.SyntaxError;
 
 /** Handles all thread-related state and debugging tasks. */
 final class ThreadHandler {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Argument.java b/src/main/java/com/google/devtools/build/lib/syntax/Argument.java
deleted file mode 100644
index b80a2fe..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Argument.java
+++ /dev/null
@@ -1,123 +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 com.google.common.base.Preconditions;
-import javax.annotation.Nullable;
-
-/**
- * Syntax node for an argument to a function.
- *
- * <p>Arguments may be of four forms, as in {@code f(expr, id=expr, *expr, **expr)}. These are
- * represented by the subclasses Positional, Keyword, Star, and StarStar.
- */
-public abstract class Argument extends Node {
-
-  protected final Expression value;
-
-  Argument(FileLocations locs, Expression value) {
-    super(locs);
-    this.value = Preconditions.checkNotNull(value);
-  }
-
-  public final Expression getValue() {
-    return value;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return value.getEndOffset();
-  }
-
-  /** Return the name of this argument's parameter, or null if it is not a Keyword argument. */
-  @Nullable
-  public String getName() {
-    return null;
-  }
-
-  /** Syntax node for a positional argument, {@code f(expr)}. */
-  public static final class Positional extends Argument {
-    Positional(FileLocations locs, Expression value) {
-      super(locs, value);
-    }
-
-    @Override
-    public int getStartOffset() {
-      return value.getStartOffset();
-    }
-  }
-
-  /** Syntax node for a keyword argument, {@code f(id=expr)}. */
-  public static final class Keyword extends Argument {
-
-    // Unlike in Python, keyword arguments in Bazel BUILD files
-    // are about 10x more numerous than positional arguments.
-
-    final Identifier id;
-
-    Keyword(FileLocations locs, Identifier id, Expression value) {
-      super(locs, value);
-      this.id = id;
-    }
-
-    public Identifier getIdentifier() {
-      return id;
-    }
-
-    @Override
-    public String getName() {
-      return id.getName();
-    }
-
-    @Override
-    public int getStartOffset() {
-      return id.getStartOffset();
-    }
-  }
-
-  /** Syntax node for an argument of the form {@code f(*expr)}. */
-  public static final class Star extends Argument {
-    private final int starOffset;
-
-    Star(FileLocations locs, int starOffset, Expression value) {
-      super(locs, value);
-      this.starOffset = starOffset;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return starOffset;
-    }
-  }
-
-  /** Syntax node for an argument of the form {@code f(**expr)}. */
-  public static final class StarStar extends Argument {
-    private final int starStarOffset;
-
-    StarStar(FileLocations locs, int starStarOffset, Expression value) {
-      super(locs, value);
-      this.starStarOffset = starStarOffset;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return starStarOffset;
-    }
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
deleted file mode 100644
index edefa52..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
+++ /dev/null
@@ -1,90 +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 javax.annotation.Nullable;
-
-/**
- * Syntax node for an assignment statement ({@code lhs = rhs}) or augmented assignment statement
- * ({@code lhs op= rhs}).
- */
-public final class AssignmentStatement extends Statement {
-
-  private final Expression lhs; // = IDENTIFIER | DOT | INDEX | LIST_EXPR
-  @Nullable private final TokenKind op; // TODO(adonovan): make this mandatory even when '='.
-  private final int opOffset;
-  private final Expression rhs;
-
-  /**
-   * Constructs an assignment statement. For an ordinary assignment ({@code op == null}), the LHS
-   * expression must be of the form {@code id}, {@code x.y}, {@code x[i]}, {@code [e, ...]}, or
-   * {@code (e, ...)}, where x, i, and e are arbitrary expressions. For an augmented assignment, the
-   * list and tuple forms are disallowed.
-   */
-  AssignmentStatement(
-      FileLocations locs, Expression lhs, @Nullable TokenKind op, int opOffset, Expression rhs) {
-    super(locs);
-    this.lhs = lhs;
-    this.op = op;
-    this.opOffset = opOffset;
-    this.rhs = rhs;
-  }
-
-  /** Returns the LHS of the assignment. */
-  public Expression getLHS() {
-    return lhs;
-  }
-
-  /** Returns the operator of an augmented assignment, or null for an ordinary assignment. */
-  @Nullable
-  public TokenKind getOperator() {
-    return op;
-  }
-
-  /** Returns the location of the assignment operator. */
-  public Location getOperatorLocation() {
-    return locs.getLocation(opOffset);
-  }
-
-  @Override
-  public int getStartOffset() {
-    return lhs.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rhs.getEndOffset();
-  }
-
-  /** Reports whether this is an augmented assignment ({@code getOperator() != null}). */
-  public boolean isAugmented() {
-    return op != null;
-  }
-
-  /** Returns the RHS of the assignment. */
-  public Expression getRHS() {
-    return rhs;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.ASSIGNMENT;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BUILD b/src/main/java/com/google/devtools/build/lib/syntax/BUILD
index d6ff212..e77778c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BUILD
@@ -1,178 +1,7 @@
-# Description: Bazel's Starlark interpreter
-#
-# This BUILD file defines two java_library rules that
-# define a single Java package in two parts,
-# the Starlark parser and evaluator.
-# Eventually the Java package will be split in two,
-# but splitting only the build rules helps enforce
-# that only evaluator -> frontend dependencies are permitted,
-# without the churn to clients of renaming classes one at a time
-# as they move between two different Java packages.
-#
-# Until the split, clients should depend only on
-# //third_party/bazel/src/main/java/com/google/devtools/build/lib:syntax,
-# which is a facade for the complete package.
-
-load("@rules_java//java:defs.bzl", "java_library")
-
-package(default_visibility = ["//src:__subpackages__"])
-
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 filegroup(
     name = "srcs",
-    srcs = glob(["**"]),
+    srcs = ["BUILD"],
     visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"],
 )
-
-# The Starlark frontend (syntax, scanner, parser, resolver)
-java_library(
-    name = "frontend",
-    srcs = [
-        "Argument.java",
-        "AssignmentStatement.java",
-        "BinaryOperatorExpression.java",
-        "CallExpression.java",
-        "Comment.java",
-        "Comprehension.java",
-        "ConditionalExpression.java",
-        "DefStatement.java",
-        "DictExpression.java",
-        "DotExpression.java",
-        "Expression.java",
-        "ExpressionStatement.java",
-        "FileLocations.java",
-        "FileOptions.java",
-        "FlowStatement.java",
-        "ForStatement.java",
-        "Identifier.java",
-        "IfStatement.java",
-        "IndexExpression.java",
-        "IntegerLiteral.java",
-        "Lexer.java",
-        "ListExpression.java",
-        "LoadStatement.java",
-        "Location.java",
-        "Node.java",
-        "NodePrinter.java",
-        "NodeVisitor.java",
-        "Parameter.java",
-        "Parser.java",
-        "ParserInput.java",
-        "Program.java",
-        "Resolver.java",
-        "ReturnStatement.java",
-        "SliceExpression.java",
-        "StarlarkFile.java",
-        "Statement.java",
-        "StringLiteral.java",
-        "SyntaxError.java",
-        "TokenKind.java",
-        "UnaryOperatorExpression.java",
-    ],
-    deps = [
-        # Do not add Bazel or Google dependencies here!
-        "//src/main/java/net/starlark/java/spelling",
-        "//third_party:auto_value",
-        "//third_party:guava",
-        "//third_party:jsr305",
-    ],
-)
-
-# The Starlark evaluator
-java_library(
-    name = "evaluator",
-    srcs = [
-        "BuiltinCallable.java",
-        "CallUtils.java",
-        "ClassObject.java",
-        "CpuProfiler.java",
-        "Debug.java",
-        "Dict.java",
-        "Eval.java",
-        "EvalException.java",
-        "EvalUtils.java",
-        "FlagGuardedValue.java",
-        "FormatParser.java",
-        "HasBinary.java",
-        "JNI.java",
-        "MethodDescriptor.java",
-        "MethodLibrary.java",
-        "Module.java",
-        "Mutability.java",
-        "NoneType.java",
-        "ParamDescriptor.java",
-        "Printer.java",
-        "RangeList.java",
-        "Sequence.java",
-        "Starlark.java",
-        "StarlarkCallable.java",
-        "StarlarkFunction.java",
-        "StarlarkIndexable.java",
-        "StarlarkIterable.java",
-        "StarlarkList.java",
-        "StarlarkSemantics.java",
-        "StarlarkThread.java",
-        "StarlarkValue.java",
-        "StringModule.java",
-        "Tuple.java",
-    ],
-    deps = [
-        ":frontend",
-        # Do not add Bazel or Google dependencies here!
-        "//src/main/java/net/starlark/java/annot",
-        "//src/main/java/net/starlark/java/spelling",
-        "//third_party:auto_value",
-        "//third_party:guava",
-        "//third_party:jsr305",
-        "//third_party/protobuf:protobuf_java",
-    ],
-)
-
-# Dynamic library for Starlark CPU profiler.
-# The application or test must arrange for the library to be added
-# to the java.library.path directory (e.g. by 'java -Djava.library.path=<dir>').
-# What a mess.
-filegroup(
-    name = "cpu_profiler",
-    srcs = select({
-        "//src/conditions:darwin": [":libcpu_profiler.dylib"],
-        "//src/conditions:windows": [":cpu_profiler.dll"],
-        "//conditions:default": [":libcpu_profiler.so"],  # POSIX
-    }),
-)
-
-genrule(
-    name = "cpu_profiler_darwin",
-    srcs = ["libcpu_profiler.so"],
-    outs = ["libcpu_profiler.dylib"],
-    cmd = "cp $< $@",
-    visibility = ["//visibility:private"],
-)
-
-genrule(
-    name = "cpu_profiler_windows",
-    srcs = ["libcpu_profiler.so"],
-    outs = ["cpu_profiler.dll"],
-    cmd = "cp $< $@",
-    visibility = ["//visibility:private"],
-)
-
-# The C++ portion of the Starlark CPU profiler.
-cc_binary(
-    name = "libcpu_profiler.so",
-    srcs = select({
-        "//src/conditions:darwin": ["cpu_profiler_posix.cc"],
-        # There is no config_setting for Linux.
-        # See https://github.com/bazelbuild/bazel/issues/11107
-        "//src/conditions:linux_aarch64": ["cpu_profiler_posix.cc"],
-        "//src/conditions:linux_arm": ["cpu_profiler_posix.cc"],
-        "//src/conditions:linux_ppc": ["cpu_profiler_posix.cc"],
-        "//src/conditions:linux_s390x": ["cpu_profiler_posix.cc"],
-        "//src/conditions:linux_x86_64": ["cpu_profiler_posix.cc"],
-        "//conditions:default": ["cpu_profiler_unimpl.cc"],
-    }),
-    linkshared = 1,
-    visibility = ["//visibility:private"],
-    deps = ["@bazel_tools//tools/jdk:jni"],
-)
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
deleted file mode 100644
index 066e908..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
+++ /dev/null
@@ -1,101 +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 java.util.EnumSet;
-
-/** A BinaryExpression represents a binary operator expression 'x op y'. */
-public final class BinaryOperatorExpression extends Expression {
-
-  private final Expression x;
-  private final TokenKind op; // one of 'operators'
-  private final int opOffset;
-  private final Expression y;
-
-  /** operators is the set of valid binary operators. */
-  public static final EnumSet<TokenKind> operators =
-      EnumSet.of(
-          TokenKind.AND,
-          TokenKind.EQUALS_EQUALS,
-          TokenKind.GREATER,
-          TokenKind.GREATER_EQUALS,
-          TokenKind.IN,
-          TokenKind.LESS,
-          TokenKind.LESS_EQUALS,
-          TokenKind.MINUS,
-          TokenKind.NOT_EQUALS,
-          TokenKind.NOT_IN,
-          TokenKind.OR,
-          TokenKind.PERCENT,
-          TokenKind.SLASH,
-          TokenKind.SLASH_SLASH,
-          TokenKind.PLUS,
-          TokenKind.PIPE,
-          TokenKind.STAR);
-
-  BinaryOperatorExpression(
-      FileLocations locs, Expression x, TokenKind op, int opOffset, Expression y) {
-    super(locs);
-    this.x = x;
-    this.op = op;
-    this.opOffset = opOffset;
-    this.y = y;
-  }
-
-  /** Returns the left operand. */
-  public Expression getX() {
-    return x;
-  }
-
-  /** Returns the operator. */
-  public TokenKind getOperator() {
-    return op;
-  }
-
-  public Location getOperatorLocation() {
-    return locs.getLocation(opOffset);
-  }
-
-  /** Returns the right operand. */
-  public Expression getY() {
-    return y;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return x.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return y.getEndOffset();
-  }
-
-  @Override
-  public String toString() {
-    // This omits the parentheses for brevity, but is not correct in general due to operator
-    // precedence rules.
-    return x + " " + op + " " + y;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.BINARY_OPERATOR;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
deleted file mode 100644
index b5c7581..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
+++ /dev/null
@@ -1,372 +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.base.Joiner;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.spelling.SpellChecker;
-
-/**
- * A BuiltinCallable is a callable Starlark value that reflectively invokes a
- * StarlarkMethod-annotated method of a Java object.
- */
-// TODO(adonovan): make this private. Most users would be content with StarlarkCallable; the rest
-// need only a means of querying the function's parameters.
-public final class BuiltinCallable implements StarlarkCallable {
-
-  private final Object obj;
-  private final String methodName;
-  @Nullable private final MethodDescriptor desc;
-
-  /**
-   * Constructs a BuiltinCallable for a StarlarkCallable-annotated method of the given name (as seen
-   * by Starlark, not Java).
-   */
-  // TODO(adonovan): eliminate calls to this constructor from tests; use getattr instead.
-  BuiltinCallable(Object obj, String methodName) {
-    this(obj, methodName, /*desc=*/ null);
-  }
-
-  /**
-   * Constructs a BuiltinCallable for a StarlarkCallable-annotated method of the given name (as seen
-   * by Starlark, not Java).
-   *
-   * <p>This constructor should be used only for ephemeral BuiltinCallable values created
-   * transiently during a call such as {@code x.f()}, when the caller has already looked up the
-   * MethodDescriptor using the same semantics as the thread that will be used in the call. Use the
-   * other (slower) constructor if there is any possibility that the semantics of the {@code x.f}
-   * operation differ from those of the thread used in the call.
-   */
-  BuiltinCallable(Object obj, String methodName, MethodDescriptor desc) {
-    this.obj = obj;
-    this.methodName = methodName;
-    this.desc = desc;
-  }
-
-  @Override
-  public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
-      throws EvalException, InterruptedException {
-    MethodDescriptor desc =
-        this.desc != null ? this.desc : getMethodDescriptor(thread.getSemantics());
-    Preconditions.checkArgument(
-        !desc.isStructField(),
-        "struct field methods should be handled by DotExpression separately");
-    Object[] vector = getArgumentVector(thread, desc, positional, named);
-    return desc.call(
-        obj instanceof String ? StringModule.INSTANCE : obj, vector, thread.mutability());
-  }
-
-  private MethodDescriptor getMethodDescriptor(StarlarkSemantics semantics) {
-    return CallUtils.getAnnotatedMethod(semantics, obj.getClass(), methodName);
-  }
-
-  /**
-   * Returns the StarlarkMethod annotation of this Starlark-callable Java method.
-   *
-   * @deprecated This method is intended only for docgen, and uses the default semantics.
-   */
-  @Deprecated
-  public StarlarkMethod getAnnotation() {
-    return getMethodDescriptor(StarlarkSemantics.DEFAULT).getAnnotation();
-  }
-
-  @Override
-  public String getName() {
-    return methodName;
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    printer.append("<built-in function " + methodName + ">");
-  }
-
-  @Override
-  public String toString() {
-    return methodName;
-  }
-
-  /**
-   * Converts the arguments of a Starlark call into the argument vector for a reflective call to a
-   * StarlarkMethod-annotated Java method.
-   *
-   * @param thread the Starlark thread for the call
-   * @param loc the location of the call expression, or BUILTIN for calls from Java
-   * @param desc descriptor for the StarlarkCallable-annotated method
-   * @param positional a list of positional arguments
-   * @param named a list of named arguments, as alternating Strings/Objects. May contain dups.
-   * @return the array of arguments which may be passed to {@link MethodDescriptor#call}
-   * @throws EvalException if the given set of arguments are invalid for the given method. For
-   *     example, if any arguments are of unexpected type, or not all mandatory parameters are
-   *     specified by the user
-   */
-  private Object[] getArgumentVector(
-      StarlarkThread thread,
-      MethodDescriptor desc, // intentionally shadows this.desc
-      Object[] positional,
-      Object[] named)
-      throws EvalException {
-
-    // Overview of steps:
-    // - allocate vector of actual arguments of correct size.
-    // - process positional arguments, accumulating surplus ones into *args.
-    // - process named arguments, accumulating surplus ones into **kwargs.
-    // - set default values for missing optionals, and report missing mandatory parameters.
-    // - set special parameters.
-    // The static checks ensure that positional parameters appear before named,
-    // and mandatory positionals appear before optional.
-    // No additional memory allocation occurs in the common (success) case.
-    // Flag-disabled parameters are skipped during argument matching, as if they do not exist. They
-    // are instead assigned their flag-disabled values.
-
-    ParamDescriptor[] parameters = desc.getParameters();
-
-    // Allocate argument vector.
-    int n = parameters.length;
-    if (desc.acceptsExtraArgs()) {
-      n++;
-    }
-    if (desc.acceptsExtraKwargs()) {
-      n++;
-    }
-    if (desc.isUseStarlarkThread()) {
-      n++;
-    }
-    Object[] vector = new Object[n];
-
-    // positional arguments
-    int paramIndex = 0;
-    int argIndex = 0;
-    if (obj instanceof String) {
-      // String methods get the string as an extra argument
-      // because their true receiver is StringModule.INSTANCE.
-      vector[paramIndex++] = obj;
-    }
-    for (; argIndex < positional.length && paramIndex < parameters.length; paramIndex++) {
-      ParamDescriptor param = parameters[paramIndex];
-      if (!param.isPositional()) {
-        break;
-      }
-
-      // disabled?
-      if (param.disabledByFlag() != null) {
-        // Skip disabled parameter as if not present at all.
-        // The default value will be filled in below.
-        continue;
-      }
-
-      Object value = positional[argIndex++];
-      checkParamValue(param, value);
-      vector[paramIndex] = value;
-    }
-
-    // *args
-    Tuple<Object> varargs = null;
-    if (desc.acceptsExtraArgs()) {
-      varargs = Tuple.wrap(Arrays.copyOfRange(positional, argIndex, positional.length));
-    } else if (argIndex < positional.length) {
-      if (argIndex == 0) {
-        throw Starlark.errorf("%s() got unexpected positional argument", methodName);
-      } else {
-        throw Starlark.errorf(
-            "%s() accepts no more than %d positional argument%s but got %d",
-            methodName, argIndex, plural(argIndex), positional.length);
-      }
-    }
-
-    // named arguments
-    LinkedHashMap<String, Object> kwargs = desc.acceptsExtraKwargs() ? new LinkedHashMap<>() : null;
-    for (int i = 0; i < named.length; i += 2) {
-      String name = (String) named[i]; // safe
-      Object value = named[i + 1];
-
-      // look up parameter
-      int index = desc.getParameterIndex(name);
-      // unknown parameter?
-      if (index < 0) {
-        // spill to **kwargs
-        if (kwargs == null) {
-          List<String> allNames =
-              Arrays.stream(parameters)
-                  .map(ParamDescriptor::getName)
-                  .collect(ImmutableList.toImmutableList());
-          throw Starlark.errorf(
-              "%s() got unexpected keyword argument '%s'%s",
-              methodName, name, SpellChecker.didYouMean(name, allNames));
-        }
-
-        // duplicate named argument?
-        if (kwargs.put(name, value) != null) {
-          throw Starlark.errorf(
-              "%s() got multiple values for keyword argument '%s'", methodName, name);
-        }
-        continue;
-      }
-      ParamDescriptor param = parameters[index];
-
-      // positional-only param?
-      if (!param.isNamed()) {
-        // spill to **kwargs
-        if (kwargs == null) {
-          throw Starlark.errorf(
-              "%s() got named argument for positional-only parameter '%s'", methodName, name);
-        }
-
-        // duplicate named argument?
-        if (kwargs.put(name, value) != null) {
-          throw Starlark.errorf(
-              "%s() got multiple values for keyword argument '%s'", methodName, name);
-        }
-        continue;
-      }
-
-      // disabled?
-      String flag = param.disabledByFlag();
-      if (flag != null) {
-        // spill to **kwargs
-        if (kwargs == null) {
-          throw Starlark.errorf(
-              "in call to %s(), parameter '%s' is %s",
-              methodName, param.getName(), disabled(flag, thread.getSemantics()));
-        }
-
-        // duplicate named argument?
-        if (kwargs.put(name, value) != null) {
-          throw Starlark.errorf(
-              "%s() got multiple values for keyword argument '%s'", methodName, name);
-        }
-        continue;
-      }
-
-      checkParamValue(param, value);
-
-      // duplicate?
-      if (vector[index] != null) {
-        throw Starlark.errorf("%s() got multiple values for argument '%s'", methodName, name);
-      }
-
-      vector[index] = value;
-    }
-
-    // Set default values for missing parameters,
-    // and report any that are still missing.
-    List<String> missingPositional = null;
-    List<String> missingNamed = null;
-    for (int i = 0; i < parameters.length; i++) {
-      if (vector[i] == null) {
-        ParamDescriptor param = parameters[i];
-        vector[i] = param.getDefaultValue();
-        if (vector[i] == null) {
-          if (param.isPositional()) {
-            if (missingPositional == null) {
-              missingPositional = new ArrayList<>();
-            }
-            missingPositional.add(param.getName());
-          } else {
-            if (missingNamed == null) {
-              missingNamed = new ArrayList<>();
-            }
-            missingNamed.add(param.getName());
-          }
-        }
-      }
-    }
-    if (missingPositional != null) {
-      throw Starlark.errorf(
-          "%s() missing %d required positional argument%s: %s",
-          methodName,
-          missingPositional.size(),
-          plural(missingPositional.size()),
-          Joiner.on(", ").join(missingPositional));
-    }
-    if (missingNamed != null) {
-      throw Starlark.errorf(
-          "%s() missing %d required named argument%s: %s",
-          methodName,
-          missingNamed.size(),
-          plural(missingNamed.size()),
-          Joiner.on(", ").join(missingNamed));
-    }
-
-    // special parameters
-    int i = parameters.length;
-    if (desc.acceptsExtraArgs()) {
-      vector[i++] = varargs;
-    }
-    if (desc.acceptsExtraKwargs()) {
-      vector[i++] = Dict.wrap(thread.mutability(), kwargs);
-    }
-    if (desc.isUseStarlarkThread()) {
-      vector[i++] = thread;
-    }
-
-    return vector;
-  }
-
-  private static String plural(int n) {
-    return n == 1 ? "" : "s";
-  }
-
-  private void checkParamValue(ParamDescriptor param, Object value) throws EvalException {
-    // Value must belong to one of the specified classes.
-    boolean ok = false;
-    for (Class<?> cls : param.getAllowedClasses()) {
-      if (cls.isInstance(value)) {
-        ok = true;
-        break;
-      }
-    }
-    if (!ok) {
-      throw Starlark.errorf(
-          "in call to %s(), parameter '%s' got value of type '%s', want '%s'",
-          methodName, param.getName(), Starlark.type(value), param.getTypeErrorMessage());
-    }
-
-    // None is valid if and only if the parameter is marked noneable,
-    // in which case the above check passes as the list of classes will include NoneType.
-    // The reason for this check is to ensure that merely having type=Object.class
-    // does not allow None as an argument value; I'm not sure why, that but that's the
-    // historical behavior.
-    //
-    // We do this check second because the first check prints a better error
-    // that enumerates the allowed types.
-    if (value == Starlark.NONE && !param.isNoneable()) {
-      throw Starlark.errorf(
-          "in call to %s(), parameter '%s' cannot be None", methodName, param.getName());
-    }
-  }
-
-  // Returns a phrase meaning "disabled" appropriate to the specified flag.
-  private static String disabled(String flag, StarlarkSemantics semantics) {
-    // If the flag is True, it must be a deprecation flag. Otherwise it's an experimental flag.
-    // TODO(adonovan): is that assumption sound?
-    if (semantics.getBool(flag)) {
-      return String.format(
-          "deprecated and will be removed soon. It may be temporarily re-enabled by setting"
-              + " --%s=false",
-          flag.substring(1)); // remove [+-] prefix
-    } else {
-      return String.format(
-          "experimental and thus unavailable with the current flags. It may be enabled by setting"
-              + " --%s",
-          flag.substring(1)); // remove [+-] prefix
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/CallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/CallExpression.java
deleted file mode 100644
index 128bd5f..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/CallExpression.java
+++ /dev/null
@@ -1,104 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/** Syntax node for a function call expression. */
-public final class CallExpression extends Expression {
-
-  private final Expression function;
-  private final Location lparenLocation;
-  private final ImmutableList<Argument> arguments;
-  private final int rparenOffset;
-
-  private final int numPositionalArgs;
-
-  CallExpression(
-      FileLocations locs,
-      Expression function,
-      Location lparenLocation,
-      ImmutableList<Argument> arguments,
-      int rparenOffset) {
-    super(locs);
-    this.function = Preconditions.checkNotNull(function);
-    this.lparenLocation = lparenLocation;
-    this.arguments = arguments;
-    this.rparenOffset = rparenOffset;
-
-    int n = 0;
-    for (Argument arg : arguments) {
-      if (arg instanceof Argument.Positional) {
-        n++;
-      }
-    }
-    this.numPositionalArgs = n;
-  }
-
-  /** Returns the function that is called. */
-  public Expression getFunction() {
-    return this.function;
-  }
-
-  /** Returns the number of arguments of type {@code Argument.Positional}. */
-  public int getNumPositionalArguments() {
-    return numPositionalArgs;
-  }
-
-  /** Returns the function arguments. */
-  public ImmutableList<Argument> getArguments() {
-    return arguments;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return function.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rparenOffset + 1;
-  }
-
-  public Location getLparenLocation() {
-    // Unlike all other getXXXLocation methods, this one returns a reference to
-    // a previously materialized Location. getLparenLocation is unique among
-    // locations because the tree-walking evaluator needs it frequently even
-    // in the absence of errors. When we switch to a compiled representation
-    // we can dispense with this optimization.
-    return lparenLocation;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder buf = new StringBuilder();
-    buf.append(function);
-    buf.append('(');
-    ListExpression.appendNodes(buf, arguments);
-    buf.append(')');
-    return buf.toString();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.CALL;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/CallUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/CallUtils.java
deleted file mode 100644
index 4398edf..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/CallUtils.java
+++ /dev/null
@@ -1,212 +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 com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.StarlarkInterfaceUtils;
-import net.starlark.java.annot.StarlarkMethod;
-
-/** Helper functions for StarlarkMethod-annotated fields and methods. */
-final class CallUtils {
-
-  private CallUtils() {} // uninstantiable
-
-  private static CacheValue getCacheValue(Class<?> cls, StarlarkSemantics semantics) {
-    if (cls == String.class) {
-      cls = StringModule.class;
-    }
-    Key key = new Key(cls, semantics);
-
-    // Speculatively call `get` because `computeIfAbsent` is more expensive
-    // even when the map already contains a value (common case).
-    CacheValue cacheValue = cache.get(key);
-    if (cacheValue == null) {
-      cacheValue = cache.computeIfAbsent(key, CallUtils::buildCacheValue);
-    }
-    return cacheValue;
-  }
-
-  // Key is a simple Pair<Class, StarlarkSemantics>.
-  private static final class Key {
-    final Class<?> cls;
-    final StarlarkSemantics semantics;
-
-    Key(Class<?> cls, StarlarkSemantics semantics) {
-      this.cls = cls;
-      this.semantics = semantics;
-    }
-
-    @Override
-    public boolean equals(Object that) {
-      return this == that
-          || (that instanceof Key
-              && this.cls.equals(((Key) that).cls)
-              && this.semantics.equals(((Key) that).semantics));
-    }
-
-    @Override
-    public int hashCode() {
-      return 31 * cls.hashCode() + semantics.hashCode();
-    }
-  }
-
-  // Information derived from a StarlarkMethod-annotated class and a StarlarkSemantics.
-  // methods is a superset of fields.
-  private static class CacheValue {
-    @Nullable MethodDescriptor selfCall;
-    ImmutableMap<String, MethodDescriptor> fields; // sorted by Java method name
-    ImmutableMap<String, MethodDescriptor> methods; // sorted by Java method name
-  }
-
-  // A cache of information derived from a StarlarkMethod-annotated class and a StarlarkSemantics.
-  private static final ConcurrentHashMap<Key, CacheValue> cache = new ConcurrentHashMap<>();
-
-  private static CacheValue buildCacheValue(Key key) {
-    MethodDescriptor selfCall = null;
-    ImmutableMap.Builder<String, MethodDescriptor> methods = ImmutableMap.builder();
-    Map<String, MethodDescriptor> fields = new HashMap<>();
-
-    // Sort methods by Java name, for determinism.
-    Method[] classMethods = key.cls.getMethods();
-    Arrays.sort(classMethods, Comparator.comparing(Method::getName));
-    for (Method method : classMethods) {
-      // Synthetic methods lead to false multiple matches
-      if (method.isSynthetic()) {
-        continue;
-      }
-
-      // annotated?
-      StarlarkMethod callable = StarlarkInterfaceUtils.getStarlarkMethod(method);
-      if (callable == null) {
-        continue;
-      }
-
-      // enabled by semantics?
-      if (!key.semantics.isFeatureEnabledBasedOnTogglingFlags(
-          callable.enableOnlyWithFlag(), callable.disableWithFlag())) {
-        continue;
-      }
-
-      MethodDescriptor descriptor = MethodDescriptor.of(method, callable, key.semantics);
-
-      // self-call method?
-      if (callable.selfCall()) {
-        if (selfCall != null) {
-          throw new IllegalArgumentException(
-              String.format("Class %s has two selfCall methods defined", key.cls.getName()));
-        }
-        selfCall = descriptor;
-        continue;
-      }
-
-      // regular method
-      methods.put(callable.name(), descriptor);
-
-      // field method?
-      if (descriptor.isStructField() && fields.put(callable.name(), descriptor) != null) {
-        // TODO(b/72113542): Validate with annotation processor instead of at runtime.
-        throw new IllegalArgumentException(
-            String.format(
-                "Class %s declares two structField methods named %s",
-                key.cls.getName(), callable.name()));
-      }
-    }
-
-    CacheValue value = new CacheValue();
-    value.selfCall = selfCall;
-    value.methods = methods.build();
-    value.fields = ImmutableMap.copyOf(fields);
-    return value;
-  }
-
-  /**
-   * Returns a map of methods and corresponding StarlarkMethod annotations of the methods of the
-   * objClass class reachable from Starlark. Elements are sorted by Java method name (which is not
-   * necessarily the same as Starlark attribute name).
-   */
-  static ImmutableMap<Method, StarlarkMethod> getAnnotatedMethods(Class<?> objClass) {
-    ImmutableMap.Builder<Method, StarlarkMethod> result = ImmutableMap.builder();
-    for (MethodDescriptor desc :
-        getCacheValue(objClass, StarlarkSemantics.DEFAULT).methods.values()) {
-      result.put(desc.getMethod(), desc.getAnnotation());
-    }
-    return result.build();
-  }
-
-  /**
-   * Returns the value of the Starlark field of {@code x}, implemented by a Java method with a
-   * {@code StarlarkMethod(structField=true)} annotation.
-   */
-  static Object getAnnotatedField(StarlarkSemantics semantics, Object x, String fieldName)
-      throws EvalException, InterruptedException {
-    MethodDescriptor desc = getCacheValue(x.getClass(), semantics).fields.get(fieldName);
-    if (desc == null) {
-      throw Starlark.errorf("value of type %s has no .%s field", Starlark.type(x), fieldName);
-    }
-    return desc.callField(x, semantics, /*mu=*/ null);
-  }
-
-  /** Returns the names of the Starlark fields of {@code x} under the specified semantics. */
-  static ImmutableSet<String> getAnnotatedFieldNames(StarlarkSemantics semantics, Object x) {
-    return getCacheValue(x.getClass(), semantics).fields.keySet();
-  }
-
-  /** Returns the StarlarkMethod-annotated method of objClass with the given name. */
-  static MethodDescriptor getAnnotatedMethod(
-      StarlarkSemantics semantics, Class<?> objClass, String methodName) {
-    return getCacheValue(objClass, semantics).methods.get(methodName);
-  }
-
-  /**
-   * Returns a set of the Starlark name of all Starlark callable methods for object of type {@code
-   * objClass}.
-   */
-  static ImmutableSet<String> getAnnotatedMethodNames(
-      StarlarkSemantics semantics, Class<?> objClass) {
-    return getCacheValue(objClass, semantics).methods.keySet();
-  }
-
-  /**
-   * Returns a {@link MethodDescriptor} object representing a function which calls the selfCall java
-   * method of the given object (the {@link StarlarkMethod} method with {@link
-   * StarlarkMethod#selfCall()} set to true). Returns null if no such method exists.
-   */
-  @Nullable
-  static MethodDescriptor getSelfCallMethodDescriptor(
-      StarlarkSemantics semantics, Class<?> objClass) {
-    return getCacheValue(objClass, semantics).selfCall;
-  }
-
-  /**
-   * Returns a {@code selfCall=true} method for the given class under the given Starlark semantics,
-   * or null if no such method exists.
-   */
-  @Nullable
-  static Method getSelfCallMethod(StarlarkSemantics semantics, Class<?> objClass) {
-    MethodDescriptor descriptor = getCacheValue(objClass, semantics).selfCall;
-    if (descriptor == null) {
-      return null;
-    }
-    return descriptor.getMethod();
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java b/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java
deleted file mode 100644
index 8db641f..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java
+++ /dev/null
@@ -1,69 +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 com.google.common.collect.ImmutableCollection;
-import javax.annotation.Nullable;
-
-/** An interface for Starlark values (such as structs) that have fields. */
-// TODO(adonovan): rename "HasFields".
-public interface ClassObject extends StarlarkValue {
-
-  /**
-   * Returns the value of the field with the given name, or null if the field does not exist. The
-   * interpreter (Starlark code) calls the getValue below, which has access to StarlarkSemantics.
-   *
-   * <p>The set of names for which {@code getValue} returns non-null should match {@code
-   * getFieldNames} if possible.
-   *
-   * @throws EvalException if a user-visible error occurs (other than non-existent field).
-   */
-  // TODO(adonovan): rename "getField".
-  @Nullable
-  Object getValue(String name) throws EvalException;
-
-  /**
-   * Returns the value of the field with the given name, or null if the field does not exist. The
-   * interpreter (Starlark code) calls this getValue, but client code cannot be relied upon to do
-   * so, so any checks done on the semantics are incompletely enforced.
-   *
-   * @param semantics the Starlark semantics, which determine the available fields
-   * @param name the name of the field to retrieve
-   * @throws EvalException if the field exists but could not be retrieved
-   */
-  @Nullable
-  default Object getValue(StarlarkSemantics semantics, String name) throws EvalException {
-    return this.getValue(name);
-  }
-
-  /**
-   * Returns the names of this value's fields, in some undefined but stable order.
-   *
-   * <p>A call to {@code getValue} for each of these names should return non-null, though this is
-   * not enforced.
-   *
-   * <p>The Starlark expression {@code dir(x)} reports the union of {@code getFieldNames()} and any
-   * StarlarkMethod-annotated fields and methods of this value.
-   */
-  ImmutableCollection<String> getFieldNames();
-
-  /**
-   * Returns the error message to print for an attempt to access an undefined field.
-   *
-   * <p>May return null to use a default error message.
-   */
-  @Nullable
-  String getErrorMessageForUnknownField(String field);
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Comment.java b/src/main/java/com/google/devtools/build/lib/syntax/Comment.java
deleted file mode 100644
index 2af98f9..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Comment.java
+++ /dev/null
@@ -1,53 +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;
-
-
-/** Syntax node for comments. */
-public final class Comment extends Node {
-
-  private final int offset;
-  private final String text;
-
-  Comment(FileLocations locs, int offset, String text) {
-    super(locs);
-    this.offset = offset;
-    this.text = text;
-  }
-
-  /** Returns the text of the comment, including the leading '#' but not the trailing newline. */
-  public String getText() {
-    return text;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return offset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return offset + text.length();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public String toString() {
-    return text;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Comprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/Comprehension.java
deleted file mode 100644
index 3444930..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Comprehension.java
+++ /dev/null
@@ -1,171 +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 com.google.common.collect.ImmutableList;
-
-/**
- * Syntax node for list and dict comprehensions.
- *
- * <p>A comprehension contains one or more clauses, e.g. [a+d for a in b if c for d in e] contains
- * three clauses: "for a in b", "if c", "for d in e". For and If clauses can happen in any order,
- * except that the first one has to be a For.
- *
- * <p>The code above can be expanded as:
- *
- * <pre>
- *   for a in b:
- *     if c:
- *       for d in e:
- *         result.append(a+d)
- * </pre>
- *
- * result is initialized to [] (list) or {} (dict) and is the return value of the whole expression.
- */
-public final class Comprehension extends Expression {
-
-  /** For or If */
-  public abstract static class Clause extends Node {
-    Clause(FileLocations locs) {
-      super(locs);
-    }
-  }
-
-  /** A for clause in a comprehension, e.g. "for a in b" in the example above. */
-  public static final class For extends Clause {
-    private final int forOffset;
-    private final Expression vars;
-    private final Expression iterable;
-
-    For(FileLocations locs, int forOffset, Expression vars, Expression iterable) {
-      super(locs);
-      this.forOffset = forOffset;
-      this.vars = vars;
-      this.iterable = iterable;
-    }
-
-    public Expression getVars() {
-      return vars;
-    }
-
-    public Expression getIterable() {
-      return iterable;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return forOffset;
-    }
-
-    @Override
-    public int getEndOffset() {
-      return iterable.getEndOffset();
-    }
-
-    @Override
-    public void accept(NodeVisitor visitor) {
-      visitor.visit(this);
-    }
-  }
-
-  /** A if clause in a comprehension, e.g. "if c" in the example above. */
-  public static final class If extends Clause {
-    private final int ifOffset;
-    private final Expression condition;
-
-    If(FileLocations locs, int ifOffset, Expression condition) {
-      super(locs);
-      this.ifOffset = ifOffset;
-      this.condition = condition;
-    }
-
-    public Expression getCondition() {
-      return condition;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return ifOffset;
-    }
-
-    @Override
-    public int getEndOffset() {
-      return condition.getEndOffset();
-    }
-
-    @Override
-    public void accept(NodeVisitor visitor) {
-      visitor.visit(this);
-    }
-  }
-
-  private final boolean isDict; // {k: v for vars in iterable}
-  private final int lbracketOffset;
-  private final Node body; // Expression or DictExpression.Entry
-  private final ImmutableList<Clause> clauses;
-  private final int rbracketOffset;
-
-  Comprehension(
-      FileLocations locs,
-      boolean isDict,
-      int lbracketOffset,
-      Node body,
-      ImmutableList<Clause> clauses,
-      int rbracketOffset) {
-    super(locs);
-    this.isDict = isDict;
-    this.lbracketOffset = lbracketOffset;
-    this.body = body;
-    this.clauses = clauses;
-    this.rbracketOffset = rbracketOffset;
-  }
-
-  public boolean isDict() {
-    return isDict;
-  }
-
-  /**
-   * Returns the loop body: an expression for a list comprehension, or a DictExpression.Entry for a
-   * dict comprehension.
-   */
-  public Node getBody() {
-    return body;
-  }
-
-  public ImmutableList<Clause> getClauses() {
-    return clauses;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return lbracketOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rbracketOffset + 1;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.COMPREHENSION;
-  }
-
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
deleted file mode 100644
index 973eedc..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
+++ /dev/null
@@ -1,62 +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;
-
-/** Syntax node for an expression of the form {@code t if cond else f}. */
-public final class ConditionalExpression extends Expression {
-
-  private final Expression t;
-  private final Expression cond;
-  private final Expression f;
-
-  public Expression getThenCase() {
-    return t;
-  }
-
-  public Expression getCondition() {
-    return cond;
-  }
-
-  public Expression getElseCase() {
-    return f;
-  }
-
-  /** Constructor for a conditional expression */
-  ConditionalExpression(FileLocations locs, Expression t, Expression cond, Expression f) {
-    super(locs);
-    this.t = t;
-    this.cond = cond;
-    this.f = f;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return t.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return f.getEndOffset();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.CONDITIONAL;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/CpuProfiler.java b/src/main/java/com/google/devtools/build/lib/syntax/CpuProfiler.java
deleted file mode 100644
index be836a4..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/CpuProfiler.java
+++ /dev/null
@@ -1,450 +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.ImmutableList;
-import com.google.protobuf.CodedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.zip.GZIPOutputStream;
-import javax.annotation.Nullable;
-
-// Overview
-//
-// A CPU profiler measures CPU cycles consumed by each thread.
-// It does not account for time a thread is blocked in I/O
-// (e.g. within a call to glob), or runnable but not actually
-// running, as happens when there are more runnable threads than cores.
-//
-// CPU profiling requires operating system support.
-// On POSIX systems, the setitimer system call causes
-// the kernel to signal an application periodically.
-// With the ITIMER_PROF option, setitimer delivers a
-// SIGPROF signal to a running thread each time its CPU usage
-// exceeds the specific quantum. A profiler builds a histogram
-// of these these signals, grouped by the current program
-// counter location, or more usefully by the complete stack of
-// program counter locations.
-//
-// This profiler calls a C++ function to install a SIGPROF handler.
-// Like all handlers for asynchronous signals (that is, signals not
-// caused by the execution of program instructions), it is extremely
-// constrained in what it may do. It cannot acquire locks, allocate
-// memory, or interact with the JVM in any way. Our signal handler
-// simply sends a message into a global pipe; the message records
-// the operating system's identifier (tid) for the signalled thread.
-//
-// Reading from the other end of the pipe is a Java thread, the router.
-// Its job is to map each OS tid to a StarlarkThread, if the
-// thread is currently executing Starlark code, and increment
-// a volatile counter in that StarlarkThread. If the thread is
-// not executing Starlark code, the router discards the event.
-// When a Starlark thread enters or leaves a function during profiling,
-// it updates the StarlarkThread-to-OS-thread mapping consulted by the
-// router.
-//
-// If the router does not drain the pipe in a timely manner (on the
-// order of 10s; see signal handler), the signal handler prints a
-// warning and discards the event.
-//
-// The router may induce a delay between the kernel signal and the
-// thread's stack sampling, during which Starlark execution may have
-// moved on to another function. Assuming uniform delay, this is
-// equivalent to shifting the phase but not the frequency of CPU ticks.
-// Nonetheless it may bias the profile because, for example,
-// it would cause a Starlark 'sleep' function to accrue a nonzero
-// number of CPU ticks that properly belong to the preceding computation.
-//
-// When a Starlark thread leaves any function, it reads and clears
-// its counter of CPU ticks. If the counter was nonzero, the thread
-// writes a copy of its stack to the profiler log in pprof form,
-// which is a gzip-compressed stream of protocol messages.
-//
-// The profiler is inherently global to the process,
-// and records the effects of all Starlark threads.
-// It may be started and stopped concurrent with Starlark execution,
-// allowing profiling of a portion of a long-running computation.
-
-/** A CPU profiler for Starlark (POSIX only for now). */
-final class CpuProfiler {
-
-  static {
-    JNI.load();
-  }
-
-  private final PprofWriter pprof;
-
-  private CpuProfiler(OutputStream out, Duration period) {
-    this.pprof = new PprofWriter(out, period);
-  }
-
-  // The active profiler, if any.
-  @Nullable private static volatile CpuProfiler instance;
-
-  /** Returns the active profiler, or null if inactive. */
-  @Nullable
-  static CpuProfiler get() {
-    return instance;
-  }
-
-  // Maps OS thread ID to StarlarkThread.
-  // The StarlarkThread is needed only for its cpuTicks field.
-  private static final Map<Integer, StarlarkThread> threads = new ConcurrentHashMap<>();
-
-  /**
-   * Associates the specified StarlarkThread with the current OS thread. Returns the StarlarkThread
-   * previously associated with it, if any.
-   */
-  @Nullable
-  static StarlarkThread setStarlarkThread(StarlarkThread thread) {
-    if (thread == null) {
-      return threads.remove(gettid());
-    } else {
-      return threads.put(gettid(), thread);
-    }
-  }
-
-  /** Start the profiler. */
-  static void start(OutputStream out, Duration period) {
-    if (!supported()) {
-      throw new UnsupportedOperationException("this platform does not support Starlark profiling");
-    }
-    if (instance != null) {
-      throw new IllegalStateException("profiler started twice without intervening stop");
-    }
-
-    startRouter();
-    if (!startTimer(period.toNanos() / 1000L)) {
-      throw new IllegalStateException("profile signal handler already in use");
-    }
-
-    instance = new CpuProfiler(out, period);
-  }
-
-  /** Stop the profiler and wait for the log to be written. */
-  static void stop() throws IOException {
-    if (instance == null) {
-      throw new IllegalStateException("stop without start");
-    }
-
-    CpuProfiler profiler = instance;
-    instance = null;
-
-    stopTimer();
-
-    // Finish writing the file and fail if there were any I/O errors.
-    profiler.pprof.writeEnd();
-  }
-
-  /** Records a profile event. */
-  void addEvent(int ticks, ImmutableList<Debug.Frame> stack) {
-    pprof.writeEvent(ticks, stack);
-  }
-
-  // ---- signal router ----
-
-  private static FileInputStream pipe;
-
-  // Starts the routing thread if not already started (idempotent).
-  // On return, it is safe to install the signal handler.
-  private static synchronized void startRouter() {
-    if (pipe == null) {
-      pipe = new FileInputStream(createPipe());
-      Thread router = new Thread(CpuProfiler::router, "SIGPROF router");
-      router.setDaemon(true);
-      router.start();
-    }
-  }
-
-  // The Router thread routes SIGPROF events (from the pipe)
-  // to the relevant StarlarkThread. Once started, it runs forever.
-  //
-  // TODO(adonovan): opt: a more efficient implementation of routing would be
-  // to use, instead of a pipe from the signal handler to the routing thread,
-  // a mapping, maintained in C++, from OS thread ID to cpuTicks pointer.
-  // The {add,remove}Thread operations would update this mapping,
-  // and the signal handler would read it. The mapping would have to
-  // be a lock-free hash table so that it can be safely read in an
-  // async signal handler. The pointer would point to the sole element
-  // of direct memory buffer belonging to the StarlarkThread, allocated
-  // by JNI NewDirectByteBuffer.
-  // In this way, the signal handler could update the StarlarkThread directly,
-  // saving 100 write+read calls per second per core.
-  //
-  private static void router() {
-    byte[] buf = new byte[4];
-    while (true) {
-      try {
-        int n = pipe.read(buf);
-        if (n < 0) {
-          throw new IllegalStateException("pipe closed");
-        }
-        if (n != 4) {
-          throw new IllegalStateException("short read");
-        }
-      } catch (IOException ex) {
-        throw new IllegalStateException("unexpected I/O error", ex);
-      }
-
-      int tid = int32be(buf);
-
-      // Record a CPU tick against tid.
-      //
-      // It's not safe to grab the thread's stack here because the thread
-      // may be changing it, so we increment the thread's counter.
-      // When the thread later observes the counter is non-zero,
-      // it gives us the stack by calling addEvent.
-      StarlarkThread thread = threads.get(tid);
-      if (thread != null) {
-        thread.cpuTicks.getAndIncrement();
-      }
-    }
-  }
-
-  // Decodes a signed 32-bit big-endian integer from b[0:4].
-  private static int int32be(byte[] b) {
-    return b[0] << 24 | (b[1] & 0xff) << 16 | (b[2] & 0xff) << 8 | (b[3] & 0xff);
-  }
-
-  // --- native code (see cpu_profiler) ---
-
-  // Reports whether the profiler is supported on this platform.
-  private static native boolean supported();
-
-  // Returns the read end of a pipe from which profile events may be read.
-  // Each event is an operating system thread ID encoded as uint32be.
-  private static native FileDescriptor createPipe();
-
-  // Starts the operating system's interval timer.
-  // The period must be a positive number of microseconds.
-  // Returns false if SIGPROF is already in use.
-  private static native boolean startTimer(long periodMicros);
-
-  // Stops the operating system's interval timer.
-  private static native void stopTimer();
-
-  // Returns the operating system's identifier for the calling thread.
-  private static native int gettid();
-
-  // Encoder for pprof format profiles.
-  // See https://github.com/google/pprof/tree/master/proto
-  // We encode the protocol messages by hand to avoid
-  // adding a dependency on the protocol compiler.
-  private static final class PprofWriter {
-
-    private final Duration period;
-    private final long startNano;
-    private GZIPOutputStream gz;
-    private CodedOutputStream enc;
-    private IOException error; // the first write error, if any; reported during stop()
-
-    PprofWriter(OutputStream out, Duration period) {
-      this.period = period;
-      this.startNano = System.nanoTime();
-
-      try {
-        this.gz = new GZIPOutputStream(out);
-        this.enc = CodedOutputStream.newInstance(gz);
-        getStringID(""); // entry 0 is always ""
-
-        // dimension and unit
-        ByteArrayOutputStream unit = new ByteArrayOutputStream();
-        CodedOutputStream unitEnc = CodedOutputStream.newInstance(unit);
-        unitEnc.writeInt64(VALUETYPE_TYPE, getStringID("CPU"));
-        unitEnc.writeInt64(VALUETYPE_UNIT, getStringID("microseconds"));
-        unitEnc.flush();
-
-        // informational fields of Profile
-        enc.writeByteArray(PROFILE_SAMPLE_TYPE, unit.toByteArray());
-        // magnitude of sampling period:
-        enc.writeInt64(PROFILE_PERIOD, period.toNanos() / 1000L);
-        // dimension and unit of period:
-        enc.writeByteArray(PROFILE_PERIOD_TYPE, unit.toByteArray());
-        // start (real) time of profile:
-        enc.writeInt64(PROFILE_TIME_NANOS, System.currentTimeMillis() * 1000000L);
-      } catch (IOException ex) {
-        this.error = ex;
-      }
-    }
-
-    synchronized void writeEvent(int ticks, ImmutableList<Debug.Frame> stack) {
-      if (this.error == null) {
-        try {
-          ByteArrayOutputStream sample = new ByteArrayOutputStream();
-          CodedOutputStream sampleEnc = CodedOutputStream.newInstance(sample);
-          sampleEnc.writeInt64(SAMPLE_VALUE, ticks * period.toNanos() / 1000L);
-          for (Debug.Frame fr : stack.reverse()) {
-            sampleEnc.writeUInt64(SAMPLE_LOCATION_ID, getLocationID(fr));
-          }
-          sampleEnc.flush();
-          enc.writeByteArray(PROFILE_SAMPLE, sample.toByteArray());
-        } catch (IOException ex) {
-          this.error = ex;
-        }
-      }
-    }
-
-    synchronized void writeEnd() throws IOException {
-      long endNano = System.nanoTime();
-      try {
-        enc.writeInt64(PROFILE_DURATION_NANOS, endNano - startNano);
-        enc.flush();
-        if (this.error != null) {
-          throw this.error; // retained from an earlier error
-        }
-      } finally {
-        gz.close();
-      }
-    }
-
-    // Field numbers from pprof protocol.
-    // See https://github.com/google/pprof/blob/master/proto/profile.proto
-    private static final int PROFILE_SAMPLE_TYPE = 1; // repeated ValueType
-    private static final int PROFILE_SAMPLE = 2; // repeated Sample
-    private static final int PROFILE_MAPPING = 3; // repeated Mapping
-    private static final int PROFILE_LOCATION = 4; // repeated Location
-    private static final int PROFILE_FUNCTION = 5; // repeated Function
-    private static final int PROFILE_STRING_TABLE = 6; // repeated string
-    private static final int PROFILE_TIME_NANOS = 9; // int64
-    private static final int PROFILE_DURATION_NANOS = 10; // int64
-    private static final int PROFILE_PERIOD_TYPE = 11; // ValueType
-    private static final int PROFILE_PERIOD = 12; // int64
-    private static final int VALUETYPE_TYPE = 1; // int64
-    private static final int VALUETYPE_UNIT = 2; // int64
-    private static final int SAMPLE_LOCATION_ID = 1; // repeated uint64
-    private static final int SAMPLE_VALUE = 2; // repeated int64
-    private static final int SAMPLE_LABEL = 3; // repeated Label
-    private static final int LABEL_KEY = 1; // int64
-    private static final int LABEL_STR = 2; // int64
-    private static final int LABEL_NUM = 3; // int64
-    private static final int LABEL_NUM_UNIT = 4; // int64
-    private static final int LOCATION_ID = 1; // uint64
-    private static final int LOCATION_MAPPING_ID = 2; // uint64
-    private static final int LOCATION_ADDRESS = 3; // uint64
-    private static final int LOCATION_LINE = 4; // repeated Line
-    private static final int LINE_FUNCTION_ID = 1; // uint64
-    private static final int LINE_LINE = 2; // int64
-    private static final int FUNCTION_ID = 1; // uint64
-    private static final int FUNCTION_NAME = 2; // int64
-    private static final int FUNCTION_SYSTEM_NAME = 3; // int64
-    private static final int FUNCTION_FILENAME = 4; // int64
-    private static final int FUNCTION_START_LINE = 5; // int64
-
-    // Every string, function, and PC location is emitted once
-    // and thereafter referred to by its identifier, a Long.
-    private final Map<String, Long> stringIDs = new HashMap<>();
-    private final Map<Long, Long> functionIDs = new HashMap<>(); // key is "address" of function
-    private final Map<Long, Long> locationIDs = new HashMap<>(); // key is "address" of PC location
-
-    // Returns the ID of the specified string,
-    // emitting a pprof string record the first time it is encountered.
-    private long getStringID(String s) throws IOException {
-      Long i = stringIDs.putIfAbsent(s, Long.valueOf(stringIDs.size()));
-      if (i == null) {
-        enc.writeString(PROFILE_STRING_TABLE, s);
-        return stringIDs.size() - 1L;
-      }
-      return i;
-    }
-
-    // Returns the ID of a StarlarkCallable for use in Line.FunctionId,
-    // emitting a pprof Function record the first time fn is encountered.
-    // The ID is the same as the function's logical address,
-    // which is supplied by the caller to avoid the need to recompute it.
-    private long getFunctionID(StarlarkCallable fn, long addr) throws IOException {
-      Long id = functionIDs.get(addr);
-      if (id == null) {
-        id = addr;
-
-        Location loc = fn.getLocation();
-        String filename = loc.file(); // TODO(adonovan): make WORKSPACE-relative
-        String name = fn.getName();
-        if (name.equals("<toplevel>")) {
-          name = filename;
-        }
-
-        long nameID = getStringID(name);
-
-        ByteArrayOutputStream fun = new ByteArrayOutputStream();
-        CodedOutputStream funEnc = CodedOutputStream.newInstance(fun);
-        funEnc.writeUInt64(FUNCTION_ID, id);
-        funEnc.writeInt64(FUNCTION_NAME, nameID);
-        funEnc.writeInt64(FUNCTION_SYSTEM_NAME, nameID);
-        funEnc.writeInt64(FUNCTION_FILENAME, getStringID(filename));
-        funEnc.writeInt64(FUNCTION_START_LINE, (long) loc.line());
-        funEnc.flush();
-        enc.writeByteArray(PROFILE_FUNCTION, fun.toByteArray());
-
-        functionIDs.put(addr, id);
-      }
-      return id;
-    }
-
-    // Returns the ID of the location denoted by fr,
-    // emitting a pprof Location record the first time it is encountered.
-    // For Starlark frames, this is the Frame pc.
-    private long getLocationID(Debug.Frame fr) throws IOException {
-      StarlarkCallable fn = fr.getFunction();
-      // fnAddr identifies a function as a whole.
-      int fnAddr = System.identityHashCode(fn); // very imperfect
-
-      // pcAddr identifies the current program point.
-      //
-      // For now, this is the same as fnAddr, because
-      // we don't track the syntax node currently being
-      // evaluated. Statement-level profile information
-      // in the leaf function (displayed by 'pprof list <fn>')
-      // is thus unreliable for now.
-      long pcAddr = fnAddr;
-      if (fn instanceof StarlarkFunction) {
-        // TODO(adonovan): when we use a byte code representation
-        // of function bodies, mix the program counter fr.pc into fnAddr.
-        // TODO(adonovan): even cleaner: treat each function's byte
-        // code segment as its own Profile.Mapping, indexed by pc.
-        //
-        // pcAddr = (pcAddr << 16) ^ fr.pc;
-      }
-
-      Long id = locationIDs.get(pcAddr);
-      if (id == null) {
-        id = pcAddr;
-
-        ByteArrayOutputStream line = new ByteArrayOutputStream();
-        CodedOutputStream lineenc = CodedOutputStream.newInstance(line);
-        lineenc.writeUInt64(LINE_FUNCTION_ID, getFunctionID(fn, fnAddr));
-        lineenc.writeInt64(LINE_LINE, (long) fr.getLocation().line());
-        lineenc.flush();
-
-        ByteArrayOutputStream loc = new ByteArrayOutputStream();
-        CodedOutputStream locenc = CodedOutputStream.newInstance(loc);
-        locenc.writeUInt64(LOCATION_ID, id);
-        locenc.writeUInt64(LOCATION_ADDRESS, pcAddr);
-        locenc.writeByteArray(LOCATION_LINE, line.toByteArray());
-        locenc.flush();
-        enc.writeByteArray(PROFILE_LOCATION, loc.toByteArray());
-
-        locationIDs.put(pcAddr, id);
-      }
-      return id;
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Debug.java b/src/main/java/com/google/devtools/build/lib/syntax/Debug.java
deleted file mode 100644
index c0c734c..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Debug.java
+++ /dev/null
@@ -1,175 +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.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Predicate;
-import javax.annotation.Nullable;
-
-/** Debugger API. */
-// TODO(adonovan): move Debugger to Debug.Debugger.
-public final class Debug {
-
-  /**
-   * A simple interface for the Starlark interpreter to notify a debugger of events during
-   * execution.
-   */
-  public interface Debugger {
-    /** Notify the debugger that execution is at the point immediately before {@code loc}. */
-    void before(StarlarkThread thread, Location loc);
-
-    /** Notify the debugger that it will no longer receive events from the interpreter. */
-    void close();
-  }
-
-  /** A Starlark value that can expose additional information to a debugger. */
-  public interface ValueWithDebugAttributes extends StarlarkValue {
-    /**
-     * Returns a list of DebugAttribute of this value. For example, it can be the internal fields of
-     * a value that are not accessible from Starlark, or the values inside a collection.
-     */
-    ImmutableList<DebugAttribute> getDebugAttributes();
-  }
-
-  /** A name/value pair used in the return value of getDebugAttributes. */
-  public static final class DebugAttribute {
-    public final String name;
-    public final Object value; // a legal Starlark value
-
-    public DebugAttribute(String name, Object value) {
-      this.name = name;
-      this.value = value;
-    }
-  }
-
-  /** See stepControl */
-  public interface ReadyToPause extends Predicate<StarlarkThread> {}
-
-  /**
-   * Describes the stepping behavior that should occur when execution of a thread is continued.
-   * (Debugger API)
-   */
-  public enum Stepping {
-    /** Continue execution without stepping. */
-    NONE,
-    /**
-     * If the thread is paused on a statement that contains a function call, step into that
-     * function. Otherwise, this is the same as OVER.
-     */
-    INTO,
-    /**
-     * Step over the current statement and any functions that it may call, stopping at the next
-     * statement in the same frame. If no more statements are available in the current frame, same
-     * as OUT.
-     */
-    OVER,
-    /**
-     * Continue execution until the current frame has been exited and then pause. If we are
-     * currently in the outer-most frame, same as NONE.
-     */
-    OUT,
-  }
-
-  private Debug() {} // uninstantiable
-
-  static final AtomicReference<Debugger> debugger = new AtomicReference<>();
-
-  /**
-   * Installs a global hook that causes subsequently executed Starlark threads to notify the
-   * debugger of important events. Closes any previously set debugger. Call {@code
-   * setDebugger(null)} to disable debugging.
-   */
-  public static void setDebugger(Debugger dbg) {
-    Debugger prev = debugger.getAndSet(dbg);
-    if (prev != null) {
-      prev.close();
-    }
-  }
-
-  /**
-   * Returns a copy of the current stack of call frames, outermost call first.
-   *
-   * <p>This function is intended for use only when execution of {@code thread} is stopped, for
-   * example at a breakpoint. The resulting DebugFrames should not be retained after execution of
-   * the thread has resumed. Most clients should instead use {@link StarlarkThread#getCallStack}.
-   */
-  public static ImmutableList<Frame> getCallStack(StarlarkThread thread) {
-    return thread.getDebugCallStack();
-  }
-
-  /**
-   * Given a requested stepping behavior, returns a predicate over the context that tells the
-   * debugger when to pause. (Debugger API)
-   *
-   * <p>The predicate will return true if we are at the next statement where execution should pause,
-   * and it will return false if we are not yet at that statement. No guarantee is made about the
-   * predicate's return value after we have reached the desired statement.
-   *
-   * <p>A null return value indicates that no further pausing should occur.
-   */
-  @Nullable
-  public static Debug.ReadyToPause stepControl(StarlarkThread th, Debug.Stepping stepping) {
-    final int depth = th.getCallStackSize();
-    switch (stepping) {
-      case NONE:
-        return null;
-      case INTO:
-        // pause at the very next statement
-        return thread -> true;
-      case OVER:
-        return thread -> thread.getCallStackSize() <= depth;
-      case OUT:
-        // if we're at the outermost frame, same as NONE
-        return depth == 0 ? null : thread -> thread.getCallStackSize() < depth;
-    }
-    throw new IllegalArgumentException("Unsupported stepping type: " + stepping);
-  }
-
-  /** Debugger interface to the interpreter's internal call frame representation. */
-  public interface Frame {
-
-    /** Returns function called in this frame. */
-    StarlarkCallable getFunction();
-
-    /** Returns the location of the current program counter. */
-    Location getLocation();
-
-    /** Returns the local environment of this frame. */
-    ImmutableMap<String, Object> getLocals();
-  }
-
-  /**
-   * Interface by which debugging tools are notified of a thread entering or leaving its top-level
-   * frame.
-   */
-  public interface ThreadHook {
-    void onPushFirst(StarlarkThread thread);
-
-    void onPopLast(StarlarkThread thread);
-  }
-
-  static ThreadHook threadHook = null;
-
-  /**
-   * Installs a global hook that is notified each time a thread pushes or pops its top-level frame.
-   * This interface is provided to support special tools; ordinary clients should have no need for
-   * it.
-   */
-  public static void setThreadHook(ThreadHook hook) {
-    threadHook = hook;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/DefStatement.java
deleted file mode 100644
index 137bfc7..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/DefStatement.java
+++ /dev/null
@@ -1,96 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import javax.annotation.Nullable;
-
-/** Syntax node for a 'def' statement, which defines a function. */
-public final class DefStatement extends Statement {
-
-  private final int defOffset;
-  private final Identifier identifier;
-  private final ImmutableList<Statement> body; // non-empty if well formed
-  private final ImmutableList<Parameter> parameters;
-
-  // set by resolver
-  @Nullable private Resolver.Function resolved;
-
-  DefStatement(
-      FileLocations locs,
-      int defOffset,
-      Identifier identifier,
-      ImmutableList<Parameter> parameters,
-      ImmutableList<Statement> body) {
-    super(locs);
-    this.defOffset = defOffset;
-    this.identifier = identifier;
-    this.parameters = Preconditions.checkNotNull(parameters);
-    this.body = Preconditions.checkNotNull(body);
-  }
-
-  @Override
-  public String toString() {
-    // "def f(...): \n"
-    StringBuilder buf = new StringBuilder();
-    new NodePrinter(buf).printDefSignature(this);
-    buf.append(" ...\n");
-    return buf.toString();
-  }
-
-  public Identifier getIdentifier() {
-    return identifier;
-  }
-
-  public ImmutableList<Statement> getBody() {
-    return body;
-  }
-
-  public ImmutableList<Parameter> getParameters() {
-    return parameters;
-  }
-
-  void setResolvedFunction(Resolver.Function resolved) {
-    this.resolved = resolved;
-  }
-
-  /** Returns information about the resolved function. Set by the resolver. */
-  @Nullable
-  public Resolver.Function getResolvedFunction() {
-    return resolved;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return defOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return body.isEmpty()
-        ? identifier.getEndOffset() // wrong, but tree is ill formed
-        : body.get(body.size() - 1).getEndOffset();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.DEF;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Dict.java b/src/main/java/com/google/devtools/build/lib/syntax/Dict.java
deleted file mode 100644
index 4e696db..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Dict.java
+++ /dev/null
@@ -1,656 +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 java.lang.Math.max;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-import net.starlark.java.annot.StarlarkMethod;
-
-/**
- * A Dict is a Starlark dictionary (dict), a mapping from keys to values.
- *
- * <p>Dicts are iterable in both Java and Starlark; the iterator yields successive keys.
- *
- * <p>Although this implements the {@link Map} interface, it is not mutable via that interface's
- * methods. Instead, use the mutators that take in a {@link Mutability} object.
- */
-@StarlarkBuiltin(
-    name = "dict",
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc =
-        "dict is a built-in type representing an associative mapping or <i>dictionary</i>. A"
-            + " dictionary supports indexing using <code>d[k]</code> and key membership testing"
-            + " using <code>k in d</code>; both operations take constant time. Unfrozen"
-            + " dictionaries are mutable, and may be updated by assigning to <code>d[k]</code> or"
-            + " by calling certain methods. Dictionaries are iterable; iteration yields the"
-            + " sequence of keys in insertion order. Iteration order is unaffected by updating the"
-            + " value associated with an existing key, but is affected by removing then"
-            + " reinserting a key.\n"
-            + "<pre>d = {0: 0, 2: 2, 1: 1}\n"
-            + "[k for k in d]  # [0, 2, 1]\n"
-            + "d.pop(2)\n"
-            + "d[0], d[2] = \"a\", \"b\"\n"
-            + "0 in d, \"a\" in d  # (True, False)\n"
-            + "[(k, v) for k, v in d.items()]  # [(0, \"a\"), (1, 1), (2, \"b\")]\n"
-            + "</pre>\n"
-            + "<p>There are three ways to construct a dictionary:\n"
-            + "<ol>\n"
-            + "<li>A dictionary expression <code>{k: v, ...}</code> yields a new dictionary with"
-            + " the specified key/value entries, inserted in the order they appear in the"
-            + " expression. Evaluation fails if any two key expressions yield the same"
-            + " value.\n"
-            + "<li>A dictionary comprehension <code>{k: v for vars in seq}</code> yields a new"
-            + " dictionary into which each key/value pair is inserted in loop iteration order."
-            + " Duplicates are permitted: the first insertion of a given key determines its"
-            + " position in the sequence, and the last determines its associated value.\n"
-            + "<pre class=\"language-python\">\n"
-            + "{k: v for k, v in ((\"a\", 0), (\"b\", 1), (\"a\", 2))}  # {\"a\": 2, \"b\": 1}\n"
-            + "{i: 2*i for i in range(3)}  # {0: 0, 1: 2, 2: 4}\n"
-            + "</pre>\n"
-            + "<li>A call to the built-in <a href=\"globals.html#dict\">dict</a> function returns"
-            + " a dictionary containing the specified entries, which are inserted in argument"
-            + " order, positional arguments before named. As with comprehensions, duplicate keys"
-            + " are permitted.\n"
-            + "</ol>")
-// TODO(b/64208606): eliminate these type parameters as they are wildly unsound.
-// Starlark code may update a Dict in ways incompatible with its Java
-// parameterized type. There is no realistic static or dynamic way to prevent
-// this, as Java parameterized types are not accessible at runtime.
-// Every cast to a parameterized type is a lie.
-// Unchecked warnings should be treated as errors.
-// Ditto Sequence.
-public final class Dict<K, V>
-    implements Map<K, V>,
-        StarlarkValue,
-        Mutability.Freezable,
-        StarlarkIndexable,
-        StarlarkIterable<K> {
-
-  private final LinkedHashMap<K, V> contents;
-  private int iteratorCount; // number of active iterators (unused once frozen)
-
-  /** Final except for {@link #unsafeShallowFreeze}; must not be modified any other way. */
-  private Mutability mutability;
-
-  private Dict(@Nullable Mutability mutability, LinkedHashMap<K, V> contents) {
-    this.mutability = mutability == null ? Mutability.IMMUTABLE : mutability;
-    this.contents = contents;
-  }
-
-  private Dict(@Nullable Mutability mutability) {
-    this(mutability, new LinkedHashMap<>());
-  }
-
-  private Dict(@Nullable Mutability mutability, int initialCapacity) {
-    this(mutability, new LinkedHashMap<>(initialCapacity));
-  }
-
-  /**
-   * Takes ownership of the supplied LinkedHashMap and returns a new Dict that wraps it. The caller
-   * must not subsequently modify the map, but the Dict may do so.
-   */
-  static <K, V> Dict<K, V> wrap(@Nullable Mutability mutability, LinkedHashMap<K, V> contents) {
-    return new Dict<>(mutability, contents);
-  }
-
-  @Override
-  public boolean truth() {
-    return !isEmpty();
-  }
-
-  @Override
-  public boolean isImmutable() {
-    return mutability().isFrozen();
-  }
-
-  @Override
-  public boolean updateIteratorCount(int delta) {
-    if (mutability().isFrozen()) {
-      return false;
-    }
-    if (delta > 0) {
-      iteratorCount++;
-    } else if (delta < 0) {
-      iteratorCount--;
-    }
-    return iteratorCount > 0;
-  }
-
-  @Override
-  public boolean isHashable() {
-    return false; // even a frozen dict is unhashable
-  }
-
-  @Override
-  public int hashCode() {
-    return contents.hashCode(); // not called by Dict.put (because !isHashable)
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return contents.equals(o); // not called by Dict.put (because !isHashable)
-  }
-
-  @Override
-  public Iterator<K> iterator() {
-    return contents.keySet().iterator();
-  }
-
-  @StarlarkMethod(
-      name = "get",
-      doc =
-          "Returns the value for <code>key</code> if <code>key</code> is in the dictionary, "
-              + "else <code>default</code>. If <code>default</code> is not given, it defaults to "
-              + "<code>None</code>, so that this method never throws an error.",
-      parameters = {
-        @Param(name = "key", noneable = true, doc = "The key to look for."),
-        @Param(
-            name = "default",
-            defaultValue = "None",
-            noneable = true,
-            named = true,
-            doc = "The default value to use (instead of None) if the key is not found.")
-      },
-      allowReturnNones = true,
-      useStarlarkThread = true)
-  // TODO(adonovan): This method is named get2 as a temporary workaround for a bug in
-  // StarlarkInterfaceUtils.getStarlarkMethod. The two 'get' methods cause it to get
-  // confused as to which one has the annotation. Fix it and remove "2" suffix.
-  public Object get2(Object key, Object defaultValue, StarlarkThread thread) throws EvalException {
-    Object v = this.get(key);
-    if (v != null) {
-      return v;
-    }
-
-    // This statement is executed for its effect, which is to throw "unhashable"
-    // if key is unhashable, instead of returning defaultValue.
-    // I think this is a bug: the correct behavior is simply 'return defaultValue'.
-    // See https://github.com/bazelbuild/starlark/issues/65.
-    containsKey(thread.getSemantics(), key);
-
-    return defaultValue;
-  }
-
-  @StarlarkMethod(
-      name = "pop",
-      doc =
-          "Removes a <code>key</code> from the dict, and returns the associated value. "
-              + "If no entry with that key was found, remove nothing and return the specified "
-              + "<code>default</code> value; if no default value was specified, fail instead.",
-      parameters = {
-        @Param(name = "key", type = Object.class, doc = "The key.", noneable = true),
-        @Param(
-            name = "default",
-            type = Object.class,
-            defaultValue = "unbound",
-            named = true,
-            noneable = true,
-            doc = "a default value if the key is absent."),
-      },
-      useStarlarkThread = true)
-  public Object pop(Object key, Object defaultValue, StarlarkThread thread) throws EvalException {
-    Object value = get(key);
-    if (value != null) {
-      remove(key, (Location) null);
-      return value;
-    }
-    if (defaultValue != Starlark.UNBOUND) {
-      return defaultValue;
-    }
-    // TODO(adonovan): improve error; this ain't Python.
-    throw Starlark.errorf("KeyError: %s", Starlark.repr(key));
-  }
-
-  @StarlarkMethod(
-      name = "popitem",
-      doc =
-          "Remove and return an arbitrary <code>(key, value)</code> pair from the dictionary. "
-              + "<code>popitem()</code> is useful to destructively iterate over a dictionary, "
-              + "as often used in set algorithms. "
-              + "If the dictionary is empty, calling <code>popitem()</code> fails. "
-              + "It is deterministic which pair is returned.",
-      useStarlarkThread = true)
-  public Tuple<Object> popitem(StarlarkThread thread) throws EvalException {
-    if (isEmpty()) {
-      throw Starlark.errorf("popitem(): dictionary is empty");
-    }
-    Object key = keySet().iterator().next();
-    Object value = get(key);
-    remove(key, (Location) null);
-    return Tuple.pair(key, value);
-  }
-
-  @StarlarkMethod(
-      name = "setdefault",
-      doc =
-          "If <code>key</code> is in the dictionary, return its value. "
-              + "If not, insert key with a value of <code>default</code> "
-              + "and return <code>default</code>. "
-              + "<code>default</code> defaults to <code>None</code>.",
-      parameters = {
-        @Param(name = "key", type = Object.class, doc = "The key."),
-        @Param(
-            name = "default",
-            type = Object.class,
-            defaultValue = "None",
-            named = true,
-            noneable = true,
-            doc = "a default value if the key is absent."),
-      })
-  @SuppressWarnings("unchecked") // Cast of value to V
-  public Object setdefault(K key, Object defaultValue) throws EvalException {
-    // TODO(adonovan): opt: use putIfAbsent to avoid hashing twice.
-    Object value = get(key);
-    if (value != null) {
-      return value;
-    }
-    put(key, (V) defaultValue, (Location) null);
-    return defaultValue;
-  }
-
-  @StarlarkMethod(
-      name = "update",
-      doc =
-          "Update the dictionary with an optional positional argument <code>[pairs]</code> "
-              + " and an optional set of keyword arguments <code>[, name=value[, ...]</code>\n"
-              + "If the positional argument <code>pairs</code> is present, it must be "
-              + "<code>None</code>, another <code>dict</code>, or some other iterable. "
-              + "If it is another <code>dict</code>, then its key/value pairs are inserted. "
-              + "If it is an iterable, it must provide a sequence of pairs (or other iterables "
-              + "of length 2), each of which is treated as a key/value pair to be inserted.\n"
-              + "For each <code>name=value</code> argument present, the name is converted to a "
-              + "string and used as the key for an insertion into D, with its corresponding "
-              + "value being <code>value</code>.",
-      parameters = {
-        @Param(
-            name = "args",
-            type = Object.class,
-            defaultValue = "[]",
-            doc =
-                "Either a dictionary or a list of entries. Entries must be tuples or lists with "
-                    + "exactly two elements: key, value."),
-      },
-      extraKeywords = @Param(name = "kwargs", doc = "Dictionary of additional entries."),
-      useStarlarkThread = true)
-  @SuppressWarnings("unchecked")
-  public NoneType update(Object args, Dict<String, Object> kwargs, StarlarkThread thread)
-      throws EvalException {
-    // TODO(adonovan): opt: don't materialize dict; call put directly.
-
-    // All these types and casts are lies.
-    Dict<K, V> dict =
-        args instanceof Dict
-            ? (Dict<K, V>) args
-            : getDictFromArgs("update", args, thread.mutability());
-    dict = Dict.plus(dict, (Dict<K, V>) kwargs, thread.mutability());
-    putAll(dict, (Location) null);
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(
-      name = "values",
-      doc =
-          "Returns the list of values:"
-              + "<pre class=\"language-python\">"
-              + "{2: \"a\", 4: \"b\", 1: \"c\"}.values() == [\"a\", \"b\", \"c\"]</pre>\n",
-      useStarlarkThread = true)
-  public StarlarkList<?> values0(StarlarkThread thread) throws EvalException {
-    return StarlarkList.copyOf(thread.mutability(), values());
-  }
-
-  @StarlarkMethod(
-      name = "items",
-      doc =
-          "Returns the list of key-value tuples:"
-              + "<pre class=\"language-python\">"
-              + "{2: \"a\", 4: \"b\", 1: \"c\"}.items() == [(2, \"a\"), (4, \"b\"), (1, \"c\")]"
-              + "</pre>\n",
-      useStarlarkThread = true)
-  public StarlarkList<?> items(StarlarkThread thread) throws EvalException {
-    Object[] array = new Object[size()];
-    int i = 0;
-    for (Map.Entry<?, ?> e : entrySet()) {
-      array[i++] = Tuple.pair(e.getKey(), e.getValue());
-    }
-    return StarlarkList.wrap(thread.mutability(), array);
-  }
-
-  @StarlarkMethod(
-      name = "keys",
-      doc =
-          "Returns the list of keys:"
-              + "<pre class=\"language-python\">{2: \"a\", 4: \"b\", 1: \"c\"}.keys() == [2, 4, 1]"
-              + "</pre>\n",
-      useStarlarkThread = true)
-  public StarlarkList<?> keys(StarlarkThread thread) throws EvalException {
-    Object[] array = new Object[size()];
-    int i = 0;
-    for (Map.Entry<?, ?> e : entrySet()) {
-      array[i++] = e.getKey();
-    }
-    return StarlarkList.wrap(thread.mutability(), array);
-  }
-
-  private static final Dict<?, ?> EMPTY = of(Mutability.IMMUTABLE);
-
-  /** Returns an immutable empty dict. */
-  // Safe because the empty singleton is immutable.
-  @SuppressWarnings("unchecked")
-  public static <K, V> Dict<K, V> empty() {
-    return (Dict<K, V>) EMPTY;
-  }
-
-  /** Returns a new empty dict with the specified mutability. */
-  public static <K, V> Dict<K, V> of(@Nullable Mutability mu) {
-    return new Dict<>(mu);
-  }
-
-  /** Returns a new dict with the specified mutability and a single entry. */
-  public static <K, V> Dict<K, V> of(@Nullable Mutability mu, K k, V v) {
-    return new Dict<K, V>(mu).putUnsafe(k, v);
-  }
-
-  /** Returns a new dict with the specified mutability and two entries. */
-  public static <K, V> Dict<K, V> of(@Nullable Mutability mu, K k1, V v1, K k2, V v2) {
-    return new Dict<K, V>(mu).putUnsafe(k1, v1).putUnsafe(k2, v2);
-  }
-
-  /** Returns a new dict with the specified mutability containing the entries of {@code m}. */
-  @SuppressWarnings("unchecked")
-  public static <K, V> Dict<K, V> copyOf(@Nullable Mutability mu, Map<? extends K, ? extends V> m) {
-    // TODO(laurentlb): Move this method out of this file and rename it. It should go with
-    // Starlark.fromJava; its main purpose is to convert a Java value to Starlark.
-    Dict<K, V> dict = new Dict<>(mu);
-    for (Map.Entry<?, ?> e : m.entrySet()) {
-      dict.contents.put((K) e.getKey(), (V) Starlark.fromJava(e.getValue(), mu));
-    }
-    return dict;
-  }
-
-  /** Puts the given entry into the dict, without calling {@link #checkMutable}. */
-  private Dict<K, V> putUnsafe(K k, V v) {
-    contents.put(k, v);
-    return this;
-  }
-
-  @Override
-  public Mutability mutability() {
-    return mutability;
-  }
-
-  @Override
-  public void unsafeShallowFreeze() {
-    Mutability.Freezable.checkUnsafeShallowFreezePrecondition(this);
-    this.mutability = Mutability.IMMUTABLE;
-  }
-
-  /**
-   * Puts an entry into a dict, after validating that mutation is allowed.
-   *
-   * @param key the key of the added entry
-   * @param value the value of the added entry
-   * @param unused a nonce value to select this overload, not Map.put
-   * @throws EvalException if the key is invalid or the dict is frozen
-   */
-  public void put(K key, V value, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    EvalUtils.checkHashable(key);
-    contents.put(key, value);
-  }
-
-  /**
-   * Puts all the entries from a given map into the dict, after validating that mutation is allowed.
-   *
-   * @param map the map whose entries are added
-   * @param unused a nonce value to select this overload, not Map.put
-   * @throws EvalException if some key is invalid or the dict is frozen
-   */
-  public <KK extends K, VV extends V> void putAll(Map<KK, VV> map, Location unused)
-      throws EvalException {
-    Starlark.checkMutable(this);
-    for (Map.Entry<KK, VV> e : map.entrySet()) {
-      KK k = e.getKey();
-      EvalUtils.checkHashable(k);
-      contents.put(k, e.getValue());
-    }
-  }
-
-  /**
-   * Deletes the entry associated with the given key.
-   *
-   * @param key the key to delete
-   * @param unused a nonce value to select this overload, not Map.put
-   * @return the value associated to the key, or {@code null} if not present
-   * @throws EvalException if the dict is frozen
-   */
-  V remove(Object key, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    return contents.remove(key);
-  }
-
-  @StarlarkMethod(name = "clear", doc = "Remove all items from the dictionary.")
-  public NoneType clearDict() throws EvalException {
-    clear(null);
-    return Starlark.NONE;
-  }
-
-  /**
-   * Clears the dict.
-   *
-   * @param unused a nonce value to select this overload, not Map.put
-   * @throws EvalException if the dict is frozen
-   */
-  private void clear(Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    contents.clear();
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    printer.printList(entrySet(), "{", ", ", "}");
-  }
-
-  @Override
-  public String toString() {
-    return Starlark.repr(this);
-  }
-
-  /**
-   * Casts a non-null Starlark value {@code x} to a {@code Dict<K, V>} after checking that all keys
-   * and values are instances of {@code keyType} and {@code valueType}, respectively. On error, it
-   * throws an EvalException whose message includes {@code what}, ideally a string literal, as a
-   * description of the role of {@code x}. If x is null, it returns an immutable empty dict.
-   */
-  public static <K, V> Dict<K, V> cast(Object x, Class<K> keyType, Class<V> valueType, String what)
-      throws EvalException {
-    Preconditions.checkNotNull(x);
-    if (!(x instanceof Dict)) {
-      throw Starlark.errorf("got %s for '%s', want dict", Starlark.type(x), what);
-    }
-
-    for (Map.Entry<?, ?> e : ((Map<?, ?>) x).entrySet()) {
-      if (!keyType.isAssignableFrom(e.getKey().getClass())
-          || !valueType.isAssignableFrom(e.getValue().getClass())) {
-        // TODO(adonovan): change message to "found <K2, V2> entry",
-        // without suggesting that the entire dict is <K2, V2>.
-        throw Starlark.errorf(
-            "got dict<%s, %s> for '%s', want dict<%s, %s>",
-            Starlark.type(e.getKey()),
-            Starlark.type(e.getValue()),
-            what,
-            Starlark.classType(keyType),
-            Starlark.classType(valueType));
-      }
-    }
-
-    @SuppressWarnings("unchecked") // safe
-    Dict<K, V> res = (Dict<K, V>) x;
-    return res;
-  }
-
-  /** Like {@link #cast}, but if x is None, returns an empty Dict. */
-  public static <K, V> Dict<K, V> noneableCast(
-      Object x, Class<K> keyType, Class<V> valueType, String what) throws EvalException {
-    return x == Starlark.NONE ? empty() : cast(x, keyType, valueType, what);
-  }
-
-  @Override
-  public Object getIndex(StarlarkSemantics semantics, Object key) throws EvalException {
-    Object v = get(key);
-    if (v == null) {
-      throw Starlark.errorf("key %s not found in dictionary", Starlark.repr(key));
-    }
-    return v;
-  }
-
-  @Override
-  public boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalException {
-    EvalUtils.checkHashable(key);
-    return this.containsKey(key);
-  }
-
-  static <K, V> Dict<K, V> plus(
-      Dict<? extends K, ? extends V> left,
-      Dict<? extends K, ? extends V> right,
-      @Nullable Mutability mu) {
-    Dict<K, V> result = new Dict<>(mu, max(left.size(), right.size()));
-    // Update underlying map contents directly, input dicts already contain valid objects
-    result.contents.putAll(left.contents);
-    result.contents.putAll(right.contents);
-    return result;
-  }
-
-  @SuppressWarnings("unchecked")
-  static <K, V> Dict<K, V> getDictFromArgs(String funcname, Object args, @Nullable Mutability mu)
-      throws EvalException {
-    Iterable<?> seq;
-    try {
-      seq = Starlark.toIterable(args);
-    } catch (EvalException ex) {
-      throw Starlark.errorf("in %s, got %s, want iterable", funcname, Starlark.type(args));
-    }
-    Dict<K, V> result = Dict.of(mu);
-    int pos = 0;
-    for (Object item : seq) {
-      Iterable<?> seq2;
-      try {
-        seq2 = Starlark.toIterable(item);
-      } catch (EvalException ex) {
-        throw Starlark.errorf(
-            "in %s, dictionary update sequence element #%d is not iterable (%s)",
-            funcname, pos, Starlark.type(item));
-      }
-      // TODO(adonovan): opt: avoid unnecessary allocations and copies.
-      // Why is there no operator to compute len(x), following the spec, without iterating??
-      List<Object> pair = Lists.newArrayList(seq2);
-      if (pair.size() != 2) {
-        throw Starlark.errorf(
-            "in %s, item #%d has length %d, but exactly two elements are required",
-            funcname, pos, pair.size());
-      }
-      // These casts are lies
-      result.put((K) pair.get(0), (V) pair.get(1), null);
-      pos++;
-    }
-    return result;
-  }
-
-  // java.util.Map accessors
-
-  @Override
-  public boolean containsKey(Object key) {
-    return contents.containsKey(key);
-  }
-
-  @Override
-  public boolean containsValue(Object value) {
-    return contents.containsValue(value);
-  }
-
-  @Override
-  public Set<Map.Entry<K, V>> entrySet() {
-    return Collections.unmodifiableMap(contents).entrySet();
-  }
-
-  @Override
-  public V get(Object key) {
-    return contents.get(key);
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return contents.isEmpty();
-  }
-
-  @Override
-  public Set<K> keySet() {
-    return Collections.unmodifiableMap(contents).keySet();
-  }
-
-  @Override
-  public int size() {
-    return contents.size();
-  }
-
-  @Override
-  public Collection<V> values() {
-    return Collections.unmodifiableMap(contents).values();
-  }
-
-  // disallowed java.util.Map update operations
-
-  // TODO(adonovan): make mutability exception a subclass of (unchecked)
-  // UnsupportedOperationException, allowing the primary Dict operations
-  // to satisfy the Map operations below in the usual way (like ImmutableMap does).
-  // Add "ForStarlark" suffix to disambiguate StarlarkMethod-annotated methods.
-  // Same for StarlarkList.
-
-  @Deprecated
-  @Override
-  public void clear() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Deprecated
-  @Override
-  public V put(K key, V value) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Deprecated
-  @Override
-  public void putAll(Map<? extends K, ? extends V> map) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Deprecated
-  @Override
-  public V remove(Object key) {
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DictExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DictExpression.java
deleted file mode 100644
index fdb5346..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/DictExpression.java
+++ /dev/null
@@ -1,98 +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 com.google.common.collect.ImmutableList;
-import java.util.List;
-
-/** Syntax node for dict expressions. */
-public final class DictExpression extends Expression {
-
-  /** A key/value pair in a dict expression or comprehension. */
-  public static final class Entry extends Node {
-
-    private final Expression key;
-    private final int colonOffset;
-    private final Expression value;
-
-    Entry(FileLocations locs, Expression key, int colonOffset, Expression value) {
-      super(locs);
-      this.key = key;
-      this.colonOffset = colonOffset;
-      this.value = value;
-    }
-
-    public Expression getKey() {
-      return key;
-    }
-
-    public Expression getValue() {
-      return value;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return key.getStartOffset();
-    }
-
-    @Override
-    public int getEndOffset() {
-      return value.getEndOffset();
-    }
-
-    public Location getColonLocation() {
-      return locs.getLocation(colonOffset);
-    }
-
-    @Override
-    public void accept(NodeVisitor visitor) {
-      visitor.visit(this);
-    }
-  }
-
-  private final int lbraceOffset;
-  private final ImmutableList<Entry> entries;
-  private final int rbraceOffset;
-
-  DictExpression(FileLocations locs, int lbraceOffset, List<Entry> entries, int rbraceOffset) {
-    super(locs);
-    this.lbraceOffset = lbraceOffset;
-    this.entries = ImmutableList.copyOf(entries);
-    this.rbraceOffset = rbraceOffset;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return lbraceOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rbraceOffset + 1;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.DICT_EXPR;
-  }
-
-  public ImmutableList<Entry> getEntries() {
-    return entries;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
deleted file mode 100644
index 9e7a541..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ /dev/null
@@ -1,62 +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;
-
-
-/** Syntax node for a dot expression. e.g. obj.field, but not obj.method() */
-public final class DotExpression extends Expression {
-
-  private final Expression object;
-  private final int dotOffset;
-  private final Identifier field;
-
-  DotExpression(FileLocations locs, Expression object, int dotOffset, Identifier field) {
-    super(locs);
-    this.object = object;
-    this.dotOffset = dotOffset;
-    this.field = field;
-  }
-
-  public Expression getObject() {
-    return object;
-  }
-
-  public Identifier getField() {
-    return field;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return object.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return field.getEndOffset();
-  }
-
-  public Location getDotLocation() {
-    return locs.getLocation(dotOffset);
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.DOT;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java b/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
deleted file mode 100644
index d9fd8c0..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
+++ /dev/null
@@ -1,791 +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 com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import net.starlark.java.spelling.SpellChecker;
-
-/** A syntax-tree-walking evaluator for StarlarkFunction bodies. */
-final class Eval {
-
-  private Eval() {} // uninstantiable
-
-  // ---- entry point ----
-
-  // Called from StarlarkFunction.fastcall.
-  static Object execFunctionBody(StarlarkThread.Frame fr, List<Statement> statements)
-      throws EvalException, InterruptedException {
-    fr.thread.checkInterrupt();
-    execStatements(fr, statements, /*indented=*/ false);
-    return fr.result;
-  }
-
-  private static StarlarkFunction fn(StarlarkThread.Frame fr) {
-    return (StarlarkFunction) fr.fn;
-  }
-
-  private static TokenKind execStatements(
-      StarlarkThread.Frame fr, List<Statement> statements, boolean indented)
-      throws EvalException, InterruptedException {
-    boolean isToplevelFunction = fn(fr).isToplevel();
-
-    // Hot code path, good chance of short lists which don't justify the iterator overhead.
-    for (int i = 0; i < statements.size(); i++) {
-      Statement stmt = statements.get(i);
-      TokenKind flow = exec(fr, stmt);
-      if (flow != TokenKind.PASS) {
-        return flow;
-      }
-
-      // Hack for BzlLoadFunction's "export" semantics.
-      // We enable it only for statements outside any function (isToplevelFunction)
-      // and outside any if- or for- statements (!indented).
-      if (isToplevelFunction && !indented && fr.thread.postAssignHook != null) {
-        if (stmt instanceof AssignmentStatement) {
-          AssignmentStatement assign = (AssignmentStatement) stmt;
-          for (Identifier id : Identifier.boundIdentifiers(assign.getLHS())) {
-            String name = id.getName();
-            Object value = fn(fr).getModule().getGlobal(name);
-            fr.thread.postAssignHook.assign(name, value);
-          }
-        }
-      }
-    }
-    return TokenKind.PASS;
-  }
-
-  private static void execAssignment(StarlarkThread.Frame fr, AssignmentStatement node)
-      throws EvalException, InterruptedException {
-    try {
-      if (node.isAugmented()) {
-        execAugmentedAssignment(fr, node);
-      } else {
-        Object rvalue = eval(fr, node.getRHS());
-        assign(fr, node.getLHS(), rvalue);
-      }
-    } catch (EvalException ex) {
-      fr.setErrorLocation(node.getOperatorLocation());
-      throw ex;
-    }
-  }
-
-  private static TokenKind execFor(StarlarkThread.Frame fr, ForStatement node)
-      throws EvalException, InterruptedException {
-    Object o = eval(fr, node.getCollection());
-    Iterable<?> seq = Starlark.toIterable(o);
-    EvalUtils.addIterator(o);
-    try {
-      for (Object it : seq) {
-        assign(fr, node.getVars(), it);
-
-        switch (execStatements(fr, node.getBody(), /*indented=*/ true)) {
-          case PASS:
-          case CONTINUE:
-            // Stay in loop.
-            fr.thread.checkInterrupt();
-            continue;
-          case BREAK:
-            // Finish loop, execute next statement after loop.
-            return TokenKind.PASS;
-          case RETURN:
-            // Finish loop, return from function.
-            return TokenKind.RETURN;
-          default:
-            throw new IllegalStateException("unreachable");
-        }
-      }
-    } catch (EvalException ex) {
-      fr.setErrorLocation(node.getStartLocation());
-      throw ex;
-    } finally {
-      EvalUtils.removeIterator(o);
-    }
-    return TokenKind.PASS;
-  }
-
-  private static void execDef(StarlarkThread.Frame fr, DefStatement node)
-      throws EvalException, InterruptedException {
-    Resolver.Function rfn = node.getResolvedFunction();
-
-    // Evaluate default value expressions of optional parameters.
-    // We use MANDATORY to indicate a required parameter
-    // (not null, because defaults must be a legal tuple value, as
-    // it will be constructed by the code emitted by the compiler).
-    // As an optimization, we omit the prefix of MANDATORY parameters.
-    Object[] defaults = null;
-    int nparams =
-        rfn.getParameters().size() - (rfn.hasKwargs() ? 1 : 0) - (rfn.hasVarargs() ? 1 : 0);
-    for (int i = 0; i < nparams; i++) {
-      Expression expr = rfn.getParameters().get(i).getDefaultValue();
-      if (expr == null && defaults == null) {
-        continue; // skip prefix of required parameters
-      }
-      if (defaults == null) {
-        defaults = new Object[nparams - i];
-      }
-      defaults[i - (nparams - defaults.length)] =
-          expr == null ? StarlarkFunction.MANDATORY : eval(fr, expr);
-    }
-    if (defaults == null) {
-      defaults = EMPTY;
-    }
-
-    assignIdentifier(
-        fr,
-        node.getIdentifier(),
-        new StarlarkFunction(rfn, Tuple.wrap(defaults), fn(fr).getModule()));
-  }
-
-  private static TokenKind execIf(StarlarkThread.Frame fr, IfStatement node)
-      throws EvalException, InterruptedException {
-    boolean cond = Starlark.truth(eval(fr, node.getCondition()));
-    if (cond) {
-      return execStatements(fr, node.getThenBlock(), /*indented=*/ true);
-    } else if (node.getElseBlock() != null) {
-      return execStatements(fr, node.getElseBlock(), /*indented=*/ true);
-    }
-    return TokenKind.PASS;
-  }
-
-  private static void execLoad(StarlarkThread.Frame fr, LoadStatement node) throws EvalException {
-    // Has the application defined a behavior for load statements in this thread?
-    StarlarkThread.Loader loader = fr.thread.getLoader();
-    if (loader == null) {
-      fr.setErrorLocation(node.getStartLocation());
-      throw Starlark.errorf("load statements may not be executed in this thread");
-    }
-
-    // Load module.
-    String moduleName = node.getImport().getValue();
-    Module module = loader.load(moduleName);
-    if (module == null) {
-      fr.setErrorLocation(node.getStartLocation());
-      throw Starlark.errorf(
-          "file '%s' was not correctly loaded. Make sure the 'load' statement appears in the"
-              + " global scope in your file",
-          moduleName);
-    }
-    Map<String, Object> globals = module.getExportedGlobals();
-
-    for (LoadStatement.Binding binding : node.getBindings()) {
-      // Extract symbol.
-      Identifier orig = binding.getOriginalName();
-      Object value = globals.get(orig.getName());
-      if (value == null) {
-        fr.setErrorLocation(orig.getStartLocation());
-        throw Starlark.errorf(
-            "file '%s' does not contain symbol '%s'%s",
-            moduleName, orig.getName(), SpellChecker.didYouMean(orig.getName(), globals.keySet()));
-      }
-
-      // Define module-local variable.
-      // TODO(adonovan): eventually the default behavior should be that
-      // loads bind file-locally. Either way, the resolver should designate
-      // the proper scope of binding.getLocalName() and this should become
-      // simply assign(binding.getLocalName(), value).
-      // Currently, we update the module but not module.exportedGlobals;
-      // changing it to fr.locals.put breaks a test. TODO(adonovan): find out why.
-      fn(fr).getModule().setGlobal(binding.getLocalName().getName(), value);
-    }
-  }
-
-  private static TokenKind execReturn(StarlarkThread.Frame fr, ReturnStatement node)
-      throws EvalException, InterruptedException {
-    Expression result = node.getResult();
-    if (result != null) {
-      fr.result = eval(fr, result);
-    }
-    return TokenKind.RETURN;
-  }
-
-  private static TokenKind exec(StarlarkThread.Frame fr, Statement st)
-      throws EvalException, InterruptedException {
-    if (fr.dbg != null) {
-      Location loc = st.getStartLocation(); // not very precise
-      fr.setLocation(loc);
-      fr.dbg.before(fr.thread, loc); // location is now redundant since it's in the thread
-    }
-
-    if (++fr.thread.steps >= fr.thread.stepLimit) {
-      throw new EvalException("Starlark computation cancelled: too many steps");
-    }
-
-    switch (st.kind()) {
-      case ASSIGNMENT:
-        execAssignment(fr, (AssignmentStatement) st);
-        return TokenKind.PASS;
-      case EXPRESSION:
-        eval(fr, ((ExpressionStatement) st).getExpression());
-        return TokenKind.PASS;
-      case FLOW:
-        return ((FlowStatement) st).getKind();
-      case FOR:
-        return execFor(fr, (ForStatement) st);
-      case DEF:
-        execDef(fr, (DefStatement) st);
-        return TokenKind.PASS;
-      case IF:
-        return execIf(fr, (IfStatement) st);
-      case LOAD:
-        execLoad(fr, (LoadStatement) st);
-        return TokenKind.PASS;
-      case RETURN:
-        return execReturn(fr, (ReturnStatement) st);
-    }
-    throw new IllegalArgumentException("unexpected statement: " + st.kind());
-  }
-
-  /**
-   * Updates the environment bindings, and possibly mutates objects, so as to assign the given value
-   * to the given expression. Might not set the frame location on error.
-   */
-  private static void assign(StarlarkThread.Frame fr, Expression lhs, Object value)
-      throws EvalException, InterruptedException {
-    if (lhs instanceof Identifier) {
-      // x = ...
-      assignIdentifier(fr, (Identifier) lhs, value);
-
-    } else if (lhs instanceof IndexExpression) {
-      // x[i] = ...
-      Object object = eval(fr, ((IndexExpression) lhs).getObject());
-      Object key = eval(fr, ((IndexExpression) lhs).getKey());
-      EvalUtils.setIndex(object, key, value);
-
-    } else if (lhs instanceof ListExpression) {
-      // a, b, c = ...
-      ListExpression list = (ListExpression) lhs;
-      assignSequence(fr, list.getElements(), value);
-
-    } else {
-      // Not possible for resolved ASTs.
-      throw Starlark.errorf("cannot assign to '%s'", lhs);
-    }
-  }
-
-  private static void assignIdentifier(StarlarkThread.Frame fr, Identifier id, Object value)
-      throws EvalException {
-    Resolver.Binding bind = id.getBinding();
-    // Legacy hack for incomplete identifier resolution.
-    // In a <toplevel> function, assignments to unresolved identifiers
-    // update the module, except for load statements and comprehensions,
-    // which should both be file-local.
-    // Load statements don't yet use assignIdentifier,
-    // so we need consider only comprehensions.
-    // In effect, we do the missing resolution using fr.compcount.
-    Resolver.Scope scope;
-    if (bind == null) {
-      scope =
-          fn(fr).isToplevel() && fr.compcount == 0
-              ? Resolver.Scope.GLOBAL //
-              : Resolver.Scope.LOCAL;
-    } else {
-      scope = bind.getScope();
-    }
-
-    String name = id.getName();
-    switch (scope) {
-      case LOCAL:
-        fr.locals.put(name, value);
-        break;
-      case GLOBAL:
-        // Updates a module binding and sets its 'exported' flag.
-        // (Only load bindings are not exported.
-        // But exportedGlobals does at run time what should be done in the resolver.)
-        Module module = fn(fr).getModule();
-        module.setGlobal(name, value);
-        module.exportedGlobals.add(name);
-        break;
-      default:
-        throw new IllegalStateException(scope.toString());
-    }
-  }
-
-  /**
-   * Recursively assigns an iterable value to a non-empty sequence of assignable expressions. Might
-   * not set frame location on error.
-   */
-  private static void assignSequence(StarlarkThread.Frame fr, List<Expression> lhs, Object x)
-      throws EvalException, InterruptedException {
-    // TODO(adonovan): lock/unlock rhs during iteration so that
-    // assignments fail when the left side aliases the right,
-    // which is a tricky case in Python assignment semantics.
-    int nrhs = Starlark.len(x);
-    if (nrhs < 0) {
-      throw Starlark.errorf("got '%s' in sequence assignment", Starlark.type(x));
-    }
-    Iterable<?> rhs = Starlark.toIterable(x); // fails if x is a string
-    int nlhs = lhs.size();
-    if (nlhs != nrhs) {
-      throw Starlark.errorf(
-          "too %s values to unpack (got %d, want %d)", nrhs < nlhs ? "few" : "many", nrhs, nlhs);
-    }
-    int i = 0;
-    for (Object item : rhs) {
-      assign(fr, lhs.get(i), item);
-      i++;
-    }
-  }
-
-  // Might not set frame location on error.
-  private static void execAugmentedAssignment(StarlarkThread.Frame fr, AssignmentStatement stmt)
-      throws EvalException, InterruptedException {
-    Expression lhs = stmt.getLHS();
-    TokenKind op = stmt.getOperator();
-    Expression rhs = stmt.getRHS();
-
-    if (lhs instanceof Identifier) {
-      Object x = eval(fr, lhs);
-      Object y = eval(fr, rhs);
-      Object z = inplaceBinaryOp(fr, op, x, y);
-      assignIdentifier(fr, (Identifier) lhs, z);
-
-    } else if (lhs instanceof IndexExpression) {
-      // object[index] op= y
-      // The object and key should be evaluated only once, so we don't use lhs.eval().
-      IndexExpression index = (IndexExpression) lhs;
-      Object object = eval(fr, index.getObject());
-      Object key = eval(fr, index.getKey());
-      Object x = EvalUtils.index(fr.thread.mutability(), fr.thread.getSemantics(), object, key);
-      // Evaluate rhs after lhs.
-      Object y = eval(fr, rhs);
-      Object z = inplaceBinaryOp(fr, op, x, y);
-      try {
-        EvalUtils.setIndex(object, key, z);
-      } catch (EvalException ex) {
-        fr.setErrorLocation(stmt.getOperatorLocation());
-        throw ex;
-      }
-
-    } else {
-      // Not possible for resolved ASTs.
-      fr.setErrorLocation(stmt.getOperatorLocation());
-      throw Starlark.errorf("cannot perform augmented assignment on '%s'", lhs);
-    }
-  }
-
-  private static Object inplaceBinaryOp(StarlarkThread.Frame fr, TokenKind op, Object x, Object y)
-      throws EvalException {
-    // list += iterable  behaves like  list.extend(iterable)
-    // TODO(b/141263526): following Python, allow list+=iterable (but not list+iterable).
-    if (op == TokenKind.PLUS && x instanceof StarlarkList && y instanceof StarlarkList) {
-      StarlarkList<?> list = (StarlarkList) x;
-      list.extend(y);
-      return list;
-    }
-    return EvalUtils.binaryOp(op, x, y, fr.thread.getSemantics(), fr.thread.mutability());
-  }
-
-  // ---- expressions ----
-
-  private static Object eval(StarlarkThread.Frame fr, Expression expr)
-      throws EvalException, InterruptedException {
-    if (++fr.thread.steps >= fr.thread.stepLimit) {
-      throw new EvalException("Starlark computation cancelled: too many steps");
-    }
-
-    // The switch cases have been split into separate functions
-    // to reduce the stack usage during recursion, which is
-    // especially important in practice for deeply nested a+...+z
-    // expressions; see b/153764542.
-    switch (expr.kind()) {
-      case BINARY_OPERATOR:
-        return evalBinaryOperator(fr, (BinaryOperatorExpression) expr);
-      case COMPREHENSION:
-        return evalComprehension(fr, (Comprehension) expr);
-      case CONDITIONAL:
-        return evalConditional(fr, (ConditionalExpression) expr);
-      case DICT_EXPR:
-        return evalDict(fr, (DictExpression) expr);
-      case DOT:
-        return evalDot(fr, (DotExpression) expr);
-      case CALL:
-        return evalCall(fr, (CallExpression) expr);
-      case IDENTIFIER:
-        return evalIdentifier(fr, (Identifier) expr);
-      case INDEX:
-        return evalIndex(fr, (IndexExpression) expr);
-      case INTEGER_LITERAL:
-        return ((IntegerLiteral) expr).getValue();
-      case LIST_EXPR:
-        return evalList(fr, (ListExpression) expr);
-      case SLICE:
-        return evalSlice(fr, (SliceExpression) expr);
-      case STRING_LITERAL:
-        return ((StringLiteral) expr).getValue();
-      case UNARY_OPERATOR:
-        return evalUnaryOperator(fr, (UnaryOperatorExpression) expr);
-    }
-    throw new IllegalArgumentException("unexpected expression: " + expr.kind());
-  }
-
-  private static Object evalBinaryOperator(StarlarkThread.Frame fr, BinaryOperatorExpression binop)
-      throws EvalException, InterruptedException {
-    Object x = eval(fr, binop.getX());
-    // AND and OR require short-circuit evaluation.
-    switch (binop.getOperator()) {
-      case AND:
-        return Starlark.truth(x) ? eval(fr, binop.getY()) : x;
-      case OR:
-        return Starlark.truth(x) ? x : eval(fr, binop.getY());
-      default:
-        Object y = eval(fr, binop.getY());
-        try {
-          return EvalUtils.binaryOp(
-              binop.getOperator(), x, y, fr.thread.getSemantics(), fr.thread.mutability());
-        } catch (EvalException ex) {
-          fr.setErrorLocation(binop.getOperatorLocation());
-          throw ex;
-        }
-    }
-  }
-
-  private static Object evalConditional(StarlarkThread.Frame fr, ConditionalExpression cond)
-      throws EvalException, InterruptedException {
-    Object v = eval(fr, cond.getCondition());
-    return eval(fr, Starlark.truth(v) ? cond.getThenCase() : cond.getElseCase());
-  }
-
-  private static Object evalDict(StarlarkThread.Frame fr, DictExpression dictexpr)
-      throws EvalException, InterruptedException {
-    Dict<Object, Object> dict = Dict.of(fr.thread.mutability());
-    for (DictExpression.Entry entry : dictexpr.getEntries()) {
-      Object k = eval(fr, entry.getKey());
-      Object v = eval(fr, entry.getValue());
-      int before = dict.size();
-      try {
-        dict.put(k, v, (Location) null);
-      } catch (EvalException ex) {
-        fr.setErrorLocation(entry.getColonLocation());
-        throw ex;
-      }
-      if (dict.size() == before) {
-        fr.setErrorLocation(entry.getColonLocation());
-        throw Starlark.errorf("Duplicated key %s when creating dictionary", Starlark.repr(k));
-      }
-    }
-    return dict;
-  }
-
-  private static Object evalDot(StarlarkThread.Frame fr, DotExpression dot)
-      throws EvalException, InterruptedException {
-    Object object = eval(fr, dot.getObject());
-    String name = dot.getField().getName();
-    try {
-      return Starlark.getattr(
-          fr.thread.mutability(), fr.thread.getSemantics(), object, name, /*defaultValue=*/ null);
-    } catch (EvalException ex) {
-      fr.setErrorLocation(dot.getDotLocation());
-      throw ex;
-    }
-  }
-
-  private static Object evalCall(StarlarkThread.Frame fr, CallExpression call)
-      throws EvalException, InterruptedException {
-    fr.thread.checkInterrupt();
-
-    Object fn = eval(fr, call.getFunction());
-
-    // Starlark arguments are ordered: positionals < keywords < *args < **kwargs.
-    //
-    // This is stricter than Python2, which doesn't constrain keywords wrt *args,
-    // but this ensures that the effects of evaluation of Starlark arguments occur
-    // in source order.
-    //
-    // Starlark does not support Python3's multiple *args and **kwargs
-    // nor freer ordering, such as f(a, *list, *list, **dict, **dict, b=1).
-    // Supporting it would complicate a compiler, and produce effects out of order.
-    // Also, Python's argument ordering rules are complex and the errors sometimes cryptic.
-
-    // StarStar and Star args are guaranteed to be last, if they occur.
-    ImmutableList<Argument> arguments = call.getArguments();
-    int n = arguments.size();
-    Argument.StarStar starstar = null;
-    if (n > 0 && arguments.get(n - 1) instanceof Argument.StarStar) {
-      starstar = (Argument.StarStar) arguments.get(n - 1);
-      n--;
-    }
-    Argument.Star star = null;
-    if (n > 0 && arguments.get(n - 1) instanceof Argument.Star) {
-      star = (Argument.Star) arguments.get(n - 1);
-      n--;
-    }
-    // Inv: n = |positional| + |named|
-
-    // Allocate assuming no *args/**kwargs.
-    int npos = call.getNumPositionalArguments();
-    int i;
-
-    // f(expr) -- positional args
-    Object[] positional = npos == 0 ? EMPTY : new Object[npos];
-    for (i = 0; i < npos; i++) {
-      Argument arg = arguments.get(i);
-      Object value = eval(fr, arg.getValue());
-      positional[i] = value;
-    }
-
-    // f(id=expr) -- named args
-    Object[] named = n == npos ? EMPTY : new Object[2 * (n - npos)];
-    for (int j = 0; i < n; i++) {
-      Argument.Keyword arg = (Argument.Keyword) arguments.get(i);
-      Object value = eval(fr, arg.getValue());
-      named[j++] = arg.getName();
-      named[j++] = value;
-    }
-
-    // f(*args) -- varargs
-    if (star != null) {
-      Object value = eval(fr, star.getValue());
-      if (!(value instanceof StarlarkIterable)) {
-        fr.setErrorLocation(star.getStartLocation());
-        throw Starlark.errorf("argument after * must be an iterable, not %s", Starlark.type(value));
-      }
-      // TODO(adonovan): opt: if value.size is known, preallocate (and skip if empty).
-      ArrayList<Object> list = new ArrayList<>();
-      Collections.addAll(list, positional);
-      Iterables.addAll(list, ((Iterable<?>) value));
-      positional = list.toArray();
-    }
-
-    // f(**kwargs)
-    if (starstar != null) {
-      Object value = eval(fr, starstar.getValue());
-      if (!(value instanceof Dict)) {
-        fr.setErrorLocation(starstar.getStartLocation());
-        throw Starlark.errorf("argument after ** must be a dict, not %s", Starlark.type(value));
-      }
-      Dict<?, ?> kwargs = (Dict<?, ?>) value;
-      int j = named.length;
-      named = Arrays.copyOf(named, j + 2 * kwargs.size());
-      for (Map.Entry<?, ?> e : kwargs.entrySet()) {
-        if (!(e.getKey() instanceof String)) {
-          fr.setErrorLocation(starstar.getStartLocation());
-          throw Starlark.errorf("keywords must be strings, not %s", Starlark.type(e.getKey()));
-        }
-        named[j++] = e.getKey();
-        named[j++] = e.getValue();
-      }
-    }
-
-    Location loc = call.getLparenLocation(); // (Location is prematerialized)
-    fr.setLocation(loc);
-    try {
-      return Starlark.fastcall(fr.thread, fn, positional, named);
-    } catch (EvalException ex) {
-      fr.setErrorLocation(loc);
-      throw ex;
-    }
-  }
-
-  private static Object evalIdentifier(StarlarkThread.Frame fr, Identifier id)
-      throws EvalException, InterruptedException {
-    String name = id.getName();
-    Resolver.Binding bind = id.getBinding();
-    if (bind == null) {
-      // Legacy behavior, to be removed.
-      Object result = fr.locals.get(name);
-      if (result != null) {
-        return result;
-      }
-      result = fn(fr).getModule().get(name);
-      if (result != null) {
-        return result;
-      }
-
-      // Assuming resolution was successfully applied before execution
-      // (which is not yet true for copybara, but will be soon),
-      // then the identifier must have been resolved but the
-      // resolution was not annotated onto the syntax tree---because
-      // it's a BUILD file that may share trees with the prelude.
-      // So this error does not mean "undefined variable" (morally a
-      // static error), but "variable was (dynamically) referenced
-      // before being bound", as in 'print(x); x=1'.
-      fr.setErrorLocation(id.getStartLocation());
-      throw Starlark.errorf("variable '%s' is referenced before assignment", name);
-    }
-
-    Object result;
-    switch (bind.getScope()) {
-      case LOCAL:
-        result = fr.locals.get(name);
-        break;
-      case GLOBAL:
-        result = fn(fr).getModule().getGlobal(name);
-        break;
-      case PREDECLARED:
-        // TODO(adonovan): call getPredeclared
-        result = fn(fr).getModule().get(name);
-        break;
-      default:
-        throw new IllegalStateException(bind.toString());
-    }
-    if (result == null) {
-      // Since Scope was set, we know that the local/global variable is defined,
-      // but its assignment was not yet executed.
-      fr.setErrorLocation(id.getStartLocation());
-      throw Starlark.errorf(
-          "%s variable '%s' is referenced before assignment.", bind.getScope(), name);
-    }
-    return result;
-  }
-
-  private static Object evalIndex(StarlarkThread.Frame fr, IndexExpression index)
-      throws EvalException, InterruptedException {
-    Object object = eval(fr, index.getObject());
-    Object key = eval(fr, index.getKey());
-    try {
-      return EvalUtils.index(fr.thread.mutability(), fr.thread.getSemantics(), object, key);
-    } catch (EvalException ex) {
-      fr.setErrorLocation(index.getLbracketLocation());
-      throw ex;
-    }
-  }
-
-  private static Object evalList(StarlarkThread.Frame fr, ListExpression expr)
-      throws EvalException, InterruptedException {
-    int n = expr.getElements().size();
-    Object[] array = new Object[n];
-    for (int i = 0; i < n; i++) {
-      array[i] = eval(fr, expr.getElements().get(i));
-    }
-    return expr.isTuple() ? Tuple.wrap(array) : StarlarkList.wrap(fr.thread.mutability(), array);
-  }
-
-  private static Object evalSlice(StarlarkThread.Frame fr, SliceExpression slice)
-      throws EvalException, InterruptedException {
-    Object x = eval(fr, slice.getObject());
-    Object start = slice.getStart() == null ? Starlark.NONE : eval(fr, slice.getStart());
-    Object stop = slice.getStop() == null ? Starlark.NONE : eval(fr, slice.getStop());
-    Object step = slice.getStep() == null ? Starlark.NONE : eval(fr, slice.getStep());
-    try {
-      return Starlark.slice(fr.thread.mutability(), x, start, stop, step);
-    } catch (EvalException ex) {
-      fr.setErrorLocation(slice.getLbracketLocation());
-      throw ex;
-    }
-  }
-
-  private static Object evalUnaryOperator(StarlarkThread.Frame fr, UnaryOperatorExpression unop)
-      throws EvalException, InterruptedException {
-    Object x = eval(fr, unop.getX());
-    try {
-      return EvalUtils.unaryOp(unop.getOperator(), x);
-    } catch (EvalException ex) {
-      fr.setErrorLocation(unop.getStartLocation());
-      throw ex;
-    }
-  }
-
-  private static Object evalComprehension(StarlarkThread.Frame fr, Comprehension comp)
-      throws EvalException, InterruptedException {
-    final Dict<Object, Object> dict = comp.isDict() ? Dict.of(fr.thread.mutability()) : null;
-    final ArrayList<Object> list = comp.isDict() ? null : new ArrayList<>();
-
-    // Save previous value (if any) of local variables bound in a 'for' clause
-    // so we can restore them later.
-    // TODO(adonovan): throw all this away when we implement flat environments.
-    List<Object> saved = new ArrayList<>(); // alternating keys and values
-    for (Comprehension.Clause clause : comp.getClauses()) {
-      if (clause instanceof Comprehension.For) {
-        for (Identifier ident :
-            Identifier.boundIdentifiers(((Comprehension.For) clause).getVars())) {
-          String name = ident.getName();
-          Object value = fr.locals.get(ident.getName()); // may be null
-          saved.add(name);
-          saved.add(value);
-        }
-      }
-    }
-    fr.compcount++;
-
-    // The Lambda class serves as a recursive lambda closure.
-    class Lambda {
-      // execClauses(index) recursively executes the clauses starting at index,
-      // and finally evaluates the body and adds its value to the result.
-      void execClauses(int index) throws EvalException, InterruptedException {
-        fr.thread.checkInterrupt();
-
-        // recursive case: one or more clauses
-        if (index < comp.getClauses().size()) {
-          Comprehension.Clause clause = comp.getClauses().get(index);
-          if (clause instanceof Comprehension.For) {
-            Comprehension.For forClause = (Comprehension.For) clause;
-
-            Object iterable = eval(fr, forClause.getIterable());
-            Iterable<?> listValue = Starlark.toIterable(iterable);
-            EvalUtils.addIterator(iterable);
-            try {
-              for (Object elem : listValue) {
-                assign(fr, forClause.getVars(), elem);
-                execClauses(index + 1);
-              }
-            } catch (EvalException ex) {
-              fr.setErrorLocation(forClause.getStartLocation());
-              throw ex;
-            } finally {
-              EvalUtils.removeIterator(iterable);
-            }
-
-          } else {
-            Comprehension.If ifClause = (Comprehension.If) clause;
-            if (Starlark.truth(eval(fr, ifClause.getCondition()))) {
-              execClauses(index + 1);
-            }
-          }
-          return;
-        }
-
-        // base case: evaluate body and add to result.
-        if (dict != null) {
-          DictExpression.Entry body = (DictExpression.Entry) comp.getBody();
-          Object k = eval(fr, body.getKey());
-          try {
-            EvalUtils.checkHashable(k);
-            Object v = eval(fr, body.getValue());
-            dict.put(k, v, (Location) null);
-          } catch (EvalException ex) {
-            fr.setErrorLocation(body.getColonLocation());
-            throw ex;
-          }
-        } else {
-          list.add(eval(fr, ((Expression) comp.getBody())));
-        }
-      }
-    }
-    new Lambda().execClauses(0);
-    fr.compcount--;
-
-    // Restore outer scope variables.
-    // This loop implicitly undefines comprehension variables.
-    for (int i = 0; i != saved.size(); ) {
-      String name = (String) saved.get(i++);
-      Object value = saved.get(i++);
-      if (value != null) {
-        fr.locals.put(name, value);
-      } else {
-        fr.locals.remove(name);
-      }
-    }
-
-    return comp.isDict() ? dict : StarlarkList.copyOf(fr.thread.mutability(), list);
-  }
-
-  private static final Object[] EMPTY = {};
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java
deleted file mode 100644
index 2a5405e..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java
+++ /dev/null
@@ -1,267 +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 java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.io.Files;
-import java.io.File;
-import java.util.List;
-import java.util.function.Supplier;
-import javax.annotation.Nullable;
-
-/** An EvalException indicates an Starlark evaluation error. */
-public class EvalException extends Exception {
-
-  // The location optionally specified at construction.
-  // TODO(adonovan): doesn't belong; essentially ignored.
-  // Replace by making each caller incorporate
-  // the file name into the error message if necessary.
-  // In the vast majority of cases, it isn't.
-  @Nullable private final Location location;
-
-  // The call stack associated with this error.
-  // It is initially null, but is set by the interpreter to a non-empty
-  // stack when popping a frame. Thus an exception newly created by a
-  // built-in function has no stack until it is thrown out of a function call.
-  //
-  // EvalExceptions are often used to indicate the failure of an operator
-  // such as getattr, or some piece of bazel rule validation machinery,
-  // without reference to Starlark code. Such exceptions have no stack
-  // until they are thrown in the context of a Starlark thread (e.g.
-  // by a built-in function, or by the interpreter itself).
-  @Nullable private ImmutableList<StarlarkThread.CallStackEntry> callstack;
-
-  /** Constructs an EvalException. Use {@link Starlak#errorf} if you want string formatting. */
-  public EvalException(String message) {
-    this((Location) null, message);
-  }
-
-  /**
-   * Constructs an EvalException with a message and optional cause.
-   *
-   * <p>The cause does not affect the error message, so callers should incorporate {@code
-   * cause.getMessage()} into {@code message} if desired, or call {@code EvalException(Throwable)}.
-   */
-  public EvalException(String message, @Nullable Throwable cause) {
-    this((Location) null, message, cause);
-  }
-
-  /** Constructs an EvalException using the same message as the cause exception. */
-  public EvalException(Throwable cause) {
-    this((Location) null, cause);
-  }
-
-  // TODO(adonovan): delete all constructors below. Stop using Location.
-
-  /**
-   * Constructs an EvalException with a message and optional location (deprecated).
-   *
-   * <p>Few clients need this constructor, as the Starlark interpreter automatically fill in the
-   * locations from the call stack. Use {@link Starlark#errorf} instead, unless the exception needs
-   * to appear to originate from a different location.
-   */
-  // TODO(adonovan): eliminate.
-  public EvalException(@Nullable Location location, String message) {
-    super(Preconditions.checkNotNull(message));
-    this.location = location;
-  }
-
-  /**
-   * Constructs an EvalException with a message, optional location (deprecated), and optional cause.
-   *
-   * <p>See notes at {@link #EvalException(Location, String)}. The cause does not affect the error
-   * message, so callers should incorporate {@code cause.getMessage()} into {@code message} if
-   * desired.
-   */
-  // TODO(adonovan): eliminate.
-  public EvalException(@Nullable Location location, String message, @Nullable Throwable cause) {
-    super(Preconditions.checkNotNull(message), cause);
-    this.location = location;
-  }
-
-  /**
-   * Constructs an EvalException with an optional location (deprecated) using the same message as
-   * the cause exception.
-   *
-   * <p>See notes at {@link #EvalException(Location, String)}.
-   */
-  // TODO(adonovan): eliminate.
-  public EvalException(@Nullable Location location, Throwable cause) {
-    super(getCauseMessage(cause), cause);
-    this.location = location;
-  }
-
-  private static String getCauseMessage(Throwable cause) {
-    String msg = cause.getMessage();
-    return msg != null ? msg : cause.toString();
-  }
-
-  /** Returns the error message. Does not include location (deprecated), call stack, or cause. */
-  @Override
-  public final String getMessage() {
-    return super.getMessage();
-  }
-
-  /**
-   * Returns the call stack associated with this error, outermost call first. A newly constructed
-   * exception has an empty stack, but an exception that has been thrown out of a Starlark function
-   * call has its stack populated automatically.
-   */
-  public final ImmutableList<StarlarkThread.CallStackEntry> getCallStack() {
-    return callstack != null ? callstack : ImmutableList.of();
-  }
-
-  /** Returns the error message along with its call stack. May be overridden by subclasses. */
-  @Override
-  public String toString() {
-    return getMessageWithStack();
-  }
-
-  /**
-   * Returns the error message along with its call stack or location (deprecated), if any.
-   * Equivalent to {@code getMessageWithStack(newSourceReader())}.
-   */
-  public final String getMessageWithStack() {
-    return getMessageWithStack(newSourceReader());
-  }
-
-  /**
-   * Returns the error message along with its call stack or location (deprecated), if any. The
-   * source line for each stack frame is obtained from the provided SourceReader.
-   */
-  public final String getMessageWithStack(SourceReader src) {
-    if (callstack != null) {
-      return formatCallStack(callstack, getMessage(), src);
-    }
-
-    // An exception that has not been thrown out of a Starlark call
-    // has no stack. It may have a location (for now). If so, print it.
-    if (location != null && !location.equals(Location.BUILTIN)) {
-      return location + ": " + getMessage();
-    }
-
-    return getMessage();
-  }
-
-  /**
-   * A SourceReader reads the line of source denoted by a Location to be displayed in a formatted a
-   * stack trace.
-   */
-  public interface SourceReader {
-    /** Returns a single line of source code (sans newline), or null if unavailable. */
-    String readline(Location loc);
-  }
-
-  /**
-   * Sets the function used to obtain a SourceReader when subsequently formatting a call stack.
-   *
-   * <p>The default supplier returns SourceReaders that read from the file system, but a
-   * security-conscious client may wish to disable this capability or provide an alternative.
-   */
-  public static synchronized void setSourceReaderSupplier(Supplier<SourceReader> f) {
-    sourceReaderSupplier = f;
-  }
-
-  /** Returns a new SourceReader. See {@link #setSourceReaderSupplier}. */
-  public static synchronized SourceReader newSourceReader() {
-    return sourceReaderSupplier.get();
-  }
-
-  private static Supplier<SourceReader> sourceReaderSupplier =
-      () -> {
-        // TODO(adonovan): opt: cache seen files, as the stack often repeats the same files.
-        return loc -> {
-          try {
-            String content = Files.asCharSource(new File(loc.file()), UTF_8).read();
-            return Iterables.get(Splitter.on("\n").split(content), loc.line() - 1, null);
-          } catch (Throwable unused) {
-            // ignore any failure (e.g. security manager rejecting I/O)
-          }
-          return null;
-        };
-      };
-
-  /**
-   * Formats the given call stack and error message. Provided as a separate function from {@link
-   * #getMessageWithStack} so that clients may modify the stack and/or error before formatting it.
-   * The source line for each stack frame is obtained from the provided SourceReader.
-   */
-  public static String formatCallStack(
-      List<StarlarkThread.CallStackEntry> callstack, String message, SourceReader src) {
-    StringBuilder buf = new StringBuilder();
-    int n = callstack.size(); // n > 0
-    String prefix = "Error: ";
-    // If the topmost frame is a built-in, don't show it.
-    // Instead just prefix the name of the built-in onto the error message.
-    StarlarkThread.CallStackEntry leaf = callstack.get(n - 1);
-    if (leaf.location.equals(Location.BUILTIN)) {
-      prefix = "Error in " + leaf.name + ": ";
-      n--;
-    }
-    if (n > 0) {
-      buf.append("Traceback (most recent call last):\n");
-      for (int i = 0; i < n; i++) {
-        StarlarkThread.CallStackEntry fr = callstack.get(i);
-        // 'File "file.bzl", line 1, column 2, in fn'
-        buf.append(String.format("\tFile \"%s\", ", fr.location.file()));
-        if (fr.location.line() != 0) {
-          buf.append("line ").append(fr.location.line()).append(", ");
-          if (fr.location.column() != 0) {
-            buf.append("column ").append(fr.location.column()).append(", ");
-          }
-        }
-        buf.append("in ").append(fr.name).append('\n');
-
-        // source line
-        String line = src.readline(fr.location);
-        if (line != null) {
-          buf.append("\t\t").append(line.trim()).append('\n');
-        }
-      }
-    }
-    buf.append(prefix).append(message);
-    return buf.toString();
-  }
-
-  /**
-   * Returns the optional location passed to the constructor.
-   *
-   * @deprecated Do not use this feature. Instead, record auxiliary (non-stack) locations in the
-   *     error message itself, or call a dummy wrapper function to introduce a fake frame into the
-   *     call stack.
-   */
-  @Nullable
-  @Deprecated
-  public final Location getDeprecatedLocation() {
-    return location;
-  }
-
-  // Ensures that this exception holds a call stack, taking the current
-  // stack (which must be non-empty) from the thread if not.
-  final EvalException ensureStack(StarlarkThread thread) {
-    if (callstack == null) {
-      this.callstack = thread.getCallStack();
-      if (callstack.isEmpty()) {
-        throw new IllegalStateException("empty callstack");
-      }
-    }
-    return this;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
deleted file mode 100644
index 80ffeda..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ /dev/null
@@ -1,540 +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 com.google.common.base.Strings;
-import com.google.common.collect.Ordering;
-import java.util.IllegalFormatException;
-
-/** Internal declarations used by the evaluator. */
-final class EvalUtils {
-
-  private EvalUtils() {}
-
-  /**
-   * The exception that STARLARK_COMPARATOR might throw. This is an unchecked exception because
-   * Comparator doesn't let us declare exceptions. It should normally be caught and wrapped in an
-   * EvalException.
-   */
-  static class ComparisonException extends RuntimeException {
-    ComparisonException(String msg) {
-      super(msg);
-    }
-  }
-
-  /**
-   * Compare two Starlark values.
-   *
-   * <p>It may throw an unchecked exception ComparisonException that should be wrapped in an
-   * EvalException.
-   */
-  // TODO(adonovan): consider what API to expose around comparison and ordering. Java's three-valued
-  // comparator cannot properly handle weakly or partially ordered values such as IEEE754 floats.
-  static final Ordering<Object> STARLARK_COMPARATOR =
-      new Ordering<Object>() {
-        private int compareLists(Sequence<?> o1, Sequence<?> o2) {
-          if (o1 instanceof RangeList || o2 instanceof RangeList) {
-            throw new ComparisonException("Cannot compare range objects");
-          }
-
-          for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
-            int cmp = compare(o1.get(i), o2.get(i));
-            if (cmp != 0) {
-              return cmp;
-            }
-          }
-          return Integer.compare(o1.size(), o2.size());
-        }
-
-        @Override
-        @SuppressWarnings("unchecked")
-        public int compare(Object o1, Object o2) {
-
-          // optimize the most common cases
-
-          if (o1 instanceof String && o2 instanceof String) {
-            return ((String) o1).compareTo((String) o2);
-          }
-          if (o1 instanceof Integer && o2 instanceof Integer) {
-            return Integer.compare((Integer) o1, (Integer) o2);
-          }
-
-          o1 = Starlark.fromJava(o1, null);
-          o2 = Starlark.fromJava(o2, null);
-
-          if (o1 instanceof Sequence
-              && o2 instanceof Sequence
-              && o1 instanceof Tuple == o2 instanceof Tuple) {
-            return compareLists((Sequence) o1, (Sequence) o2);
-          }
-
-          if (o1 instanceof ClassObject) {
-            throw new ComparisonException("Cannot compare structs");
-          }
-          try {
-            return ((Comparable<Object>) o1).compareTo(o2);
-          } catch (ClassCastException e) {
-            throw new ComparisonException(
-                "Cannot compare " + Starlark.type(o1) + " with " + Starlark.type(o2));
-          }
-        }
-      };
-
-  /** Throws EvalException if x is not hashable. */
-  static void checkHashable(Object x) throws EvalException {
-    if (!isHashable(x)) {
-      // This results in confusing errors such as "unhashable type: tuple".
-      // TODO(adonovan): ideally the error message would explain which
-      // element of, say, a tuple is unhashable. The only practical way
-      // to implement this is by implementing isHashable as a call to
-      // Object.hashCode within a try/catch, and requiring all
-      // unhashable Starlark values to throw a particular unchecked exception
-      // with a helpful error message.
-      throw Starlark.errorf("unhashable type: '%s'", Starlark.type(x));
-    }
-  }
-
-  /**
-   * Reports whether a legal Starlark value is considered hashable to Starlark, and thus suitable as
-   * a key in a dict.
-   */
-  static boolean isHashable(Object o) {
-    // Bazel makes widespread assumptions that all Starlark values can be hashed
-    // by Java code, so we cannot implement isHashable by having
-    // StarlarkValue.hashCode throw an unchecked exception, which would be more
-    // efficient. Instead, before inserting a value in a dict, we must first ask
-    // it whether it isHashable, and then call its hashCode method only if so.
-    // For structs and tuples, this unfortunately visits the object graph twice.
-    //
-    // One subtlety: the struct.isHashable recursively asks whether its
-    // elements are immutable, not hashable. Consequently, even though a list
-    // may not be used as a dict key (even if frozen), a struct containing
-    // a list is hashable. TODO(adonovan): fix this inconsistency.
-    // Requires an incompatible change flag.
-    if (o instanceof StarlarkValue) {
-      return ((StarlarkValue) o).isHashable();
-    }
-    return Starlark.isImmutable(o);
-  }
-
-  static void addIterator(Object x) {
-    if (x instanceof Mutability.Freezable) {
-      ((Mutability.Freezable) x).updateIteratorCount(+1);
-    }
-  }
-
-  static void removeIterator(Object x) {
-    if (x instanceof Mutability.Freezable) {
-      ((Mutability.Freezable) x).updateIteratorCount(-1);
-    }
-  }
-
-  // The following functions for indexing and slicing match the behavior of Python.
-
-  /**
-   * Resolves a positive or negative index to an index in the range [0, length), or throws
-   * EvalException if it is out of range. If the index is negative, it counts backward from length.
-   */
-  static int getSequenceIndex(int index, int length) throws EvalException {
-    int actualIndex = index;
-    if (actualIndex < 0) {
-      actualIndex += length;
-    }
-    if (actualIndex < 0 || actualIndex >= length) {
-      throw Starlark.errorf(
-          "index out of range (index is %d, but sequence has %d elements)", index, length);
-    }
-    return actualIndex;
-  }
-
-  /**
-   * Returns the effective index denoted by a user-supplied integer. First, if the integer is
-   * negative, the length of the sequence is added to it, so an index of -1 represents the last
-   * element of the sequence. Then, the integer is "clamped" into the inclusive interval [0,
-   * length].
-   */
-  static int toIndex(int index, int length) {
-    if (index < 0) {
-      index += length;
-    }
-
-    if (index < 0) {
-      return 0;
-    } else if (index > length) {
-      return length;
-    } else {
-      return index;
-    }
-  }
-
-  /** Evaluates an eager binary operation, {@code x op y}. (Excludes AND and OR.) */
-  static Object binaryOp(
-      TokenKind op, Object x, Object y, StarlarkSemantics semantics, Mutability mu)
-      throws EvalException {
-    switch (op) {
-      case PLUS:
-        if (x instanceof Integer) {
-          if (y instanceof Integer) {
-            // int + int
-            int xi = (Integer) x;
-            int yi = (Integer) y;
-            int z = xi + yi;
-            // Overflow Detection, §2-13 Hacker's Delight:
-            // "operands have the same sign and the sum
-            // has a sign opposite to that of the operands."
-            if (((xi ^ z) & (yi ^ z)) < 0) {
-              throw Starlark.errorf("integer overflow in addition");
-            }
-            return z;
-          }
-
-        } else if (x instanceof String) {
-          if (y instanceof String) {
-            // string + string
-            return (String) x + (String) y;
-          }
-
-        } else if (x instanceof Tuple) {
-          if (y instanceof Tuple) {
-            // tuple + tuple
-            return Tuple.concat((Tuple<?>) x, (Tuple<?>) y);
-          }
-
-        } else if (x instanceof StarlarkList) {
-          if (y instanceof StarlarkList) {
-            // list + list
-            return StarlarkList.concat((StarlarkList<?>) x, (StarlarkList<?>) y, mu);
-          }
-
-        }
-        break;
-
-      case PIPE:
-        if (x instanceof Integer) {
-          if (y instanceof Integer) {
-            // int | int
-            return ((Integer) x) | (Integer) y;
-          }
-        }
-        break;
-
-      case AMPERSAND:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int & int
-          return (Integer) x & (Integer) y;
-        }
-        break;
-
-      case CARET:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int ^ int
-          return (Integer) x ^ (Integer) y;
-        }
-        break;
-
-      case GREATER_GREATER:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int >> int
-          int xi = (Integer) x;
-          int yi = (Integer) y;
-          if (yi < 0) {
-            throw Starlark.errorf("negative shift count: %d", yi);
-          } else if (yi >= Integer.SIZE) {
-            return xi < 0 ? -1 : 0;
-          }
-          return xi >> yi;
-        }
-        break;
-
-      case LESS_LESS:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int << int
-          int xi = (Integer) x;
-          int yi = (Integer) y;
-          if (yi < 0) {
-            throw Starlark.errorf("negative shift count: %d", yi);
-          }
-          int z = xi << yi; // only uses low 5 bits of yi
-          if ((z >> yi) != xi || yi >= 32) {
-            throw Starlark.errorf("integer overflow in left shift");
-          }
-          return z;
-        }
-        break;
-
-      case MINUS:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int - int
-          int xi = (Integer) x;
-          int yi = (Integer) y;
-          int z = xi - yi;
-          if (((xi ^ yi) & (xi ^ z)) < 0) {
-            throw Starlark.errorf("integer overflow in subtraction");
-          }
-          return z;
-        }
-        break;
-
-      case STAR:
-        if (x instanceof Integer) {
-          int xi = (Integer) x;
-          if (y instanceof Integer) {
-            // int * int
-            long z = (long) xi * (long) (Integer) y;
-            if ((int) z != z) {
-              throw Starlark.errorf("integer overflow in multiplication");
-            }
-            return (int) z;
-          } else if (y instanceof String) {
-            // int * string
-            return repeatString((String) y, xi);
-          } else if (y instanceof Tuple) {
-            //  int * tuple
-            return ((Tuple<?>) y).repeat(xi);
-          } else if (y instanceof StarlarkList) {
-            // int * list
-            return ((StarlarkList<?>) y).repeat(xi, mu);
-          }
-
-        } else if (x instanceof String) {
-          if (y instanceof Integer) {
-            // string * int
-            return repeatString((String) x, (Integer) y);
-          }
-
-        } else if (x instanceof Tuple) {
-          if (y instanceof Integer) {
-            // tuple * int
-            return ((Tuple<?>) x).repeat((Integer) y);
-          }
-
-        } else if (x instanceof StarlarkList) {
-          if (y instanceof Integer) {
-            // list * int
-            return ((StarlarkList<?>) x).repeat((Integer) y, mu);
-          }
-        }
-        break;
-
-      case SLASH:
-        throw Starlark.errorf("The `/` operator is not allowed. For integer division, use `//`.");
-
-      case SLASH_SLASH:
-        if (x instanceof Integer && y instanceof Integer) {
-          // int // int
-          int xi = (Integer) x;
-          int yi = (Integer) y;
-          if (yi == 0) {
-            throw Starlark.errorf("integer division by zero");
-          }
-          // http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
-          int quo = xi / yi;
-          int rem = xi % yi;
-          if ((xi < 0) != (yi < 0) && rem != 0) {
-            quo--;
-          }
-          if (xi == Integer.MIN_VALUE && yi == -1) { // HD 2-13
-            throw Starlark.errorf("integer overflow in division");
-          }
-          return quo;
-        }
-        break;
-
-      case PERCENT:
-        if (x instanceof Integer) {
-          if (y instanceof Integer) {
-            // int % int
-            int xi = (Integer) x;
-            int yi = (Integer) y;
-            if (yi == 0) {
-              throw Starlark.errorf("integer modulo by zero");
-            }
-            // In Starlark, the sign of the result is the sign of the divisor.
-            int z = xi % yi;
-            if ((xi < 0) != (yi < 0) && z != 0) {
-              z += yi;
-            }
-            return z;
-          }
-
-        } else if (x instanceof String) {
-          // string % any
-          String xs = (String) x;
-          try {
-            if (y instanceof Tuple) {
-              return Starlark.formatWithList(xs, (Tuple) y);
-            } else {
-              return Starlark.format(xs, y);
-            }
-          } catch (IllegalFormatException ex) {
-            throw new EvalException(ex);
-          }
-        }
-        break;
-
-      case EQUALS_EQUALS:
-        return x.equals(y);
-
-      case NOT_EQUALS:
-        return !x.equals(y);
-
-      case LESS:
-        return compare(x, y) < 0;
-
-      case LESS_EQUALS:
-        return compare(x, y) <= 0;
-
-      case GREATER:
-        return compare(x, y) > 0;
-
-      case GREATER_EQUALS:
-        return compare(x, y) >= 0;
-
-      case IN:
-        if (y instanceof StarlarkIndexable) {
-          return ((StarlarkIndexable) y).containsKey(semantics, x);
-        } else if (y instanceof String) {
-          if (!(x instanceof String)) {
-            throw Starlark.errorf(
-                "'in <string>' requires string as left operand, not '%s'", Starlark.type(x));
-          }
-          return ((String) y).contains((String) x);
-        }
-        break;
-
-      case NOT_IN:
-        Object z = binaryOp(TokenKind.IN, x, y, semantics, mu);
-        if (z != null) {
-          return !Starlark.truth(z);
-        }
-        break;
-
-      default:
-        throw new AssertionError("not a binary operator: " + op);
-    }
-
-    // custom binary operator?
-    if (x instanceof HasBinary) {
-      Object z = ((HasBinary) x).binaryOp(op, y, true);
-      if (z != null) {
-        return z;
-      }
-    }
-    if (y instanceof HasBinary) {
-      Object z = ((HasBinary) y).binaryOp(op, x, false);
-      if (z != null) {
-        return z;
-      }
-    }
-
-    throw Starlark.errorf(
-        "unsupported binary operation: %s %s %s", Starlark.type(x), op, Starlark.type(y));
-  }
-
-  /** Implements comparison operators. */
-  private static int compare(Object x, Object y) throws EvalException {
-    try {
-      return STARLARK_COMPARATOR.compare(x, y);
-    } catch (ComparisonException e) {
-      throw new EvalException(e);
-    }
-  }
-
-  private static String repeatString(String s, int n) {
-    return n <= 0 ? "" : Strings.repeat(s, n);
-  }
-
-  /** Evaluates a unary operation. */
-  static Object unaryOp(TokenKind op, Object x) throws EvalException {
-    switch (op) {
-      case NOT:
-        return !Starlark.truth(x);
-
-      case MINUS:
-        if (x instanceof Integer) {
-          int xi = (Integer) x;
-          if (xi == Integer.MIN_VALUE) {
-            throw Starlark.errorf("integer overflow in negation");
-          }
-          return -xi;
-        }
-        break;
-
-      case PLUS:
-        if (x instanceof Integer) {
-          return x;
-        }
-        break;
-
-      case TILDE:
-        if (x instanceof Integer) {
-          return ~((Integer) x);
-        }
-        break;
-
-      default:
-        /* fall through */
-    }
-    throw Starlark.errorf("unsupported unary operation: %s%s", op, Starlark.type(x));
-  }
-
-  /**
-   * Returns the element of sequence or mapping {@code object} indexed by {@code key}.
-   *
-   * @throws EvalException if {@code object} is not a sequence or mapping.
-   */
-  static Object index(Mutability mu, StarlarkSemantics semantics, Object object, Object key)
-      throws EvalException {
-    if (object instanceof StarlarkIndexable) {
-      Object result = ((StarlarkIndexable) object).getIndex(semantics, key);
-      // TODO(bazel-team): We shouldn't have this fromJava call here. If it's needed at all,
-      // it should go in the implementations of StarlarkIndexable#getIndex that produce non-Starlark
-      // values.
-      return result == null ? null : Starlark.fromJava(result, mu);
-    } else if (object instanceof String) {
-      String string = (String) object;
-      int index = Starlark.toInt(key, "string index");
-      index = getSequenceIndex(index, string.length());
-      return string.substring(index, index + 1);
-    } else {
-      throw Starlark.errorf(
-          "type '%s' has no operator [](%s)", Starlark.type(object), Starlark.type(key));
-    }
-  }
-
-  /**
-   * Updates an object as if by the Starlark statement {@code object[key] = value}.
-   *
-   * @throws EvalException if the object is not a list or dict.
-   */
-  static void setIndex(Object object, Object key, Object value) throws EvalException {
-    if (object instanceof Dict) {
-      @SuppressWarnings("unchecked")
-      Dict<Object, Object> dict = (Dict<Object, Object>) object;
-      dict.put(key, value, (Location) null);
-
-    } else if (object instanceof StarlarkList) {
-      @SuppressWarnings("unchecked")
-      StarlarkList<Object> list = (StarlarkList<Object>) object;
-      int index = Starlark.toInt(key, "list index");
-      index = EvalUtils.getSequenceIndex(index, list.size());
-      list.set(index, value, (Location) null);
-
-    } else {
-      throw Starlark.errorf(
-          "can only assign an element in a dictionary or a list, not in a '%s'",
-          Starlark.type(object));
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java b/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
deleted file mode 100644
index 2206d79..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
+++ /dev/null
@@ -1,69 +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;
-
-
-/**
- * Base class for all expression nodes in the AST.
- *
- * <p>The only expressions permitted on the left-hand side of an assignment (such as 'lhs=rhs' or
- * 'for lhs in expr') are identifiers, dot expressions (x.y), list expressions ([expr, ...]), tuple
- * expressions ((expr, ...)), or parenthesized variants of those. In particular and unlike Python,
- * slice expressions and starred expressions cannot appear on the LHS. TODO(bazel-team): Add support
- * for assigning to slices (e.g. a[2:6] = [3]).
- */
-public abstract class Expression extends Node {
-
-  /**
-   * Kind of the expression. This is similar to using instanceof, except that it's more efficient
-   * and can be used in a switch/case.
-   */
-  public enum Kind {
-    BINARY_OPERATOR,
-    COMPREHENSION,
-    CONDITIONAL,
-    DICT_EXPR,
-    DOT,
-    CALL,
-    IDENTIFIER,
-    INDEX,
-    INTEGER_LITERAL,
-    LIST_EXPR,
-    SLICE,
-    STRING_LITERAL,
-    UNARY_OPERATOR,
-  }
-
-  Expression(FileLocations locs) {
-    super(locs);
-  }
-
-  /**
-   * Kind of the expression. This is similar to using instanceof, except that it's more efficient
-   * and can be used in a switch/case.
-   */
-  public abstract Kind kind();
-
-  /** Parses an expression with the default options. */
-  public static Expression parse(ParserInput input) throws SyntaxError.Exception {
-    return parse(input, FileOptions.DEFAULT);
-  }
-
-  /** Parses an expression. */
-  public static Expression parse(ParserInput input, FileOptions options)
-      throws SyntaxError.Exception {
-    return Parser.parseExpression(input, options);
-  }
-
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java
deleted file mode 100644
index 32d3b26..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java
+++ /dev/null
@@ -1,50 +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;
-
-/** Syntax node for a statement consisting of an expression evaluated for effect. */
-public final class ExpressionStatement extends Statement {
-
-  private final Expression expression;
-
-  ExpressionStatement(FileLocations locs, Expression expression) {
-    super(locs);
-    this.expression = expression;
-  }
-
-  public Expression getExpression() {
-    return expression;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public int getStartOffset() {
-    return expression.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return expression.getEndOffset();
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.EXPRESSION;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FileLocations.java b/src/main/java/com/google/devtools/build/lib/syntax/FileLocations.java
deleted file mode 100644
index a613d6e..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/FileLocations.java
+++ /dev/null
@@ -1,122 +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 java.util.Arrays;
-import java.util.Objects;
-import javax.annotation.concurrent.Immutable;
-
-/**
- * FileLocations maps each source offset within a file to a Location. An offset is a (UTF-16) char
- * index such that {@code 0 <= offset <= size}. A Location is a (file, line, column) triple.
- */
-@Immutable
-final class FileLocations {
-
-  private final int[] linestart; // maps line number (line >= 1) to char offset
-  private final String file;
-  private final int size; // size of file in chars
-
-  private FileLocations(int[] linestart, String file, int size) {
-    this.linestart = linestart;
-    this.file = file;
-    this.size = size;
-  }
-
-  static FileLocations create(char[] buffer, String file) {
-    return new FileLocations(computeLinestart(buffer), file, buffer.length);
-  }
-
-  String file() {
-    return file;
-  }
-
-  private int getLineAt(int offset) {
-    if (offset < 0 || offset > size) {
-      throw new IllegalStateException("Illegal position: " + offset);
-    }
-    int lowBoundary = 1;
-    int highBoundary = linestart.length - 1;
-    while (true) {
-      if ((highBoundary - lowBoundary) <= 1) {
-        if (linestart[highBoundary] > offset) {
-          return lowBoundary;
-        } else {
-          return highBoundary;
-        }
-      }
-      int medium = lowBoundary + ((highBoundary - lowBoundary) >> 1);
-      if (linestart[medium] > offset) {
-        highBoundary = medium;
-      } else {
-        lowBoundary = medium;
-      }
-    }
-  }
-
-  Location getLocation(int offset) {
-    int line = getLineAt(offset);
-    int column = offset - linestart[line] + 1;
-    return new Location(file, line, column);
-  }
-
-  int size() {
-    return size;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(Arrays.hashCode(linestart), file, size);
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (!(other instanceof FileLocations)) {
-      return false;
-    }
-    FileLocations that = (FileLocations) other;
-    return this.size == that.size
-        && Arrays.equals(this.linestart, that.linestart)
-        && this.file.equals(that.file);
-  }
-
-  private static int[] computeLinestart(char[] buffer) {
-    // Compute the size.
-    int size = 2;
-    for (int i = 0; i < buffer.length; i++) {
-      if (buffer[i] == '\n') {
-        size++;
-      }
-    }
-    int[] linestart = new int[size];
-
-    int index = 0;
-    linestart[index++] = 0; // The 0th line does not exist - so we fill something in
-    // to make sure the start pos for the 1st line ends up at
-    // linestart[1]. Using 0 is useful for tables that are
-    // completely empty.
-    linestart[index++] = 0; // The first line ("line 1") starts at offset 0.
-
-    // Scan the buffer and record the offset of each line start. Doing this
-    // once upfront is faster than checking each char as it is pulled from
-    // the buffer.
-    for (int i = 0; i < buffer.length; i++) {
-      if (buffer[i] == '\n') {
-        linestart[index++] = i + 1;
-      }
-    }
-    return linestart;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FileOptions.java b/src/main/java/com/google/devtools/build/lib/syntax/FileOptions.java
deleted file mode 100644
index 99be932..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/FileOptions.java
+++ /dev/null
@@ -1,116 +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.auto.value.AutoValue;
-
-/**
- * FileOptions is a set of options that affect the static processing---scanning, parsing, validation
- * (identifier resolution), and compilation---of a single Starlark file. These options affect the
- * language accepted by the frontend (in effect, the dialect), and "code generation", analogous to
- * the command-line options of a typical compiler.
- *
- * <p>Different files within the same application and even executed within the same thread may be
- * subject to different file options. For example, in Bazel, load statements in WORKSPACE files may
- * need to be interleaved with other statements, whereas in .bzl files, load statements must appear
- * all at the top. A single thread may execute a WORKSPACE file and call functions defined in .bzl
- * files.
- *
- * <p>The {@link #DEFAULT} options represent the desired behavior for new uses of Starlark. It is a
- * goal to keep this set of options small and closed. Each represents a language feature, perhaps a
- * deprecated, obscure, or regrettable one. By contrast, {@link StarlarkSemantics} defines a
- * (soon-to-be) open-ended set of options that affect the dynamic behavior of Starlark threads and
- * (mostly application-defined) built-in functions, and particularly attribute selection operations
- * {@code x.f}.
- */
-@AutoValue
-public abstract class FileOptions {
-
-  /** The default options for Starlark static processing. New clients should use these defaults. */
-  public static final FileOptions DEFAULT = builder().build();
-
-  // Options are presented in phase order: scanner, parser, validator, compiler.
-
-  // --- scanner options ---
-
-  /** Disallow ineffective escape sequences such as {@code \a} when scanning string literals. */
-  public abstract boolean restrictStringEscapes();
-
-  // --- validator options ---
-
-  /**
-   * During resolution, permit load statements to access private names such as {@code _x}. <br>
-   * (Required for continued support of Bazel "WORKSPACE.resolved" files.)
-   */
-  public abstract boolean allowLoadPrivateSymbols();
-
-  /**
-   * During resolution, permit multiple bindings of top-level variables. <br>
-   * (Required for continued support of Bazel BUILD files and Copybara files.)
-   */
-  public abstract boolean allowToplevelRebinding();
-
-  // TODO(adonovan): implement this option to support the REPL and prelude.
-  //
-  // /**
-  //  * During resolution, make load statements bind global variables of the module, not file-local
-  //  * variables. (Intended for use in REPLs, and the prelude.)
-  //  */
-  // public abstract boolean loadBindsGlobally();
-
-  /**
-   * During resolution, require load statements to appear before other kinds of statements. <br>
-   * (Required for continued support of Bazel BUILD and especially WORKSPACE files.)
-   */
-  public abstract boolean requireLoadStatementsFirst();
-
-  /**
-   * Record the results of name resolution in the syntax tree by setting {@code Identifer.scope}.
-   * (Disabled for Bazel BUILD files, as its prelude's syntax trees are shared.)
-   */
-  public abstract boolean recordScope();
-
-  public static Builder builder() {
-    // These are the DEFAULT values.
-    return new AutoValue_FileOptions.Builder()
-        .restrictStringEscapes(true)
-        .allowLoadPrivateSymbols(false)
-        .allowToplevelRebinding(false)
-        // .loadBindsGlobally(false)
-        .requireLoadStatementsFirst(true)
-        .recordScope(true);
-  }
-
-  public abstract Builder toBuilder();
-
-  /** This javadoc comment states that FileOptions.Builder is a builder for FileOptions. */
-  @AutoValue.Builder
-  public abstract static class Builder {
-    // AutoValue why u make me say it 3 times?
-    public abstract Builder restrictStringEscapes(boolean value);
-
-    public abstract Builder allowLoadPrivateSymbols(boolean value);
-
-    public abstract Builder allowToplevelRebinding(boolean value);
-
-    // public abstract Builder loadBindsGlobally(boolean value);
-
-    public abstract Builder requireLoadStatementsFirst(boolean value);
-
-    public abstract Builder recordScope(boolean value);
-
-    public abstract FileOptions build();
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java b/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java
deleted file mode 100644
index 489fd24..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java
+++ /dev/null
@@ -1,101 +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;
-
-/**
- * Wrapper on a value in the predeclared lexical block that controls its accessibility to Starlark
- * based on the value of a semantic flag.
- *
- * <p>For example, this could control whether symbol "Foo" exists in the Starlark global frame: such
- * a symbol might only be accessible if --experimental_foo is set to true. In order to create this
- * control, an instance of this class should be added to the global frame under "Foo". This flag
- * guard will throw a descriptive {@link EvalException} when "Foo" would be accessed without the
- * proper flag.
- */
-public final class FlagGuardedValue {
-  private final Object obj;
-  private final String flag;
-  private final FlagType flagType;
-
-  private enum FlagType {
-    DEPRECATION,
-    EXPERIMENTAL;
-  }
-
-  private FlagGuardedValue(Object obj, String flag, FlagType flagType) {
-    this.obj = obj;
-    if (flag.charAt(0) != '-' && flag.charAt(0) != '+') {
-      throw new IllegalArgumentException(String.format("flag needs [+-] prefix: %s", flag));
-    }
-    this.flag = flag;
-    this.flagType = flagType;
-  }
-
-  /**
-   * Creates a flag guard which only permits access of the given object when the given boolean flag
-   * is true. If the given flag is false and the object would be accessed, an error is thrown
-   * describing the feature as experimental, and describing that the flag must be set to true.
-   *
-   * <p>The flag identifier must have a + or - prefix; see StarlarkSemantics.
-   */
-  public static FlagGuardedValue onlyWhenExperimentalFlagIsTrue(String flag, Object obj) {
-    return new FlagGuardedValue(obj, flag, FlagType.EXPERIMENTAL);
-  }
-
-  /**
-   * Creates a flag guard which only permits access of the given object when the given boolean flag
-   * is false. If the given flag is true and the object would be accessed, an error is thrown
-   * describing the feature as deprecated, and describing that the flag must be set to false.
-   *
-   * <p>The flag identifier must have a + or - prefix; see StarlarkSemantics.
-   */
-  public static FlagGuardedValue onlyWhenIncompatibleFlagIsFalse(String flag, Object obj) {
-    return new FlagGuardedValue(obj, flag, FlagType.DEPRECATION);
-  }
-
-  /**
-   * Returns an error describing an attempt to access this guard's protected object when it should
-   * be inaccessible in the (contextually implied) semantics.
-   */
-  String getErrorFromAttemptingAccess(String name) {
-    return flagType == FlagType.EXPERIMENTAL
-        ? name
-            + " is experimental and thus unavailable with the current flags. It may be enabled by"
-            + " setting --"
-            + flag.substring(1)
-        : name
-            + " is deprecated and will be removed soon. It may be temporarily re-enabled by"
-            + " setting --"
-            + flag.substring(1)
-            + "=false";
-  }
-
-  /**
-   * Returns this guard's underlying object. This should be called when appropriate validation has
-   * occurred to ensure that the object is accessible with the (implied) semantics.
-   */
-  public Object getObject() {
-    return obj;
-  }
-
-  /** Returns true if this guard's underlying object is accessible under the given semantics. */
-  boolean isObjectAccessibleUsingSemantics(StarlarkSemantics semantics) {
-    if (flagType == FlagType.EXPERIMENTAL) {
-      return semantics.isFeatureEnabledBasedOnTogglingFlags(flag, "");
-    } else {
-      return semantics.isFeatureEnabledBasedOnTogglingFlags("", flag);
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
deleted file mode 100644
index 4013668..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
+++ /dev/null
@@ -1,58 +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;
-
-
-/** A class for flow statements (break, continue, and pass) */
-public final class FlowStatement extends Statement {
-
-  private final TokenKind kind; // BREAK | CONTINUE | PASS
-  private final int offset;
-
-  /** @param kind The label of the statement (break, continue, or pass) */
-  FlowStatement(FileLocations locs, TokenKind kind, int offset) {
-    super(locs);
-    this.kind = kind;
-    this.offset = offset;
-  }
-
-  public TokenKind getKind() {
-    return kind;
-  }
-
-  @Override
-  public String toString() {
-    return kind.toString() + "\n";
-  }
-
-  @Override
-  public int getStartOffset() {
-    return offset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return offset + kind.toString().length();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Statement.Kind kind() {
-    return Statement.Kind.FLOW;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java
deleted file mode 100644
index 8847860..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java
+++ /dev/null
@@ -1,82 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/** Syntax node for a for loop statement. */
-public final class ForStatement extends Statement {
-
-  private final int forOffset;
-  private final Expression vars;
-  private final Expression collection;
-  private final ImmutableList<Statement> body; // non-empty if well formed
-
-  /** Constructs a for loop statement. */
-  ForStatement(
-      FileLocations locs,
-      int forOffset,
-      Expression vars,
-      Expression collection,
-      ImmutableList<Statement> body) {
-    super(locs);
-    this.forOffset = forOffset;
-    this.vars = Preconditions.checkNotNull(vars);
-    this.collection = Preconditions.checkNotNull(collection);
-    this.body = body;
-  }
-
-  public Expression getVars() {
-    return vars;
-  }
-
-  /**
-   * @return The collection we iterate on, e.g. `col` in `for x in col:`
-   */
-  public Expression getCollection() {
-    return collection;
-  }
-
-  public ImmutableList<Statement> getBody() {
-    return body;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return forOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return body.isEmpty()
-        ? collection.getEndOffset() // wrong, but tree is ill formed
-        : body.get(body.size() - 1).getEndOffset();
-  }
-
-  @Override
-  public String toString() {
-    return "for " + vars + " in " + collection + ": ...\n";
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.FOR;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FormatParser.java b/src/main/java/com/google/devtools/build/lib/syntax/FormatParser.java
deleted file mode 100644
index 92dd881..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/FormatParser.java
+++ /dev/null
@@ -1,291 +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 com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A helper class that offers a subset of the functionality of Python's string#format.
- *
- * <p>Currently, both manual and automatic positional as well as named replacement fields are
- * supported. However, nested replacement fields are not allowed.
- */
-final class FormatParser {
-
-  /**
-   * Matches strings likely to be a number, faster alternative to relying solely on Integer.parseInt
-   * and NumberFormatException to determine numericness.
-   */
-  private static final CharMatcher LIKELY_NUMERIC_MATCHER =
-      CharMatcher.inRange('0', '9').or(CharMatcher.is('-'));
-
-  private static final ImmutableSet<Character> ILLEGAL_IN_FIELD =
-      ImmutableSet.of('.', '[', ']', ',');
-
-  /**
-   * Formats the given input string by using the given arguments
-   *
-   * <p>This method offers a subset of the functionality of Python's string#format
-   *
-   * @param input The string to be formatted
-   * @param args Positional arguments
-   * @param kwargs Named arguments
-   * @return The formatted string
-   */
-  String format(String input, List<Object> args, Map<String, Object> kwargs) throws EvalException {
-    char[] chars = input.toCharArray();
-    StringBuilder output = new StringBuilder();
-    History history = new History();
-
-    for (int pos = 0; pos < chars.length; ++pos) {
-      char current = chars[pos];
-      int advancePos = 0;
-
-      if (current == '{') {
-        advancePos = processOpeningBrace(chars, pos, args, kwargs, history, output);
-      } else if (current == '}') {
-        advancePos = processClosingBrace(chars, pos, output);
-      } else {
-        output.append(current);
-      }
-
-      pos += advancePos;
-    }
-
-    return output.toString();
-  }
-
-  /**
-   * Processes the expression after an opening brace (possibly a replacement field) and emits the
-   * result to the output StringBuilder
-   *
-   * @param chars The entire string
-   * @param pos The position of the opening brace
-   * @param args List of positional arguments
-   * @param kwargs Map of named arguments
-   * @param history Helper object that tracks information about previously seen positional
-   *     replacement fields
-   * @param output StringBuilder that consumes the result
-   * @return Number of characters that have been consumed by this method
-   */
-  private int processOpeningBrace(
-      char[] chars,
-      int pos,
-      List<Object> args,
-      Map<String, Object> kwargs,
-      History history,
-      StringBuilder output)
-      throws EvalException {
-    Printer printer = new Printer(output);
-    if (has(chars, pos + 1, '{')) {
-      // Escaped brace -> output and move to char after right brace
-      printer.append("{");
-      return 1;
-    }
-
-    // Inside a replacement field
-    String key = getFieldName(chars, pos);
-    Object value = null;
-
-    // Only positional replacement fields will lead to a valid index
-    try {
-      if (key.isEmpty() || LIKELY_NUMERIC_MATCHER.matchesAllOf(key)) {
-        int index = parsePositional(key, history);
-
-        if (index < 0 || index >= args.size()) {
-          throw Starlark.errorf("No replacement found for index %d", index);
-        }
-
-        value = args.get(index);
-      } else {
-        value = getKwarg(kwargs, key);
-      }
-    } catch (NumberFormatException nfe) {
-      // Non-integer index -> Named
-      value = getKwarg(kwargs, key);
-    }
-
-    // Format object for output
-    printer.str(value);
-
-    // Advances the current position to the index of the closing brace of the
-    // replacement field. Due to the definition of the enclosing for() loop,
-    // the next iteration will examine the character right after the brace.
-    return key.length() + 1;
-  }
-
-  private Object getKwarg(Map<String, Object> kwargs, String key) throws EvalException {
-    if (!kwargs.containsKey(key)) {
-      throw Starlark.errorf("Missing argument '%s'", key);
-    }
-
-    return kwargs.get(key);
-  }
-
-  /**
-   * Processes a closing brace and emits the result to the output StringBuilder
-   *
-   * @param chars The entire string
-   * @param pos Position of the closing brace
-   * @param output StringBuilder that consumes the result
-   * @return Number of characters that have been consumed by this method
-   */
-  private int processClosingBrace(char[] chars, int pos, StringBuilder output)
-      throws EvalException {
-    if (!has(chars, pos + 1, '}')) {
-      // Invalid brace outside replacement field
-      throw Starlark.errorf("Found '}' without matching '{'");
-    }
-
-    // Escaped brace -> output and move to char after right brace
-    output.append("}");
-    return 1;
-  }
-
-  /**
-   * Checks whether the given input string has a specific character at the given location
-   *
-   * @param data Input string as character array
-   * @param pos Position to be checked
-   * @param needle Character to be searched for
-   * @return True if string has the specified character at the given location
-   */
-  private static boolean has(char[] data, int pos, char needle) {
-    return pos < data.length && data[pos] == needle;
-  }
-
-  /**
-   * Extracts the name/index of the replacement field that starts at the specified location
-   *
-   * @param chars Input string
-   * @param openingBrace Position of the opening brace of the replacement field
-   * @return Name or index of the current replacement field
-   */
-  private String getFieldName(char[] chars, int openingBrace) throws EvalException {
-    StringBuilder result = new StringBuilder();
-    boolean foundClosingBrace = false;
-
-    for (int pos = openingBrace + 1; pos < chars.length; ++pos) {
-      char current = chars[pos];
-
-      if (current == '}') {
-        foundClosingBrace = true;
-        break;
-      } else {
-        if (current == '{') {
-          throw Starlark.errorf("Nested replacement fields are not supported");
-        } else if (ILLEGAL_IN_FIELD.contains(current)) {
-          throw Starlark.errorf("Invalid character '%s' inside replacement field", current);
-        }
-
-        result.append(current);
-      }
-    }
-
-    if (!foundClosingBrace) {
-      throw Starlark.errorf("Found '{' without matching '}'");
-    }
-
-    return result.toString();
-  }
-
-  /**
-   * Converts the given key into an integer or assigns the next available index, if empty.
-   *
-   * @param key Key to be converted
-   * @param history Helper object that tracks information about previously seen positional
-   *     replacement fields
-   * @return The integer equivalent of the key
-   */
-  private int parsePositional(String key, History history) throws EvalException {
-    int result = -1;
-
-    try {
-      if (key.isEmpty()) {
-        // Automatic positional -> a new index value has to be assigned
-        history.setAutomaticPositional();
-        result = history.getNextPosition();
-      } else {
-        // This will fail if key is a named argument
-        result = Integer.parseInt(key);
-        history.setManualPositional(); // Only register if the conversion succeeds
-      }
-    } catch (MixedTypeException mte) {
-      throw Starlark.errorf("%s", mte.getMessage());
-    }
-
-    return result;
-  }
-
-  /**
-   * Exception for invalid combinations of replacement field types
-   */
-  private static final class MixedTypeException extends Exception {
-    MixedTypeException() {
-      super("Cannot mix manual and automatic numbering of positional fields");
-    }
-  }
-
-  /**
-   * A wrapper to keep track of information about previous replacement fields
-   */
-  private static final class History {
-    /** Different types of positional replacement fields */
-    enum Positional {
-      NONE,
-      MANUAL, // {0}, {1} etc.
-      AUTOMATIC // {}
-    }
-
-    Positional type = Positional.NONE;
-    int position = -1;
-
-    /**
-     * Returns the next available index for an automatic positional replacement field
-     *
-     * @return Next index
-     */
-    int getNextPosition() {
-      ++position;
-      return position;
-    }
-
-    /** Registers a manual positional replacement field */
-    void setManualPositional() throws MixedTypeException {
-      setPositional(Positional.MANUAL);
-    }
-
-    /** Registers an automatic positional replacement field */
-    void setAutomaticPositional() throws MixedTypeException {
-      setPositional(Positional.AUTOMATIC);
-    }
-
-    /**
-     * Indicates that a positional replacement field of the specified type is being processed and
-     * checks whether this conflicts with any previously seen replacement fields
-     *
-     * @param current Type of current replacement field
-     */
-    void setPositional(Positional current) throws MixedTypeException {
-      if (type == Positional.NONE) {
-        type = current;
-      } else if (type != current) {
-        throw new MixedTypeException();
-      }
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/HasBinary.java b/src/main/java/com/google/devtools/build/lib/syntax/HasBinary.java
deleted file mode 100644
index d5b5566..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/HasBinary.java
+++ /dev/null
@@ -1,40 +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 javax.annotation.Nullable;
-
-/**
- * A Starlark value that supports binary operators such as {@code x+y}.
- *
- * <p>During evaluation of a Starlark binary operation, if none of the built-in cases match, then
- * the left operand is queried; if it implements HasBinary, its {@link #binaryOp} method is called.
- * If the left operand does not implement HasBinary, or declines to implement the particular
- * operation by returning null, then the right operand is queried for HasBinary and its {@link
- * #binaryOp} method is called. If neither operand defines the operator, evaluation fails.
- *
- * <p>Subclasses should strive for appropriate symmetries in their implementations, such as {@code x
- * * y == y * x}.
- */
-// TODO(adonovan): rename BinaryOperand?
-public interface HasBinary extends StarlarkValue {
-
-  /**
-   * Returns {@code this op that}, if thisLeft, or {@code that op this} otherwise. May return null
-   * to indicate that the operation is not supported, or may throw a specific exception.
-   */
-  @Nullable
-  Object binaryOp(TokenKind op, Object that, boolean thisLeft) throws EvalException;
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
deleted file mode 100644
index ac1ff86..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
+++ /dev/null
@@ -1,138 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableSet;
-import javax.annotation.Nullable;
-
-/** Syntax node for an identifier. */
-public final class Identifier extends Expression {
-
-  private final String name;
-  private final int nameOffset;
-
-  // set by Resolver
-  @Nullable private Resolver.Binding binding;
-
-  Identifier(FileLocations locs, String name, int nameOffset) {
-    super(locs);
-    this.name = name;
-    this.nameOffset = nameOffset;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return nameOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return nameOffset + name.length();
-  }
-
-  /**
-   * Returns the name of the Identifier. If there were parse errors, misparsed regions may be
-   * represented as an Identifier for which {@code !isValid(getName())}.
-   */
-  public String getName() {
-    return name;
-  }
-
-  public boolean isPrivate() {
-    return name.startsWith("_");
-  }
-
-  /** Returns information about the binding that the identifier denotes. Set by the resolver. */
-  @Nullable
-  public Resolver.Binding getBinding() {
-    return binding;
-  }
-
-  void setBinding(Resolver.Binding bind) {
-    Preconditions.checkState(this.binding == null);
-    this.binding = bind;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.IDENTIFIER;
-  }
-
-  /** Reports whether the string is a valid identifier. */
-  public static boolean isValid(String name) {
-    // Keep consistent with Lexer.scanIdentifier.
-    for (int i = 0; i < name.length(); i++) {
-      char c = name.charAt(i);
-      if (!(('a' <= c && c <= 'z')
-          || ('A' <= c && c <= 'Z')
-          || (i > 0 && '0' <= c && c <= '9')
-          || (c == '_'))) {
-        return false;
-      }
-    }
-    return !name.isEmpty();
-  }
-
-  /**
-   * Returns all names bound by an LHS expression.
-   *
-   * <p>Examples:
-   *
-   * <ul>
-   *   <li><{@code x = ...} binds x.
-   *   <li><{@code x, [y,z] = ..} binds x, y, z.
-   *   <li><{@code x[5] = ..} does not bind any names.
-   * </ul>
-   */
-  // TODO(adonovan): remove this function in due course.
-  // - Resolver makes one pass to discover bindings than another to resolve uses.
-  //   When it works in a single pass, it is more efficient to process bindings in order,
-  //   deferring (rare) forward references until the end of the block.
-  // - Eval calls boundIdentifiers for comprehensions. This can be eliminated when
-  //   recordScope is always enabled and variables are assigned frame slot indices.
-  // - Eval calls boundIdentifiers for the 'export' hack. This can be eliminated
-  //   when we switch to compilation by emitting EXPORT instructions for the necessary
-  //   bindings. (Ideally we would eliminate Bazel's export hack entirely.)
-  public static ImmutableSet<Identifier> boundIdentifiers(Expression expr) {
-    if (expr instanceof Identifier) {
-      // Common case/fast path - skip the builder.
-      return ImmutableSet.of((Identifier) expr);
-    } else {
-      ImmutableSet.Builder<Identifier> result = ImmutableSet.builder();
-      collectBoundIdentifiers(expr, result);
-      return result.build();
-    }
-  }
-
-  private static void collectBoundIdentifiers(
-      Expression lhs, ImmutableSet.Builder<Identifier> result) {
-    if (lhs instanceof Identifier) {
-      result.add((Identifier) lhs);
-      return;
-    }
-    if (lhs instanceof ListExpression) {
-      ListExpression variables = (ListExpression) lhs;
-      for (Expression expression : variables.getElements()) {
-        collectBoundIdentifiers(expression, result);
-      }
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
deleted file mode 100644
index 08a0dfd..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
+++ /dev/null
@@ -1,97 +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 com.google.common.collect.ImmutableList;
-import java.util.List;
-import javax.annotation.Nullable;
-
-/** Syntax node for an if or elif statement. */
-public final class IfStatement extends Statement {
-
-  private final TokenKind token; // IF or ELIF
-  private final int ifOffset;
-  private final Expression condition;
-  // These blocks may be non-null but empty after a misparse:
-  private final ImmutableList<Statement> thenBlock; // non-empty
-  @Nullable ImmutableList<Statement> elseBlock; // non-empty if non-null; set after construction
-
-  IfStatement(
-      FileLocations locs,
-      TokenKind token,
-      int ifOffset,
-      Expression condition,
-      List<Statement> thenBlock) {
-    super(locs);
-    this.token = token;
-    this.ifOffset = ifOffset;
-    this.condition = condition;
-    this.thenBlock = ImmutableList.copyOf(thenBlock);
-  }
-
-  /**
-   * Reports whether this is an 'elif' statement.
-   *
-   * <p>An elif statement may appear only as the sole statement in the "else" block of another
-   * IfStatement.
-   */
-  public boolean isElif() {
-    return token == TokenKind.ELIF;
-  }
-
-  public Expression getCondition() {
-    return condition;
-  }
-
-  public ImmutableList<Statement> getThenBlock() {
-    return thenBlock;
-  }
-
-  @Nullable
-  public ImmutableList<Statement> getElseBlock() {
-    return elseBlock;
-  }
-
-  void setElseBlock(ImmutableList<Statement> elseBlock) {
-    this.elseBlock = elseBlock;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return ifOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    List<Statement> body = elseBlock != null ? elseBlock : thenBlock;
-    return body.isEmpty()
-        ? condition.getEndOffset() // wrong, but tree is ill formed
-        : body.get(body.size() - 1).getEndOffset();
-  }
-
-  @Override
-  public String toString() {
-    return String.format("if %s: ...\n", condition);
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.IF;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java
deleted file mode 100644
index 6baf1b5..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java
+++ /dev/null
@@ -1,73 +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;
-
-
-/**
- * An index expression ({@code obj[field]}). Not to be confused with a slice expression ({@code
- * obj[from:to]}). The object may be either a sequence or an associative mapping (most commonly
- * lists and dictionaries).
- */
-public final class IndexExpression extends Expression {
-
-  private final Expression object;
-  private final int lbracketOffset;
-  private final Expression key;
-  private final int rbracketOffset;
-
-  IndexExpression(
-      FileLocations locs,
-      Expression object,
-      int lbracketOffset,
-      Expression key,
-      int rbracketOffset) {
-    super(locs);
-    this.object = object;
-    this.lbracketOffset = lbracketOffset;
-    this.key = key;
-    this.rbracketOffset = rbracketOffset;
-  }
-
-  public Expression getObject() {
-    return object;
-  }
-
-  public Expression getKey() {
-    return key;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return object.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rbracketOffset + 1;
-  }
-
-  public Location getLbracketLocation() {
-    return locs.getLocation(lbracketOffset);
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.INDEX;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
deleted file mode 100644
index 415d8d2..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
+++ /dev/null
@@ -1,58 +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;
-
-
-/** Syntax node for an integer literal. */
-public final class IntegerLiteral extends Expression {
-  private final String raw;
-  private final int tokenOffset;
-  private final int value;
-
-  IntegerLiteral(FileLocations locs, String raw, int tokenOffset, int value) {
-    super(locs);
-    this.raw = raw;
-    this.tokenOffset = tokenOffset;
-    this.value = value;
-  }
-
-  public int getValue() {
-    return value;
-  }
-
-  /** Returns the raw source text of the literal. */
-  public String getRaw() {
-    return raw;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return tokenOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return tokenOffset + raw.length();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.INTEGER_LITERAL;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/JNI.java b/src/main/java/com/google/devtools/build/lib/syntax/JNI.java
deleted file mode 100644
index b8de3009..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/JNI.java
+++ /dev/null
@@ -1,30 +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;
-
-final class JNI {
-  private JNI() {} // uninstantiable
-
-  static void load() {
-    try {
-      System.loadLibrary("cpu_profiler");
-    } catch (UnsatisfiedLinkError ex) {
-      // Ignore, deferring the error until a C function is called, if ever.
-      // Without this hack //src/test/shell/bazel:bazel_bootstrap_distfile_test
-      // fails with an utterly uninformative error.
-      // TODO(adonovan): remove try/catch once that test is fixed.
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
deleted file mode 100644
index 4d066fa..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
+++ /dev/null
@@ -1,867 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-/** A scanner for Starlark. */
-final class Lexer {
-
-  // --- These fields are accessed directly by the parser: ---
-
-  // Mapping from file offsets to Locations.
-  final FileLocations locs;
-
-  // Information about current token. Updated by nextToken.
-  // raw and value are defined only for STRING, INT, IDENTIFIER, and COMMENT.
-  // TODO(adonovan): rename s/xyz/tokenXyz/
-  TokenKind kind;
-  int start; // start offset
-  int end; // end offset
-  String raw; // source text of token
-  Object value; // String or Integer value of token
-
-  // --- end of parser-visible fields ---
-
-  private final List<SyntaxError> errors;
-
-  // Input buffer and position
-  private final char[] buffer;
-  private int pos;
-
-  private final FileOptions options;
-
-  // The stack of enclosing indentation levels in spaces.
-  // The first (outermost) element is always zero.
-  private final Stack<Integer> indentStack = new Stack<>();
-
-  private final List<Comment> comments;
-
-  // The number of unclosed open-parens ("(", '{', '[') at the current point in
-  // the stream. Whitespace is handled differently when this is nonzero.
-  private int openParenStackDepth = 0;
-
-  // True after a NEWLINE token. In other words, we are outside an
-  // expression and we have to check the indentation.
-  private boolean checkIndentation;
-
-  // Number of saved INDENT (>0) or OUTDENT (<0) tokens detected but not yet returned.
-  private int dents;
-
-  // Characters that can come immediately prior to an '=' character to generate
-  // a different token
-  private static final ImmutableMap<Character, TokenKind> EQUAL_TOKENS =
-      ImmutableMap.<Character, TokenKind>builder()
-          .put('=', TokenKind.EQUALS_EQUALS)
-          .put('!', TokenKind.NOT_EQUALS)
-          .put('>', TokenKind.GREATER_EQUALS)
-          .put('<', TokenKind.LESS_EQUALS)
-          .put('+', TokenKind.PLUS_EQUALS)
-          .put('-', TokenKind.MINUS_EQUALS)
-          .put('*', TokenKind.STAR_EQUALS)
-          .put('/', TokenKind.SLASH_EQUALS)
-          .put('%', TokenKind.PERCENT_EQUALS)
-          .put('^', TokenKind.CARET_EQUALS)
-          .put('&', TokenKind.AMPERSAND_EQUALS)
-          .put('|', TokenKind.PIPE_EQUALS)
-          .build();
-
-  // Constructs a lexer which tokenizes the parser input.
-  // Errors are appended to errors.
-  Lexer(ParserInput input, FileOptions options, List<SyntaxError> errors) {
-    this.locs = FileLocations.create(input.getContent(), input.getFile());
-    this.options = options;
-    this.buffer = input.getContent();
-    this.pos = 0;
-    this.errors = errors;
-    this.checkIndentation = true;
-    this.comments = new ArrayList<>();
-    this.dents = 0;
-
-    indentStack.push(0);
-  }
-
-  List<Comment> getComments() {
-    return comments;
-  }
-
-  /**
-   * Reads the next token, updating the Lexer's token fields. It is an error to call nextToken after
-   * an EOF token.
-   */
-  void nextToken() {
-    boolean afterNewline = kind == TokenKind.NEWLINE;
-    tokenize();
-    Preconditions.checkState(kind != null);
-
-    // Like Python, always end with a NEWLINE token, even if no '\n' in input:
-    if (kind == TokenKind.EOF && !afterNewline) {
-      kind = TokenKind.NEWLINE;
-    }
-  }
-
-  private void popParen() {
-    if (openParenStackDepth == 0) {
-      // TODO(adonovan): fix: the input ')' should not report an indentation error.
-      error("indentation error", pos - 1);
-    } else {
-      openParenStackDepth--;
-    }
-  }
-
-  private void error(String message, int pos) {
-    errors.add(new SyntaxError(locs.getLocation(pos), message));
-  }
-
-  private void setToken(TokenKind kind, int start, int end) {
-    this.kind = kind;
-    this.start = start;
-    this.end = end;
-    this.value = null;
-    this.raw = null;
-  }
-
-  // setValue sets the value associated with a STRING, FLOAT, INT,
-  // IDENTIFIER, or COMMENT token, and records the raw text of the token.
-  private void setValue(Object value) {
-    this.value = value;
-    this.raw = bufferSlice(start, end);
-  }
-
-  /**
-   * Parses an end-of-line sequence, handling statement indentation correctly.
-   *
-   * <p>UNIX newlines are assumed (LF). Carriage returns are always ignored.
-   */
-  private void newline() {
-    if (openParenStackDepth > 0) {
-      newlineInsideExpression(); // in an expression: ignore space
-    } else {
-      checkIndentation = true;
-      setToken(TokenKind.NEWLINE, pos - 1, pos);
-    }
-  }
-
-  private void newlineInsideExpression() {
-    while (pos < buffer.length) {
-      switch (buffer[pos]) {
-        case ' ': case '\t': case '\r':
-          pos++;
-          break;
-        default:
-          return;
-      }
-    }
-  }
-
-  /** Computes indentation (updates dent) and advances pos. */
-  private void computeIndentation() {
-    // we're in a stmt: suck up space at beginning of next line
-    int indentLen = 0;
-    while (pos < buffer.length) {
-      char c = buffer[pos];
-      if (c == ' ') {
-        indentLen++;
-        pos++;
-      } else if (c == '\r') {
-        pos++;
-      } else if (c == '\t') {
-        indentLen++;
-        pos++;
-        error("Tab characters are not allowed for indentation. Use spaces instead.", pos);
-      } else if (c == '\n') { // entirely blank line: discard
-        indentLen = 0;
-        pos++;
-      } else if (c == '#') { // line containing only indented comment
-        int oldPos = pos;
-        while (pos < buffer.length && c != '\n') {
-          c = buffer[pos++];
-        }
-        addComment(oldPos, pos - 1);
-        indentLen = 0;
-      } else { // printing character
-        break;
-      }
-    }
-
-    if (pos == buffer.length) {
-      indentLen = 0;
-    } // trailing space on last line
-
-    int peekedIndent = indentStack.peek();
-    if (peekedIndent < indentLen) { // push a level
-      indentStack.push(indentLen);
-      dents++;
-
-    } else if (peekedIndent > indentLen) { // pop one or more levels
-      while (peekedIndent > indentLen) {
-        indentStack.pop();
-        dents--;
-        peekedIndent = indentStack.peek();
-      }
-
-      if (peekedIndent < indentLen) {
-        error("indentation error", pos - 1);
-      }
-    }
-  }
-
-  /**
-   * Returns true if current position is in the middle of a triple quote
-   * delimiter (3 x quot), and advances 'pos' by two if so.
-   */
-  private boolean skipTripleQuote(char quot) {
-    if (lookaheadIs(0, quot) && lookaheadIs(1, quot)) {
-      pos += 2;
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  /**
-   * Scans a string literal delimited by 'quot', containing escape sequences.
-   *
-   * <p>ON ENTRY: 'pos' is 1 + the index of the first delimiter
-   * ON EXIT: 'pos' is 1 + the index of the last delimiter.
-   */
-  private void escapedStringLiteral(char quot, boolean isRaw) {
-    int literalStartPos = isRaw ? pos - 2 : pos - 1;
-    boolean inTriplequote = skipTripleQuote(quot);
-    // more expensive second choice that expands escaped into a buffer
-    StringBuilder literal = new StringBuilder();
-    while (pos < buffer.length) {
-      char c = buffer[pos];
-      pos++;
-      switch (c) {
-        case '\n':
-          if (inTriplequote) {
-            literal.append(c);
-            break;
-          } else {
-            error("unterminated string literal at eol", literalStartPos);
-            setToken(TokenKind.STRING, literalStartPos, pos);
-            setValue(literal.toString());
-            return;
-          }
-        case '\\':
-          if (pos == buffer.length) {
-            error("unterminated string literal at eof", literalStartPos);
-            setToken(TokenKind.STRING, literalStartPos, pos);
-            setValue(literal.toString());
-            return;
-          }
-          if (isRaw) {
-            // Insert \ and the following character.
-            // As in Python, it means that a raw string can never end with a single \.
-            literal.append('\\');
-            if (lookaheadIs(0, '\r') && lookaheadIs(1, '\n')) {
-              literal.append("\n");
-              pos += 2;
-            } else if (buffer[pos] == '\r' || buffer[pos] == '\n') {
-              literal.append("\n");
-              pos += 1;
-            } else {
-              literal.append(buffer[pos]);
-              pos += 1;
-            }
-            break;
-          }
-          c = buffer[pos];
-          pos++;
-          switch (c) {
-            case '\r':
-              if (lookaheadIs(0, '\n')) {
-                pos += 1;
-                break;
-              } else {
-                break;
-              }
-            case '\n':
-              // ignore end of line character
-              break;
-            case 'n':
-              literal.append('\n');
-              break;
-            case 'r':
-              literal.append('\r');
-              break;
-            case 't':
-              literal.append('\t');
-              break;
-            case '\\':
-              literal.append('\\');
-              break;
-            case '\'':
-              literal.append('\'');
-              break;
-            case '"':
-              literal.append('"');
-              break;
-            case '0':
-            case '1':
-            case '2':
-            case '3':
-            case '4':
-            case '5':
-            case '6':
-            case '7':
-              { // octal escape
-                int octal = c - '0';
-                if (pos < buffer.length) {
-                  c = buffer[pos];
-                  if (c >= '0' && c <= '7') {
-                    pos++;
-                    octal = (octal << 3) | (c - '0');
-                    if (pos < buffer.length) {
-                      c = buffer[pos];
-                      if (c >= '0' && c <= '7') {
-                        pos++;
-                        octal = (octal << 3) | (c - '0');
-                      }
-                    }
-                  }
-                }
-                if (octal > 0xff) {
-                  error("octal escape sequence out of range (maximum is \\377)", pos - 1);
-                }
-                literal.append((char) (octal & 0xff));
-                break;
-              }
-            case 'a':
-            case 'b':
-            case 'f':
-            case 'N':
-            case 'u':
-            case 'U':
-            case 'v':
-            case 'x':
-              // exists in Python but not implemented in Blaze => error
-              error("invalid escape sequence: \\" + c, pos - 1);
-              break;
-            default:
-              // unknown char escape => "\literal"
-              if (options.restrictStringEscapes()) {
-                error(
-                    "invalid escape sequence: \\"
-                        + c
-                        + ". You can enable unknown escape sequences by passing the flag"
-                        + " --incompatible_restrict_string_escapes=false",
-                    pos - 1);
-              }
-              literal.append('\\');
-              literal.append(c);
-              break;
-          }
-          break;
-        case '\'':
-        case '"':
-          if (c != quot || (inTriplequote && !skipTripleQuote(quot))) {
-            // Non-matching quote, treat it like a regular char.
-            literal.append(c);
-          } else {
-            // Matching close-delimiter, all done.
-            setToken(TokenKind.STRING, literalStartPos, pos);
-            setValue(literal.toString());
-            return;
-          }
-          break;
-        default:
-          literal.append(c);
-          break;
-      }
-    }
-    error("unterminated string literal at eof", literalStartPos);
-    setToken(TokenKind.STRING, literalStartPos, pos);
-    setValue(literal.toString());
-  }
-
-  /**
-   * Scans a string literal delimited by 'quot'.
-   *
-   * <ul>
-   * <li> ON ENTRY: 'pos' is 1 + the index of the first delimiter
-   * <li> ON EXIT: 'pos' is 1 + the index of the last delimiter.
-   * </ul>
-   *
-   * @param isRaw if true, do not escape the string.
-   */
-  private void stringLiteral(char quot, boolean isRaw) {
-    int literalStartPos = isRaw ? pos - 2 : pos - 1;
-    int contentStartPos = pos;
-
-    // Don't even attempt to parse triple-quotes here.
-    if (skipTripleQuote(quot)) {
-      pos -= 2;
-      escapedStringLiteral(quot, isRaw);
-      return;
-    }
-
-    // first quick optimistic scan for a simple non-escaped string
-    while (pos < buffer.length) {
-      char c = buffer[pos++];
-      switch (c) {
-        case '\n':
-          error("unterminated string literal at eol", literalStartPos);
-          setToken(TokenKind.STRING, literalStartPos, pos);
-          setValue(bufferSlice(contentStartPos, pos - 1));
-          return;
-        case '\\':
-          if (isRaw) {
-            if (lookaheadIs(0, '\r') && lookaheadIs(1, '\n')) {
-              // There was a CRLF after the newline. No shortcut possible, since it needs to be
-              // transformed into a single LF.
-              pos = contentStartPos;
-              escapedStringLiteral(quot, true);
-              return;
-            } else {
-              pos++;
-              break;
-            }
-          }
-          // oops, hit an escape, need to start over & build a new string buffer
-          pos = contentStartPos;
-          escapedStringLiteral(quot, false);
-          return;
-        case '\'':
-        case '"':
-          if (c == quot) {
-            // close-quote, all done.
-            setToken(TokenKind.STRING, literalStartPos, pos);
-            setValue(bufferSlice(contentStartPos, pos - 1));
-            return;
-          }
-          break;
-        default: // fall out
-      }
-    }
-
-    // If the current position is beyond the end of the file, need to move it backwards
-    // Possible if the file ends with `r"\` (unterminated raw string literal with a backslash)
-    if (pos > buffer.length) {
-      pos = buffer.length;
-    }
-
-    error("unterminated string literal at eof", literalStartPos);
-    setToken(TokenKind.STRING, literalStartPos, pos);
-    setValue(bufferSlice(contentStartPos, pos));
-  }
-
-  private static final Map<String, TokenKind> keywordMap = new HashMap<>();
-
-  static {
-    keywordMap.put("and", TokenKind.AND);
-    keywordMap.put("as", TokenKind.AS);
-    keywordMap.put("assert", TokenKind.ASSERT);
-    keywordMap.put("break", TokenKind.BREAK);
-    keywordMap.put("class", TokenKind.CLASS);
-    keywordMap.put("continue", TokenKind.CONTINUE);
-    keywordMap.put("def", TokenKind.DEF);
-    keywordMap.put("del", TokenKind.DEL);
-    keywordMap.put("elif", TokenKind.ELIF);
-    keywordMap.put("else", TokenKind.ELSE);
-    keywordMap.put("except", TokenKind.EXCEPT);
-    keywordMap.put("finally", TokenKind.FINALLY);
-    keywordMap.put("for", TokenKind.FOR);
-    keywordMap.put("from", TokenKind.FROM);
-    keywordMap.put("global", TokenKind.GLOBAL);
-    keywordMap.put("if", TokenKind.IF);
-    keywordMap.put("import", TokenKind.IMPORT);
-    keywordMap.put("in", TokenKind.IN);
-    keywordMap.put("is", TokenKind.IS);
-    keywordMap.put("lambda", TokenKind.LAMBDA);
-    keywordMap.put("load", TokenKind.LOAD);
-    keywordMap.put("nonlocal", TokenKind.NONLOCAL);
-    keywordMap.put("not", TokenKind.NOT);
-    keywordMap.put("or", TokenKind.OR);
-    keywordMap.put("pass", TokenKind.PASS);
-    keywordMap.put("raise", TokenKind.RAISE);
-    keywordMap.put("return", TokenKind.RETURN);
-    keywordMap.put("try", TokenKind.TRY);
-    keywordMap.put("while", TokenKind.WHILE);
-    keywordMap.put("with", TokenKind.WITH);
-    keywordMap.put("yield", TokenKind.YIELD);
-  }
-
-  /**
-   * Scans an identifier or keyword.
-   *
-   * <p>ON ENTRY: 'pos' is 1 + the index of the first char in the identifier.
-   * ON EXIT: 'pos' is 1 + the index of the last char in the identifier.
-   */
-  private void identifierOrKeyword() {
-    int oldPos = pos - 1;
-    String id = scanIdentifier();
-    TokenKind kind = keywordMap.get(id);
-    if (kind == null) {
-      setToken(TokenKind.IDENTIFIER, oldPos, pos);
-      setValue(id);
-    } else {
-      setToken(kind, oldPos, pos);
-    }
-  }
-
-  private String scanIdentifier() {
-    // Keep consistent with Identifier.isValid.
-    // TODO(laurentlb): Handle Unicode letters.
-    int oldPos = pos - 1;
-    while (pos < buffer.length) {
-      switch (buffer[pos]) {
-        case '_':
-        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-        case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
-        case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
-        case 's': case 't': case 'u': case 'v': case 'w': case 'x':
-        case 'y': case 'z':
-        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-        case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
-        case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
-        case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
-        case 'Y': case 'Z':
-        case '0': case '1': case '2': case '3': case '4': case '5':
-        case '6': case '7': case '8': case '9':
-          pos++;
-          break;
-       default:
-          return bufferSlice(oldPos, pos);
-      }
-    }
-    return bufferSlice(oldPos, pos);
-  }
-
-  private String scanInteger() {
-    int oldPos = pos - 1;
-    loop:
-    while (pos < buffer.length) {
-      char c = buffer[pos];
-      switch (c) {
-        case 'X': case 'x': // for hexadecimal prefix
-        case 'O': case 'o': // for octal prefix
-        case 'a': case 'A':
-        case 'b': case 'B':
-        case 'c': case 'C':
-        case 'd': case 'D':
-        case 'e': case 'E':
-        case 'f': case 'F':
-          if (buffer[oldPos] != '0') {
-            // A number not starting with zero must be decimal and can only contain decimal digits.
-            break loop;
-          }
-          pos++;
-          break;
-        case '0': case '1':
-        case '2': case '3':
-        case '4': case '5':
-        case '6': case '7':
-        case '8': case '9':
-          pos++;
-          break;
-        default:
-          break loop;
-      }
-    }
-    return bufferSlice(oldPos, pos);
-  }
-
-  /**
-   * Scans an integer literal.
-   *
-   * <p>ON ENTRY: 'pos' is 1 + the index of the first char in the literal.
-   * ON EXIT: 'pos' is 1 + the index of the last char in the literal.
-   */
-  private void integer() {
-    int oldPos = pos - 1;
-    String literal = scanInteger();
-
-    final String substring;
-    final int radix;
-    if (literal.startsWith("0x") || literal.startsWith("0X")) {
-      radix = 16;
-      substring = literal.substring(2);
-    } else if (literal.startsWith("0o") || literal.startsWith("0O")) {
-      radix = 8;
-      substring = literal.substring(2);
-    } else if (literal.startsWith("0") && literal.length() > 1) {
-      radix = 8;
-      substring = literal.substring(1);
-      error("invalid octal value `" + literal + "`, should be: `0o" + substring + "`", oldPos);
-    } else {
-      radix = 10;
-      substring = literal;
-    }
-
-    int value = 0;
-    try {
-      value = Integer.parseInt(substring, radix);
-    } catch (NumberFormatException e) {
-      error("invalid base-" + radix + " integer constant: " + literal, oldPos);
-    }
-
-    setToken(TokenKind.INT, oldPos, pos);
-    setValue(value);
-  }
-
-  /**
-   * Tokenizes a two-char operator.
-   * @return true if it tokenized an operator
-   */
-  private boolean tokenizeTwoChars() {
-    if (pos + 2 >= buffer.length) {
-      return false;
-    }
-    char c1 = buffer[pos];
-    char c2 = buffer[pos + 1];
-    TokenKind tok = null;
-    if (c2 == '=') {
-      tok = EQUAL_TOKENS.get(c1);
-    } else if (c2 == '*' && c1 == '*') {
-      tok = TokenKind.STAR_STAR;
-    }
-    if (tok == null) {
-      return false;
-    } else {
-      setToken(tok, pos, pos + 2);
-      return true;
-    }
-  }
-
-  /** Test if the character at pos+p is c. */
-  private boolean lookaheadIs(int p, char c) {
-    return pos + p < buffer.length && buffer[pos + p] == c;
-  }
-
-  /**
-   * Performs tokenization of the character buffer of file contents provided to the constructor. At
-   * least one token will be added to the tokens queue.
-   */
-  private void tokenize() {
-    if (checkIndentation) {
-      checkIndentation = false;
-      computeIndentation();
-    }
-
-    // Return saved indentation tokens.
-    if (dents != 0) {
-      if (dents < 0) {
-        dents++;
-        setToken(TokenKind.OUTDENT, pos - 1, pos);
-      } else {
-        dents--;
-        setToken(TokenKind.INDENT, pos - 1, pos);
-      }
-      return;
-    }
-
-    // TODO(adonovan): cleanup: replace break after setToken with return,
-    // and eliminate null-check of this.kind.
-    kind = null;
-    while (pos < buffer.length) {
-      if (tokenizeTwoChars()) {
-        pos += 2;
-        return;
-      }
-      char c = buffer[pos];
-      pos++;
-      switch (c) {
-        case '{':
-          setToken(TokenKind.LBRACE, pos - 1, pos);
-          openParenStackDepth++;
-          break;
-        case '}':
-          setToken(TokenKind.RBRACE, pos - 1, pos);
-          popParen();
-          break;
-        case '(':
-          setToken(TokenKind.LPAREN, pos - 1, pos);
-          openParenStackDepth++;
-          break;
-        case ')':
-          setToken(TokenKind.RPAREN, pos - 1, pos);
-          popParen();
-          break;
-        case '[':
-          setToken(TokenKind.LBRACKET, pos - 1, pos);
-          openParenStackDepth++;
-          break;
-        case ']':
-          setToken(TokenKind.RBRACKET, pos - 1, pos);
-          popParen();
-          break;
-        case '>':
-          if (lookaheadIs(0, '>') && lookaheadIs(1, '=')) {
-            setToken(TokenKind.GREATER_GREATER_EQUALS, pos - 1, pos + 2);
-            pos += 2;
-          } else if (lookaheadIs(0, '>')) {
-            setToken(TokenKind.GREATER_GREATER, pos - 1, pos + 1);
-            pos += 1;
-          } else {
-            setToken(TokenKind.GREATER, pos - 1, pos);
-          }
-          break;
-        case '<':
-          if (lookaheadIs(0, '<') && lookaheadIs(1, '=')) {
-            setToken(TokenKind.LESS_LESS_EQUALS, pos - 1, pos + 2);
-            pos += 2;
-          } else if (lookaheadIs(0, '<')) {
-            setToken(TokenKind.LESS_LESS, pos - 1, pos + 1);
-            pos += 1;
-          } else {
-            setToken(TokenKind.LESS, pos - 1, pos);
-          }
-          break;
-        case ':':
-          setToken(TokenKind.COLON, pos - 1, pos);
-          break;
-        case ',':
-          setToken(TokenKind.COMMA, pos - 1, pos);
-          break;
-        case '+':
-          setToken(TokenKind.PLUS, pos - 1, pos);
-          break;
-        case '-':
-          setToken(TokenKind.MINUS, pos - 1, pos);
-          break;
-        case '|':
-          setToken(TokenKind.PIPE, pos - 1, pos);
-          break;
-        case '=':
-          setToken(TokenKind.EQUALS, pos - 1, pos);
-          break;
-        case '%':
-          setToken(TokenKind.PERCENT, pos - 1, pos);
-          break;
-        case '~':
-          setToken(TokenKind.TILDE, pos - 1, pos);
-          break;
-        case '&':
-          setToken(TokenKind.AMPERSAND, pos - 1, pos);
-          break;
-        case '^':
-          setToken(TokenKind.CARET, pos - 1, pos);
-          break;
-        case '/':
-          if (lookaheadIs(0, '/') && lookaheadIs(1, '=')) {
-            setToken(TokenKind.SLASH_SLASH_EQUALS, pos - 1, pos + 2);
-            pos += 2;
-          } else if (lookaheadIs(0, '/')) {
-            setToken(TokenKind.SLASH_SLASH, pos - 1, pos + 1);
-            pos += 1;
-          } else {
-            // /= is handled by tokenizeTwoChars.
-            setToken(TokenKind.SLASH, pos - 1, pos);
-          }
-          break;
-        case ';':
-          setToken(TokenKind.SEMI, pos - 1, pos);
-          break;
-        case '.':
-          setToken(TokenKind.DOT, pos - 1, pos);
-          break;
-        case '*':
-          setToken(TokenKind.STAR, pos - 1, pos);
-          break;
-        case ' ':
-        case '\t':
-        case '\r':
-          /* ignore */
-          break;
-        case '\\':
-          // Backslash character is valid only at the end of a line (or in a string)
-          if (lookaheadIs(0, '\n')) {
-            pos += 1; // skip the end of line character
-          } else if (lookaheadIs(0, '\r') && lookaheadIs(1, '\n')) {
-            pos += 2; // skip the CRLF at the end of line
-          } else {
-            setToken(TokenKind.ILLEGAL, pos - 1, pos);
-            setValue(Character.toString(c));
-          }
-          break;
-        case '\n':
-          newline();
-          break;
-        case '#':
-          int oldPos = pos - 1;
-          while (pos < buffer.length) {
-            c = buffer[pos];
-            if (c == '\n') {
-              break;
-            } else {
-              pos++;
-            }
-          }
-          addComment(oldPos, pos);
-          break;
-        case '\'':
-        case '\"':
-          stringLiteral(c, false);
-          break;
-        default:
-          // detect raw strings, e.g. r"str"
-          if (c == 'r' && pos < buffer.length && (buffer[pos] == '\'' || buffer[pos] == '\"')) {
-            c = buffer[pos];
-            pos++;
-            stringLiteral(c, true);
-            break;
-          }
-
-          if (c >= '0' && c <= '9') {
-            integer();
-          } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_') {
-            identifierOrKeyword();
-          } else {
-            error("invalid character: '" + c + "'", pos - 1);
-          }
-          break;
-      } // switch
-      if (kind != null) { // stop here if we scanned a token
-        return;
-      }
-    } // while
-
-    if (indentStack.size() > 1) { // top of stack is always zero
-      setToken(TokenKind.NEWLINE, pos - 1, pos);
-      while (indentStack.size() > 1) {
-        indentStack.pop();
-        dents--;
-      }
-      return;
-    }
-
-    setToken(TokenKind.EOF, pos, pos);
-  }
-
-  /**
-   * Returns parts of the source buffer based on offsets
-   *
-   * @param start the beginning offset for the slice
-   * @param end the offset immediately following the slice
-   * @return the text at offset start with length end - start
-   */
-  String bufferSlice(int start, int end) {
-    return new String(this.buffer, start, end - start);
-  }
-
-  // TODO(adonovan): don't retain comments unconditionally.
-  private void addComment(int start, int end) {
-    String content = bufferSlice(start, end);
-    comments.add(new Comment(locs, start, content));
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/ListExpression.java
deleted file mode 100644
index 5293172..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListExpression.java
+++ /dev/null
@@ -1,111 +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 com.google.common.base.Preconditions;
-import java.util.List;
-
-/** Syntax node for list and tuple expressions. */
-public final class ListExpression extends Expression {
-
-  // TODO(adonovan): split class into {List,Tuple}Expression, as a tuple may have no parens.
-  // Materialize all source-level expressions as a separate ParenExpression so that we can roundtrip
-  // faithfully.
-
-  private final boolean isTuple;
-  private final int lbracketOffset; // -1 => unparenthesized non-empty tuple
-  private final List<Expression> elements;
-  private final int rbracketOffset; // -1 => unparenthesized non-empty tuple
-
-  ListExpression(
-      FileLocations locs,
-      boolean isTuple,
-      int lbracketOffset,
-      List<Expression> elements,
-      int rbracketOffset) {
-    super(locs);
-    // An unparenthesized tuple must be non-empty.
-    Preconditions.checkArgument(
-        !elements.isEmpty() || (lbracketOffset >= 0 && rbracketOffset >= 0));
-    this.lbracketOffset = lbracketOffset;
-    this.isTuple = isTuple;
-    this.elements = elements;
-    this.rbracketOffset = rbracketOffset;
-  }
-
-  public List<Expression> getElements() {
-    return elements;
-  }
-
-  /** Reports whether this is a tuple expression. */
-  public boolean isTuple() {
-    return isTuple;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return lbracketOffset < 0 ? elements.get(0).getStartOffset() : lbracketOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    // Unlike Python, trailing commas are not allowed in unparenthesized tuples.
-    return rbracketOffset < 0
-        ? elements.get(elements.size() - 1).getEndOffset()
-        : rbracketOffset + 1;
-  }
-
-  @Override
-  public String toString() {
-    // Print [a, b, c, ...] up to a maximum of 4 elements or 32 chars.
-    StringBuilder buf = new StringBuilder();
-    buf.append(isTuple() ? '(' : '[');
-    appendNodes(buf, elements);
-    if (isTuple() && elements.size() == 1) {
-      buf.append(',');
-    }
-    buf.append(isTuple() ? ')' : ']');
-    return buf.toString();
-  }
-
-  // Appends elements to buf, comma-separated, abbreviating if they are numerous or long.
-  // (Also used by CallExpression.)
-  static void appendNodes(StringBuilder buf, List<? extends Node> elements) {
-    int n = elements.size();
-    for (int i = 0; i < n; i++) {
-      if (i > 0) {
-        buf.append(", ");
-      }
-      int mark = buf.length();
-      buf.append(elements.get(i));
-      // Abbreviate, dropping this element, if we exceed 32 chars,
-      // or 4 elements (with more elements following).
-      if (buf.length() >= 32 || (i == 4 && i + 1 < n)) {
-        buf.setLength(mark);
-        buf.append(String.format("+%d more", n - i));
-        break;
-      }
-    }
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Expression.Kind kind() {
-    return Expression.Kind.LIST_EXPR;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
deleted file mode 100644
index 78e9c2e..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
+++ /dev/null
@@ -1,90 +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 com.google.common.collect.ImmutableList;
-
-/** Syntax node for an import statement. */
-public final class LoadStatement extends Statement {
-
-  /**
-   * Binding represents a binding in a load statement. load("...", local = "orig")
-   *
-   * <p>If there's no alias, a single Identifier can be used for both local and orig.
-   * TODO(adonovan): don't do that; be faithful to source.
-   */
-  public static final class Binding {
-    private final Identifier local;
-    private final Identifier orig;
-
-    public Identifier getLocalName() {
-      return local;
-    }
-
-    public Identifier getOriginalName() {
-      return orig;
-    }
-
-    Binding(Identifier localName, Identifier originalName) {
-      this.local = localName;
-      this.orig = originalName;
-    }
-  }
-
-  private final int loadOffset;
-  private final StringLiteral module;
-  private final ImmutableList<Binding> bindings;
-  private final int rparenOffset;
-
-  LoadStatement(
-      FileLocations locs,
-      int loadOffset,
-      StringLiteral module,
-      ImmutableList<Binding> bindings,
-      int rparenOffset) {
-    super(locs);
-    this.loadOffset = loadOffset;
-    this.module = module;
-    this.bindings = bindings;
-    this.rparenOffset = rparenOffset;
-  }
-
-  public ImmutableList<Binding> getBindings() {
-    return bindings;
-  }
-
-  public StringLiteral getImport() {
-    return module;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return loadOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rparenOffset + 1;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.LOAD;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Location.java b/src/main/java/com/google/devtools/build/lib/syntax/Location.java
deleted file mode 100644
index f152421..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Location.java
+++ /dev/null
@@ -1,116 +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 com.google.common.base.Preconditions;
-import java.io.Serializable;
-import javax.annotation.concurrent.Immutable;
-
-/**
- * A Location denotes a position within a Starlark file.
- *
- * <p>A location is a triple {@code (file, line, column)}, where {@code file} is the apparent name
- * of the file, {@code line} is the optional 1-based line number, and {@code column} is the optional
- * 1-based column number measured in UTF-16 code units. If the column is zero it is not displayed.
- * If the line number is also zero, it too is not displayed; in this case, the location denotes the
- * file as a whole.
- */
-@Immutable
-public final class Location implements Serializable, Comparable<Location> {
-
-  private final String file;
-  private final int line;
-  private final int column;
-
-  public Location(String file, int line, int column) {
-    this.file = Preconditions.checkNotNull(file);
-    this.line = line;
-    this.column = column;
-  }
-
-  /** Returns the name of the file containing this location. */
-  public String file() {
-    return file;
-  }
-
-  /** Returns the line number of this location. */
-  public int line() {
-    return line;
-  }
-
-  /** Returns the column number of this location. */
-  public int column() {
-    return column;
-  }
-
-  /**
-   * Returns a Location for the given file, line and column. If {@code column} is non-zero, {@code
-   * line} too must be non-zero.
-   */
-  public static Location fromFileLineColumn(String file, int line, int column) {
-    Preconditions.checkArgument(line != 0 || column == 0, "non-zero column but no line number");
-    return new Location(file, line, column);
-  }
-
-  /** Returns a Location for the file as a whole. */
-  public static Location fromFile(String file) {
-    return new Location(file, 0, 0);
-  }
-
-  /**
-   * Formats the location as {@code "file:line:col"}. If the column is zero, it is omitted. If the
-   * line is also zero, it too is omitted.
-   */
-  @Override
-  public String toString() {
-    StringBuilder buf = new StringBuilder();
-    buf.append(file);
-    if (line != 0) {
-      buf.append(':').append(line);
-      if (column != 0) {
-        buf.append(':').append(column);
-      }
-    }
-    return buf.toString();
-  }
-
-  /** Returns a three-valued lexicographical comparison of two Locations. */
-  @Override
-  public final int compareTo(Location that) {
-    int cmp = this.file().compareTo(that.file());
-    if (cmp != 0) {
-      return cmp;
-    }
-    return Long.compare(
-        ((long) this.line << 32) | this.column, ((long) that.line << 32) | that.column);
-  }
-
-  @Override
-  public int hashCode() {
-    return 97 * file.hashCode() + 37 * line + column;
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    return this == that
-        || (that instanceof Location
-            && this.file.equals(((Location) that).file)
-            && this.line == ((Location) that).line
-            && this.column == ((Location) that).column);
-  }
-
-  /** A location for built-in functions. */
-  public static final Location BUILTIN = fromFile("<builtin>");
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
deleted file mode 100644
index e564043..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
+++ /dev/null
@@ -1,253 +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.base.Preconditions;
-import com.google.common.base.Throwables;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.StarlarkMethod;
-
-/**
- * A value class to store Methods with their corresponding {@link StarlarkMethod} annotation
- * metadata. This is needed because the annotation is sometimes in a superclass.
- *
- * <p>The annotation metadata is duplicated in this class to avoid usage of Java dynamic proxies
- * which are ~7× slower.
- */
-final class MethodDescriptor {
-  private final Method method;
-  private final StarlarkMethod annotation;
-
-  private final String name;
-  private final String doc;
-  private final boolean documented;
-  private final boolean structField;
-  private final ParamDescriptor[] parameters;
-  private final boolean extraPositionals;
-  private final boolean extraKeywords;
-  private final boolean selfCall;
-  private final boolean allowReturnNones;
-  private final boolean useStarlarkThread;
-  private final boolean useStarlarkSemantics;
-
-  private MethodDescriptor(
-      Method method,
-      StarlarkMethod annotation,
-      String name,
-      String doc,
-      boolean documented,
-      boolean structField,
-      ParamDescriptor[] parameters,
-      boolean extraPositionals,
-      boolean extraKeywords,
-      boolean selfCall,
-      boolean allowReturnNones,
-      boolean useStarlarkThread,
-      boolean useStarlarkSemantics) {
-    this.method = method;
-    this.annotation = annotation;
-    this.name = name;
-    this.doc = doc;
-    this.documented = documented;
-    this.structField = structField;
-    this.parameters = parameters;
-    this.extraPositionals = extraPositionals;
-    this.extraKeywords = extraKeywords;
-    this.selfCall = selfCall;
-    this.allowReturnNones = allowReturnNones;
-    this.useStarlarkThread = useStarlarkThread;
-    this.useStarlarkSemantics = useStarlarkSemantics;
-  }
-
-  /** Returns the StarlarkMethod annotation corresponding to this method. */
-  StarlarkMethod getAnnotation() {
-    return annotation;
-  }
-
-  /** @return Starlark method descriptor for provided Java method and signature annotation. */
-  static MethodDescriptor of(
-      Method method, StarlarkMethod annotation, StarlarkSemantics semantics) {
-    // This happens when the interface is public but the implementation classes
-    // have reduced visibility.
-    method.setAccessible(true);
-    return new MethodDescriptor(
-        method,
-        annotation,
-        annotation.name(),
-        annotation.doc(),
-        annotation.documented(),
-        annotation.structField(),
-        Arrays.stream(annotation.parameters())
-            .map(param -> ParamDescriptor.of(param, semantics))
-            .toArray(ParamDescriptor[]::new),
-        !annotation.extraPositionals().name().isEmpty(),
-        !annotation.extraKeywords().name().isEmpty(),
-        annotation.selfCall(),
-        annotation.allowReturnNones(),
-        annotation.useStarlarkThread(),
-        annotation.useStarlarkSemantics());
-  }
-
-  private static final Object[] EMPTY = {};
-
-  /** Calls this method, which must have {@code structField=true}. */
-  Object callField(Object obj, StarlarkSemantics semantics, @Nullable Mutability mu)
-      throws EvalException, InterruptedException {
-    if (!structField) {
-      throw new IllegalStateException("not a struct field: " + name);
-    }
-    Object[] args = useStarlarkSemantics ? new Object[] {semantics} : EMPTY;
-    return call(obj, args, mu);
-  }
-
-  /**
-   * Invokes this method using {@code obj} as a target and {@code args} as Java arguments.
-   *
-   * <p>Methods with {@code void} return type return {@code None} following Python convention.
-   *
-   * <p>The Mutability is used if it is necessary to allocate a Starlark copy of a Java result.
-   */
-  Object call(Object obj, Object[] args, @Nullable Mutability mu)
-      throws EvalException, InterruptedException {
-    Preconditions.checkNotNull(obj);
-    Object result;
-    try {
-      result = method.invoke(obj, args);
-    } catch (IllegalAccessException ex) {
-      // "Can't happen": the annotated processor ensures that annotated methods are accessible.
-      throw new IllegalStateException(ex);
-
-    } catch (IllegalArgumentException ex) {
-      // "Can't happen": unexpected type mismatch.
-      // Show details to aid debugging (see e.g. b/162444744).
-      StringBuilder buf = new StringBuilder();
-      buf.append(
-          String.format(
-              "IllegalArgumentException (%s) in Starlark call of %s, obj=%s (%s), args=[",
-              ex.getMessage(), method, Starlark.repr(obj), Starlark.type(obj)));
-      String sep = "";
-      for (Object arg : args) {
-        buf.append(String.format("%s%s (%s)", sep, Starlark.repr(arg), Starlark.type(arg)));
-        sep = ", ";
-      }
-      buf.append(']');
-      throw new IllegalArgumentException(buf.toString());
-
-    } catch (InvocationTargetException ex) {
-      Throwable e = ex.getCause();
-      if (e == null) {
-        throw new IllegalStateException(e);
-      }
-      // Don't intercept unchecked exceptions.
-      Throwables.throwIfUnchecked(e);
-      if (e instanceof EvalException) {
-        throw (EvalException) e;
-      } else if (e instanceof InterruptedException) {
-        throw (InterruptedException) e;
-      } else {
-        // All other checked exceptions (e.g. LabelSyntaxException) are reported to Starlark.
-        throw new EvalException(e);
-      }
-    }
-    if (method.getReturnType().equals(Void.TYPE)) {
-      return Starlark.NONE;
-    }
-    if (result == null) {
-      // TODO(adonovan): eliminate allowReturnNones. Given that we convert
-      // String/Integer/Boolean/List/Map, it seems obtuse to crash instead
-      // of converting null too.
-      if (isAllowReturnNones()) {
-        return Starlark.NONE;
-      } else {
-        throw new IllegalStateException(
-            "method invocation returned null: " + getName() + Tuple.copyOf(Arrays.asList(args)));
-      }
-    }
-
-    return Starlark.fromJava(result, mu);
-  }
-
-  /** @see StarlarkMethod#name() */
-  String getName() {
-    return name;
-  }
-
-  Method getMethod() {
-    return method;
-  }
-
-  /** @see StarlarkMethod#structField() */
-  boolean isStructField() {
-    return structField;
-  }
-
-  /** @see StarlarkMethod#useStarlarkThread() */
-  boolean isUseStarlarkThread() {
-    return useStarlarkThread;
-  }
-
-  /** @see StarlarkMethod#useStarlarkSemantics() */
-  boolean isUseStarlarkSemantics() {
-    return useStarlarkSemantics;
-  }
-
-  /** @see StarlarkMethod#allowReturnNones() */
-  boolean isAllowReturnNones() {
-    return allowReturnNones;
-  }
-
-  /** @return {@code true} if this method accepts extra arguments ({@code *args}) */
-  boolean acceptsExtraArgs() {
-    return extraPositionals;
-  }
-
-  /** @see StarlarkMethod#extraKeywords() */
-  boolean acceptsExtraKwargs() {
-    return extraKeywords;
-  }
-
-  /** @see StarlarkMethod#parameters() */
-  ParamDescriptor[] getParameters() {
-    return parameters;
-  }
-
-  /** Returns the index of the named parameter or -1 if not found. */
-  int getParameterIndex(String name) {
-    for (int i = 0; i < parameters.length; i++) {
-      if (parameters[i].getName().equals(name)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /** @see StarlarkMethod#documented() */
-  boolean isDocumented() {
-    return documented;
-  }
-
-  /** @see StarlarkMethod#doc() */
-  String getDoc() {
-    return doc;
-  }
-
-  /** @see StarlarkMethod#selfCall() */
-  boolean isSelfCall() {
-    return selfCall;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
deleted file mode 100644
index 6357337..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ /dev/null
@@ -1,808 +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 com.google.common.base.Ascii;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-import net.starlark.java.annot.StarlarkGlobalLibrary;
-import net.starlark.java.annot.StarlarkMethod;
-
-/** The universal predeclared functions of core Starlark. */
-@StarlarkGlobalLibrary
-class MethodLibrary {
-
-  @StarlarkMethod(
-      name = "min",
-      doc =
-          "Returns the smallest one of all given arguments. "
-              + "If only one argument is provided, it must be a non-empty iterable. "
-              + "It is an error if elements are not comparable (for example int with string). "
-              + "<pre class=\"language-python\">min(2, 5, 4) == 2\n"
-              + "min([5, 6, 3]) == 3</pre>",
-      extraPositionals = @Param(name = "args", doc = "The elements to be checked."))
-  public Object min(Sequence<?> args) throws EvalException {
-    try {
-      return findExtreme(args, EvalUtils.STARLARK_COMPARATOR.reverse());
-    } catch (ComparisonException e) {
-      throw new EvalException(e);
-    }
-  }
-
-  @StarlarkMethod(
-      name = "max",
-      doc =
-          "Returns the largest one of all given arguments. "
-              + "If only one argument is provided, it must be a non-empty iterable."
-              + "It is an error if elements are not comparable (for example int with string). "
-              + "<pre class=\"language-python\">max(2, 5, 4) == 5\n"
-              + "max([5, 6, 3]) == 6</pre>",
-      extraPositionals = @Param(name = "args", doc = "The elements to be checked."))
-  public Object max(Sequence<?> args) throws EvalException {
-    try {
-      return findExtreme(args, EvalUtils.STARLARK_COMPARATOR);
-    } catch (ComparisonException e) {
-      throw new EvalException(e);
-    }
-  }
-
-  /** Returns the maximum element from this list, as determined by maxOrdering. */
-  private static Object findExtreme(Sequence<?> args, Ordering<Object> maxOrdering)
-      throws EvalException {
-    // Args can either be a list of items to compare, or a singleton list whose element is an
-    // iterable of items to compare. In either case, there must be at least one item to compare.
-    try {
-      Iterable<?> items = (args.size() == 1) ? Starlark.toIterable(args.get(0)) : args;
-      return maxOrdering.max(items);
-    } catch (NoSuchElementException ex) {
-      throw new EvalException("expected at least one item", ex);
-    }
-  }
-
-  @StarlarkMethod(
-      name = "all",
-      doc =
-          "Returns true if all elements evaluate to True or if the collection is empty. "
-              + "Elements are converted to boolean using the <a href=\"#bool\">bool</a> function."
-              + "<pre class=\"language-python\">all([\"hello\", 3, True]) == True\n"
-              + "all([-1, 0, 1]) == False</pre>",
-      parameters = {
-        @Param(
-            name = "elements",
-            type = Object.class,
-            noneable = true,
-            doc = "A string or a collection of elements.")
-      })
-  public Boolean all(Object collection) throws EvalException {
-    return !hasElementWithBooleanValue(collection, false);
-  }
-
-  @StarlarkMethod(
-      name = "any",
-      doc =
-          "Returns true if at least one element evaluates to True. "
-              + "Elements are converted to boolean using the <a href=\"#bool\">bool</a> function."
-              + "<pre class=\"language-python\">any([-1, 0, 1]) == True\n"
-              + "any([False, 0, \"\"]) == False</pre>",
-      parameters = {
-        @Param(
-            name = "elements",
-            type = Object.class,
-            noneable = true,
-            doc = "A string or a collection of elements.")
-      })
-  public Boolean any(Object collection) throws EvalException {
-    return hasElementWithBooleanValue(collection, true);
-  }
-
-  private static boolean hasElementWithBooleanValue(Object seq, boolean value)
-      throws EvalException {
-    for (Object x : Starlark.toIterable(seq)) {
-      if (Starlark.truth(x) == value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @StarlarkMethod(
-      name = "sorted",
-      doc =
-          "Sort a collection. Elements should all belong to the same orderable type, they are "
-              + "sorted by their value (in ascending order). "
-              + "It is an error if elements are not comparable (for example int with string)."
-              + "<pre class=\"language-python\">sorted([3, 5, 4]) == [3, 4, 5]</pre>",
-      parameters = {
-        @Param(name = "iterable", type = Object.class, doc = "The iterable sequence to sort."),
-        @Param(
-            name = "key",
-            doc = "An optional function applied to each element before comparison.",
-            named = true,
-            defaultValue = "None",
-            positional = false,
-            noneable = true),
-        @Param(
-            name = "reverse",
-            type = Boolean.class,
-            doc = "Return results in descending order.",
-            named = true,
-            defaultValue = "False",
-            positional = false)
-      },
-      useStarlarkThread = true)
-  public StarlarkList<?> sorted(
-      Object iterable, final Object key, Boolean reverse, final StarlarkThread thread)
-      throws EvalException, InterruptedException {
-    Object[] array = Starlark.toArray(iterable);
-    if (key == Starlark.NONE) {
-      try {
-        Arrays.sort(array, EvalUtils.STARLARK_COMPARATOR);
-      } catch (EvalUtils.ComparisonException e) {
-        throw Starlark.errorf("%s", e.getMessage());
-      }
-    } else if (key instanceof StarlarkCallable) {
-      final StarlarkCallable keyfn = (StarlarkCallable) key;
-
-      class KeyComparator implements Comparator<Object> {
-        Exception e;
-
-        @Override
-        public int compare(Object x, Object y) {
-          try {
-            return EvalUtils.STARLARK_COMPARATOR.compare(callKeyFunc(x), callKeyFunc(y));
-          } catch (InterruptedException | EvalException e) {
-            if (this.e == null) {
-              this.e = e;
-            }
-            return 0;
-          }
-        }
-
-        Object callKeyFunc(Object x) throws EvalException, InterruptedException {
-          return Starlark.call(thread, keyfn, Collections.singletonList(x), ImmutableMap.of());
-        }
-      }
-
-      KeyComparator comp = new KeyComparator();
-      try {
-        Arrays.sort(array, comp);
-      } catch (EvalUtils.ComparisonException e) {
-        throw Starlark.errorf("%s", e.getMessage());
-      }
-
-      if (comp.e != null) {
-        if (comp.e instanceof InterruptedException) {
-          throw (InterruptedException) comp.e;
-        }
-        throw (EvalException) comp.e;
-      }
-    } else {
-      throw Starlark.errorf("%s object is not callable", Starlark.repr(Starlark.type(key)));
-    }
-
-    if (reverse) {
-      reverse(array);
-    }
-    return StarlarkList.wrap(thread.mutability(), array);
-  }
-
-  private static void reverse(Object[] array) {
-    for (int i = 0, j = array.length - 1; i < j; i++, j--) {
-      Object tmp = array[i];
-      array[i] = array[j];
-      array[j] = tmp;
-    }
-  }
-
-  @StarlarkMethod(
-      name = "reversed",
-      doc =
-          "Returns a list that contains the elements of the original sequence in reversed order."
-              + "<pre class=\"language-python\">reversed([3, 5, 4]) == [4, 5, 3]</pre>",
-      parameters = {
-        @Param(
-            name = "sequence",
-            type = Sequence.class,
-            doc = "The sequence (list or tuple) to be reversed."),
-      },
-      useStarlarkThread = true)
-  public StarlarkList<?> reversed(Sequence<?> sequence, StarlarkThread thread)
-      throws EvalException {
-    Object[] array = Starlark.toArray(sequence);
-    reverse(array);
-    return StarlarkList.wrap(thread.mutability(), array);
-  }
-
-  @StarlarkMethod(
-      name = "tuple",
-      doc =
-          "Returns a tuple with the same elements as the given iterable value."
-              + "<pre class=\"language-python\">tuple([1, 2]) == (1, 2)\n"
-              + "tuple((2, 3, 2)) == (2, 3, 2)\n"
-              + "tuple({5: \"a\", 2: \"b\", 4: \"c\"}) == (5, 2, 4)</pre>",
-      parameters = {@Param(name = "x", defaultValue = "()", doc = "The object to convert.")})
-  public Tuple<?> tuple(Object x) throws EvalException {
-    if (x instanceof Tuple) {
-      return (Tuple<?>) x;
-    }
-    return Tuple.wrap(Starlark.toArray(x));
-  }
-
-  @StarlarkMethod(
-      name = "list",
-      doc =
-          "Returns a new list with the same elements as the given iterable value."
-              + "<pre class=\"language-python\">list([1, 2]) == [1, 2]\n"
-              + "list((2, 3, 2)) == [2, 3, 2]\n"
-              + "list({5: \"a\", 2: \"b\", 4: \"c\"}) == [5, 2, 4]</pre>",
-      parameters = {@Param(name = "x", defaultValue = "[]", doc = "The object to convert.")},
-      useStarlarkThread = true)
-  public StarlarkList<?> list(Object x, StarlarkThread thread) throws EvalException {
-    return StarlarkList.wrap(thread.mutability(), Starlark.toArray(x));
-  }
-
-  @StarlarkMethod(
-      name = "len",
-      doc =
-          "Returns the length of a string, sequence (such as a list or tuple), dict, or other"
-              + " iterable.",
-      parameters = {@Param(name = "x", doc = "The value whose length to report.")},
-      useStarlarkThread = true)
-  public Integer len(Object x, StarlarkThread thread) throws EvalException {
-    int len = Starlark.len(x);
-    if (len < 0) {
-      throw Starlark.errorf("%s is not iterable", Starlark.type(x));
-    }
-    return len;
-  }
-
-  @StarlarkMethod(
-      name = "str",
-      doc =
-          "Converts any object to string. This is useful for debugging."
-              + "<pre class=\"language-python\">str(\"ab\") == \"ab\"\n"
-              + "str(8) == \"8\"</pre>",
-      parameters = {@Param(name = "x", doc = "The object to convert.", noneable = true)})
-  public String str(Object x) throws EvalException {
-    return Starlark.str(x);
-  }
-
-  @StarlarkMethod(
-      name = "repr",
-      doc =
-          "Converts any object to a string representation. This is useful for debugging.<br>"
-              + "<pre class=\"language-python\">repr(\"ab\") == '\"ab\"'</pre>",
-      parameters = {@Param(name = "x", doc = "The object to convert.", noneable = true)})
-  public String repr(Object x) {
-    return Starlark.repr(x);
-  }
-
-  @StarlarkMethod(
-      name = "bool",
-      doc =
-          "Constructor for the bool type. "
-              + "It returns <code>False</code> if the object is <code>None</code>, <code>False"
-              + "</code>, an empty string (<code>\"\"</code>), the number <code>0</code>, or an "
-              + "empty collection (e.g. <code>()</code>, <code>[]</code>). "
-              + "Otherwise, it returns <code>True</code>.",
-      parameters = {
-        @Param(
-            name = "x",
-            defaultValue = "False",
-            doc = "The variable to convert.",
-            noneable = true)
-      })
-  public Boolean bool(Object x) throws EvalException {
-    return Starlark.truth(x);
-  }
-
-  private final ImmutableMap<String, Integer> intPrefixes =
-      ImmutableMap.of("0b", 2, "0o", 8, "0x", 16);
-
-  @StarlarkMethod(
-      name = "int",
-      doc =
-          "Returns x as an int value."
-              + "<ul>"
-              + "<li>If <code>x</code> is already an int, it is returned as-is."
-              + "<li>If <code>x</code> is a boolean, a true value returns 1 and a false value "
-              + "    returns 0."
-              + "<li>If <code>x</code> is a string, it must have the format "
-              + "    <code>&lt;sign&gt;&lt;prefix&gt;&lt;digits&gt;</code>. "
-              + "    <code>&lt;sign&gt;</code> is either <code>\"+\"</code>, <code>\"-\"</code>, "
-              + "    or empty (interpreted as positive). <code>&lt;digits&gt;</code> are a "
-              + "    sequence of digits from 0 up to <code>base</code> - 1, where the letters a-z "
-              + "    (or equivalently, A-Z) are used as digits for 10-35. In the case where "
-              + "    <code>base</code> is 2/8/16, <code>&lt;prefix&gt;</code> is optional and may "
-              + "    be 0b/0o/0x (or equivalently, 0B/0O/0X) respectively; if the "
-              + "    <code>base</code> is any other value besides these bases or the special value "
-              + "    0, the prefix must be empty. In the case where <code>base</code> is 0, the "
-              + "    string is interpreted as an integer literal, in the sense that one of the "
-              + "    bases 2/8/10/16 is chosen depending on which prefix if any is used. If "
-              + "    <code>base</code> is 0, no prefix is used, and there is more than one digit, "
-              + "    the leading digit cannot be 0; this is to avoid confusion between octal and "
-              + "    decimal. The magnitude of the number represented by the string must be within "
-              + "    the allowed range for the int type."
-              + "</ul>"
-              + "This function fails if <code>x</code> is any other type, or if the value is a "
-              + "string not satisfying the above format. Unlike Python's <code>int()</code> "
-              + "function, this function does not allow zero arguments, and does not allow "
-              + "extraneous whitespace for string arguments."
-              + "<p>Examples:"
-              + "<pre class=\"language-python\">"
-              + "int(\"123\") == 123\n"
-              + "int(\"-123\") == -123\n"
-              + "int(\"+123\") == 123\n"
-              + "int(\"FF\", 16) == 255\n"
-              + "int(\"0xFF\", 16) == 255\n"
-              + "int(\"10\", 0) == 10\n"
-              + "int(\"-0x10\", 0) == -16"
-              + "</pre>",
-      parameters = {
-        @Param(name = "x", type = Object.class, doc = "The string to convert."),
-        @Param(
-            name = "base",
-            type = Object.class,
-            defaultValue = "unbound",
-            doc =
-                "The base used to interpret a string value; defaults to 10. Must be between 2 "
-                    + "and 36 (inclusive), or 0 to detect the base as if <code>x</code> were an "
-                    + "integer literal. This parameter must not be supplied if the value is not a "
-                    + "string.",
-            named = true)
-      })
-  public Integer convertToInt(Object x, Object base) throws EvalException {
-    if (x instanceof String) {
-      if (base == Starlark.UNBOUND) {
-        base = 10;
-      } else if (!(base instanceof Integer)) {
-        throw Starlark.errorf("base must be an integer (got '%s')", Starlark.type(base));
-      }
-      return fromString((String) x, (Integer) base);
-    } else {
-      if (base != Starlark.UNBOUND) {
-        throw Starlark.errorf("int() can't convert non-string with explicit base");
-      }
-      if (x instanceof Boolean) {
-        return ((Boolean) x).booleanValue() ? 1 : 0;
-      } else if (x instanceof Integer) {
-        return (Integer) x;
-      }
-      throw Starlark.errorf("%s is not of type string or int or bool", Starlark.repr(x));
-    }
-  }
-
-  private int fromString(String string, int base) throws EvalException {
-    String stringForErrors = string;
-
-    boolean isNegative = false;
-    if (string.isEmpty()) {
-      throw Starlark.errorf("string argument to int() cannot be empty");
-    }
-    char c = string.charAt(0);
-    if (c == '+') {
-      string = string.substring(1);
-    } else if (c == '-') {
-      string = string.substring(1);
-      isNegative = true;
-    }
-
-    String prefix = getIntegerPrefix(string);
-    String digits;
-    if (prefix == null) {
-      // Nothing to strip. Infer base 10 if autodetection was requested (base == 0).
-      digits = string;
-      if (base == 0) {
-        if (string.length() > 1 && string.startsWith("0")) {
-          // We don't infer the base when input starts with '0' (due
-          // to confusion between octal and decimal).
-          throw Starlark.errorf(
-              "cannot infer base for int() when value begins with a 0: %s",
-              Starlark.repr(stringForErrors));
-        }
-        base = 10;
-      }
-    } else {
-      // Strip prefix. Infer base from prefix if unknown (base == 0), or else verify its
-      // consistency.
-      digits = string.substring(prefix.length());
-      int expectedBase = intPrefixes.get(prefix);
-      if (base == 0) {
-        base = expectedBase;
-      } else if (base != expectedBase) {
-        throw Starlark.errorf(
-            "invalid literal for int() with base %d: %s", base, Starlark.repr(stringForErrors));
-      }
-    }
-
-    if (base < 2 || base > 36) {
-      throw Starlark.errorf("int() base must be >= 2 and <= 36");
-    }
-    try {
-      // Negate by prepending a negative symbol, rather than by using arithmetic on the
-      // result, to handle the edge case of -2^31 correctly.
-      String parseable = isNegative ? "-" + digits : digits;
-      return Integer.parseInt(parseable, base);
-    } catch (NumberFormatException | ArithmeticException e) {
-      throw Starlark.errorf(
-          "invalid literal for int() with base %d: %s", base, Starlark.repr(stringForErrors));
-    }
-  }
-
-  @Nullable
-  private String getIntegerPrefix(String value) {
-    value = Ascii.toLowerCase(value);
-    for (String prefix : intPrefixes.keySet()) {
-      if (value.startsWith(prefix)) {
-        return prefix;
-      }
-    }
-    return null;
-  }
-
-  @StarlarkMethod(
-      name = "dict",
-      doc =
-          "Creates a <a href=\"dict.html\">dictionary</a> from an optional positional "
-              + "argument and an optional set of keyword arguments. In the case where the same key "
-              + "is given multiple times, the last value will be used. Entries supplied via "
-              + "keyword arguments are considered to come after entries supplied via the "
-              + "positional argument.",
-      parameters = {
-        @Param(
-            name = "args",
-            type = Object.class,
-            defaultValue = "[]",
-            doc =
-                "Either a dictionary or a list of entries. Entries must be tuples or lists with "
-                    + "exactly two elements: key, value."),
-      },
-      extraKeywords = @Param(name = "kwargs", doc = "Dictionary of additional entries."),
-      useStarlarkThread = true)
-  public Dict<?, ?> dict(Object args, Dict<String, Object> kwargs, StarlarkThread thread)
-      throws EvalException {
-    Dict<?, ?> dict =
-        args instanceof Dict
-            ? (Dict) args
-            : Dict.getDictFromArgs("dict", args, thread.mutability());
-    return Dict.plus(dict, kwargs, thread.mutability());
-  }
-
-  @StarlarkMethod(
-      name = "enumerate",
-      doc =
-          "Returns a list of pairs (two-element tuples), with the index (int) and the item from"
-              + " the input sequence.\n<pre class=\"language-python\">"
-              + "enumerate([24, 21, 84]) == [(0, 24), (1, 21), (2, 84)]</pre>\n",
-      parameters = {
-        // Note Python uses 'sequence' keyword instead of 'list'. We may want to change tihs
-        // some day.
-        @Param(name = "list", type = Object.class, doc = "input sequence.", named = true),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            doc = "start index.",
-            defaultValue = "0",
-            named = true)
-      },
-      useStarlarkThread = true)
-  public StarlarkList<?> enumerate(Object input, Integer start, StarlarkThread thread)
-      throws EvalException {
-    Object[] array = Starlark.toArray(input);
-    for (int i = 0; i < array.length; i++) {
-      array[i] = Tuple.pair(i + start, array[i]); // update in place
-    }
-    return StarlarkList.wrap(thread.mutability(), array);
-  }
-
-  @StarlarkMethod(
-      name = "hash",
-      doc =
-          "Return a hash value for a string. This is computed deterministically using the same "
-              + "algorithm as Java's <code>String.hashCode()</code>, namely: "
-              + "<pre class=\"language-python\">s[0] * (31^(n-1)) + s[1] * (31^(n-2)) + ... + "
-              + "s[n-1]</pre> Hashing of values besides strings is not currently supported.",
-      // Deterministic hashing is important for the consistency of builds, hence why we
-      // promise a specific algorithm. This is in contrast to Java (Object.hashCode()) and
-      // Python, which promise stable hashing only within a given execution of the program.
-      parameters = {@Param(name = "value", type = String.class, doc = "String value to hash.")})
-  public Integer hash(String value) throws EvalException {
-    return value.hashCode();
-  }
-
-  @StarlarkMethod(
-      name = "range",
-      doc =
-          "Creates a list where items go from <code>start</code> to <code>stop</code>, using a "
-              + "<code>step</code> increment. If a single argument is provided, items will "
-              + "range from 0 to that element."
-              + "<pre class=\"language-python\">range(4) == [0, 1, 2, 3]\n"
-              + "range(3, 9, 2) == [3, 5, 7]\n"
-              + "range(3, 0, -1) == [3, 2, 1]</pre>",
-      parameters = {
-        @Param(
-            name = "start_or_stop",
-            type = Integer.class,
-            doc =
-                "Value of the start element if stop is provided, "
-                    + "otherwise value of stop and the actual start is 0"),
-        @Param(
-            name = "stop_or_none",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc =
-                "optional index of the first item <i>not</i> to be included in the resulting "
-                    + "list; generation of the list stops before <code>stop</code> is reached."),
-        @Param(
-            name = "step",
-            type = Integer.class,
-            defaultValue = "1",
-            doc = "The increment (default is 1). It may be negative.")
-      },
-      useStarlarkThread = true)
-  public Sequence<Integer> range(
-      Integer startOrStop, Object stopOrNone, Integer step, StarlarkThread thread)
-      throws EvalException {
-    int start;
-    int stop;
-    if (stopOrNone == Starlark.NONE) {
-      start = 0;
-      stop = startOrStop;
-    } else if (stopOrNone instanceof Integer) {
-      start = startOrStop;
-      stop = (Integer) stopOrNone;
-    } else {
-      throw Starlark.errorf("want int, got %s", Starlark.type(stopOrNone));
-    }
-    if (step == 0) {
-      throw Starlark.errorf("step cannot be 0");
-    }
-    return new RangeList(start, stop, step);
-  }
-
-  /** Returns true if the object has a field of the given name, otherwise false. */
-  @StarlarkMethod(
-      name = "hasattr",
-      doc =
-          "Returns True if the object <code>x</code> has an attribute or method of the given "
-              + "<code>name</code>, otherwise False. Example:<br>"
-              + "<pre class=\"language-python\">hasattr(ctx.attr, \"myattr\")</pre>",
-      parameters = {
-        @Param(name = "x", doc = "The object to check.", noneable = true),
-        @Param(name = "name", type = String.class, doc = "The name of the attribute.")
-      },
-      useStarlarkThread = true)
-  public Boolean hasattr(Object obj, String name, StarlarkThread thread) throws EvalException {
-    return Starlark.hasattr(thread.getSemantics(), obj, name);
-  }
-
-  @StarlarkMethod(
-      name = "getattr",
-      doc =
-          "Returns the struct's field of the given name if it exists. If not, it either returns "
-              + "<code>default</code> (if specified) or raises an error. "
-              + "<code>getattr(x, \"foobar\")</code> is equivalent to <code>x.foobar</code>."
-              + "<pre class=\"language-python\">getattr(ctx.attr, \"myattr\")\n"
-              + "getattr(ctx.attr, \"myattr\", \"mydefault\")</pre>",
-      parameters = {
-        @Param(name = "x", doc = "The struct whose attribute is accessed.", noneable = true),
-        @Param(name = "name", doc = "The name of the struct attribute."),
-        @Param(
-            name = "default",
-            defaultValue = "unbound",
-            doc =
-                "The default value to return in case the struct "
-                    + "doesn't have an attribute of the given name.",
-            noneable = true)
-      },
-      useStarlarkThread = true)
-  public Object getattr(Object obj, String name, Object defaultValue, StarlarkThread thread)
-      throws EvalException, InterruptedException {
-    return Starlark.getattr(
-        thread.mutability(),
-        thread.getSemantics(),
-        obj,
-        name,
-        defaultValue == Starlark.UNBOUND ? null : defaultValue);
-  }
-
-  @StarlarkMethod(
-      name = "dir",
-      doc =
-          "Returns a list of strings: the names of the attributes and "
-              + "methods of the parameter object.",
-      parameters = {@Param(name = "x", doc = "The object to check.", noneable = true)},
-      useStarlarkThread = true)
-  public StarlarkList<?> dir(Object object, StarlarkThread thread) throws EvalException {
-    return Starlark.dir(thread.mutability(), thread.getSemantics(), object);
-  }
-
-  @StarlarkMethod(
-      name = "fail",
-      doc =
-          "Raises an error that cannot be intercepted. It can be used anywhere, "
-              + "both in the loading phase and in the analysis phase.",
-      parameters = {
-        @Param(
-            name = "msg",
-            type = Object.class,
-            doc = "Error to display for the user. The object is converted to a string.",
-            defaultValue = "None",
-            named = true,
-            noneable = true),
-        @Param(
-            name = "attr",
-            type = String.class,
-            noneable = true,
-            defaultValue = "None",
-            doc =
-                "The name of the attribute that caused the error. This is used only for "
-                    + "error reporting.",
-            named = true)
-      })
-  public NoneType fail(Object msg, Object attr) throws EvalException {
-    String str = Starlark.str(msg);
-    if (attr != Starlark.NONE) {
-      str = Starlark.format("attribute %s: %s", attr, str);
-    }
-    throw Starlark.errorf("%s", str);
-  }
-
-  @StarlarkMethod(
-      name = "print",
-      doc =
-          "Prints <code>args</code> as debug output. It will be prefixed with the string <code>"
-              + "\"DEBUG\"</code> and the location (file and line number) of this call. The "
-              + "exact way in which the arguments are converted to strings is unspecified and may "
-              + "change at any time. In particular, it may be different from (and more detailed "
-              + "than) the formatting done by <a href='#str'><code>str()</code></a> and <a "
-              + "href='#repr'><code>repr()</code></a>."
-              + "<p>Using <code>print</code> in production code is discouraged due to the spam it "
-              + "creates for users. For deprecations, prefer a hard error using <a href=\"#fail\">"
-              + "<code>fail()</code></a> whenever possible.",
-      parameters = {
-        @Param(
-            name = "sep",
-            type = String.class,
-            defaultValue = "\" \"",
-            named = true,
-            positional = false,
-            doc = "The separator string between the objects, default is space (\" \").")
-      },
-      // NB: as compared to Python3, we're missing optional named-only arguments 'end' and 'file'
-      extraPositionals = @Param(name = "args", doc = "The objects to print."),
-      useStarlarkThread = true)
-  public NoneType print(String sep, Sequence<?> args, StarlarkThread thread) throws EvalException {
-    Printer p = new Printer();
-    String separator = "";
-    for (Object x : args) {
-      p.append(separator);
-      p.debugPrint(x);
-      separator = sep;
-    }
-    // The PRINT_TEST_MARKER key is used in tests to verify the effects of command-line options.
-    // See starlark_flag_test.sh, which runs bazel with --internal_starlark_flag_test_canary.
-    if (thread.getSemantics().getBool(StarlarkSemantics.PRINT_TEST_MARKER)) {
-      p.append("<== Starlark flag test ==>");
-    }
-
-    thread.getPrintHandler().print(thread, p.toString());
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(
-      name = "type",
-      doc =
-          "Returns the type name of its argument. This is useful for debugging and "
-              + "type-checking. Examples:"
-              + "<pre class=\"language-python\">"
-              + "type(2) == \"int\"\n"
-              + "type([1]) == \"list\"\n"
-              + "type(struct(a = 2)) == \"struct\""
-              + "</pre>"
-              + "This function might change in the future. To write Python-compatible code and "
-              + "be future-proof, use it only to compare return values: "
-              + "<pre class=\"language-python\">"
-              + "if type(x) == type([]):  # if x is a list"
-              + "</pre>",
-      parameters = {@Param(name = "x", doc = "The object to check type of.", noneable = true)})
-  public String type(Object object) {
-    // There is no 'type' type in Starlark, so we return a string with the type name.
-    return Starlark.type(object);
-  }
-
-  @StarlarkMethod(
-      name = "zip",
-      doc =
-          "Returns a <code>list</code> of <code>tuple</code>s, where the i-th tuple contains "
-              + "the i-th element from each of the argument sequences or iterables. The list has "
-              + "the size of the shortest input. With a single iterable argument, it returns a "
-              + "list of 1-tuples. With no arguments, it returns an empty list. Examples:"
-              + "<pre class=\"language-python\">"
-              + "zip()  # == []\n"
-              + "zip([1, 2])  # == [(1,), (2,)]\n"
-              + "zip([1, 2], [3, 4])  # == [(1, 3), (2, 4)]\n"
-              + "zip([1, 2], [3, 4, 5])  # == [(1, 3), (2, 4)]</pre>",
-      extraPositionals = @Param(name = "args", doc = "lists to zip."),
-      useStarlarkThread = true)
-  public StarlarkList<?> zip(Sequence<?> args, StarlarkThread thread) throws EvalException {
-    Iterator<?>[] iterators = new Iterator<?>[args.size()];
-    for (int i = 0; i < args.size(); i++) {
-      iterators[i] = Starlark.toIterable(args.get(i)).iterator();
-    }
-    ArrayList<Tuple<?>> result = new ArrayList<>();
-    boolean allHasNext;
-    do {
-      allHasNext = !args.isEmpty();
-      List<Object> elem = Lists.newArrayListWithExpectedSize(args.size());
-      for (Iterator<?> iterator : iterators) {
-        if (iterator.hasNext()) {
-          elem.add(iterator.next());
-        } else {
-          allHasNext = false;
-        }
-      }
-      if (allHasNext) {
-        result.add(Tuple.copyOf(elem));
-      }
-    } while (allHasNext);
-    return StarlarkList.copyOf(thread.mutability(), result);
-  }
-
-  /** Starlark int type. */
-  @StarlarkBuiltin(
-      name = "int",
-      category = StarlarkDocumentationCategory.BUILTIN,
-      doc =
-          "A type to represent integers. It can represent any number between -2147483648 and "
-              + "2147483647 (included). "
-              + "Examples of int values:<br>"
-              + "<pre class=\"language-python\">"
-              + "153\n"
-              + "0x2A  # hexadecimal literal\n"
-              + "0o54  # octal literal\n"
-              + "23 * 2 + 5\n"
-              + "100 / -7\n"
-              + "100 % -7  # -5 (unlike in some other languages)\n"
-              + "int(\"18\")\n"
-              + "</pre>")
-  static final class IntModule implements StarlarkValue {} // (documentation only)
-
-  /** Starlark bool type. */
-  @StarlarkBuiltin(
-      name = "bool",
-      category = StarlarkDocumentationCategory.BUILTIN,
-      doc =
-          "A type to represent booleans. There are only two possible values: "
-              + "<a href=\"globals.html#True\">True</a> and "
-              + "<a href=\"globals.html#False\">False</a>. "
-              + "Any value can be converted to a boolean using the "
-              + "<a href=\"globals.html#bool\">bool</a> function.")
-  static final class BoolModule implements StarlarkValue {} // (documentation only)
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Module.java b/src/main/java/com/google/devtools/build/lib/syntax/Module.java
deleted file mode 100644
index 1aec2f7..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Module.java
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2019 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.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nullable;
-
-/**
- * A {@link Module} represents a Starlark module, a container of global variables populated by
- * executing a Starlark file. Each top-level assignment updates a global variable in the module.
- *
- * <p>Each module references its "predeclared" environment, which is often shared among many
- * modules. These are the names that are defined even at the start of execution. For example, in
- * Bazel, the predeclared environment of the module for a BUILD or .bzl file defines name values
- * such as cc_binary and glob.
- *
- * <p>The predeclared environment implicitly includes the "universal" names present in every
- * Starlark thread in every dialect, such as None, len, and str; see {@link Starlark#UNIVERSE}.
- *
- * <p>Global bindings in a Module may shadow bindings inherited from the predeclared block.
- *
- * <p>A module may carry an arbitrary piece of client data. In Bazel, for example, the client data
- * records the module's build label (such as "//dir:file.bzl").
- *
- * <p>Use {@link #create} to create a {@link Module} with no predeclared bindings other than the
- * universal ones. Use {@link #withPredeclared(StarlarkSemantics, Map)} to create a module with the
- * predeclared environment specified by the map, using the semantics to determine whether any
- * FlagGuardedValues in the map are enabled or disabled.
- */
-public final class Module implements Resolver.Module {
-
-  // The module's predeclared environment. Excludes UNIVERSE bindings.
-  private ImmutableMap<String, Object> predeclared;
-
-  // The module's global bindings, in order of creation.
-  private final LinkedHashMap<String, Object> globals = new LinkedHashMap<>();
-
-  // Names of globals that are exported and can be loaded from other modules.
-  // TODO(adonovan): eliminate this field when the resolver does its job properly.
-  final HashSet<String> exportedGlobals = new HashSet<>();
-
-  // An optional piece of metadata associated with the module/file.
-  // May be set after construction (too obscure to burden the constructors).
-  // Its toString appears to Starlark in str(function): "<function f from ...>".
-  @Nullable private Object clientData;
-
-  private Module(ImmutableMap<String, Object> predeclared) {
-    this.predeclared = predeclared;
-  }
-
-  /**
-   * Constructs a Module with the specified predeclared bindings, filtered by the semantics, in
-   * addition to the standard environment, {@link Starlark#UNIVERSE}.
-   */
-  public static Module withPredeclared(
-      StarlarkSemantics semantics, Map<String, Object> predeclared) {
-    return new Module(filter(predeclared, semantics));
-  }
-
-  /**
-   * Creates a module with no predeclared bindings other than the standard environment, {@link
-   * Starlark#UNIVERSE}.
-   */
-  public static Module create() {
-    return new Module(/*predeclared=*/ ImmutableMap.of());
-  }
-
-  /**
-   * Returns the module (file) of the innermost enclosing Starlark function on the call stack, or
-   * null if none of the active calls are functions defined in Starlark.
-   *
-   * <p>The name of this function is intentionally horrible to make you feel bad for using it.
-   */
-  @Nullable
-  public static Module ofInnermostEnclosingStarlarkFunction(StarlarkThread thread) {
-    for (Debug.Frame fr : thread.getDebugCallStack().reverse()) {
-      if (fr.getFunction() instanceof StarlarkFunction) {
-        return ((StarlarkFunction) fr.getFunction()).getModule();
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns a map in which each semantics-enabled FlagGuardedValue has been replaced by the value
-   * it guards. Disabled FlagGuardedValues are left in place, and should be treated as unavailable.
-   * The iteration order is unchanged.
-   */
-  private static ImmutableMap<String, Object> filter(
-      Map<String, Object> predeclared, StarlarkSemantics semantics) {
-    ImmutableMap.Builder<String, Object> filtered = ImmutableMap.builder();
-    for (Map.Entry<String, Object> bind : predeclared.entrySet()) {
-      Object v = bind.getValue();
-      if (v instanceof FlagGuardedValue) {
-        FlagGuardedValue fv = (FlagGuardedValue) bind.getValue();
-        if (fv.isObjectAccessibleUsingSemantics(semantics)) {
-          v = fv.getObject();
-        }
-      }
-      filtered.put(bind.getKey(), v);
-    }
-    return filtered.build();
-  }
-
-  /**
-   * Sets the client data (an arbitrary application-specific value) associated with the module. It
-   * may be retrieved using {@link #getClientData}. Its {@code toString} form appears in the result
-   * of {@code str(fn)} where {@code fn} is a StarlarkFunction: "<function f from ...>".
-   */
-  public void setClientData(@Nullable Object clientData) {
-    this.clientData = clientData;
-  }
-
-  /**
-   * Returns the client data associated with this module by a prior call to {@link #setClientData}.
-   */
-  @Nullable
-  public Object getClientData() {
-    return clientData;
-  }
-
-  /** Returns the value of a predeclared (or universal) binding in this module. */
-  Object getPredeclared(String name) {
-    Object v = predeclared.get(name);
-    if (v != null) {
-      return v;
-    }
-    return Starlark.UNIVERSE.get(name);
-  }
-
-  /**
-   * Returns this module's additional predeclared bindings. (Excludes {@link Starlark#UNIVERSE}.)
-   *
-   * <p>The map reflects any semantics-based filtering of FlagGuardedValues done by {@link
-   * #withPredeclared}: enabled FlagGuardedValues are replaced by their underlying value.
-   */
-  public ImmutableMap<String, Object> getPredeclaredBindings() {
-    return predeclared;
-  }
-
-  /**
-   * Returns a read-only view of this module's global bindings.
-   *
-   * <p>The bindings are returned in a deterministic order (for a given sequence of initial values
-   * and updates).
-   */
-  public Map<String, Object> getGlobals() {
-    return Collections.unmodifiableMap(globals);
-  }
-
-  /**
-   * Returns a map of bindings that are exported (i.e. symbols declared using `=` and `def`, but not
-   * `load`).
-   */
-  // TODO(adonovan): whether bindings are exported should be decided by the resolver;
-  //  non-exported bindings should never be added to the module.  Delete this.
-  public ImmutableMap<String, Object> getExportedGlobals() {
-    ImmutableMap.Builder<String, Object> result = new ImmutableMap.Builder<>();
-    for (Map.Entry<String, Object> entry : globals.entrySet()) {
-      if (exportedGlobals.contains(entry.getKey())) {
-        result.put(entry);
-      }
-    }
-    return result.build();
-  }
-
-  /** Implements the resolver's module interface. */
-  @Override
-  public Set<String> getNames() {
-    // TODO(adonovan): for now, the resolver treats all predeclared/universe
-    //  and global names as one bucket (Scope.PREDECLARED). Fix that.
-    // TODO(adonovan): opt: change the resolver to request names on
-    //  demand to avoid all this set copying.
-    HashSet<String> names = new HashSet<>();
-    for (Map.Entry<String, Object> bind : getTransitiveBindings().entrySet()) {
-      if (bind.getValue() instanceof FlagGuardedValue) {
-        continue; // disabled
-      }
-      names.add(bind.getKey());
-    }
-    return names;
-  }
-
-  @Override
-  @Nullable
-  public String getUndeclaredNameError(String name) {
-    Object v = getPredeclared(name);
-    return v instanceof FlagGuardedValue
-        ? ((FlagGuardedValue) v).getErrorFromAttemptingAccess(name)
-        : null;
-  }
-
-  /**
-   * Returns a new map containing the predeclared (including universal) and global bindings of this
-   * module.
-   */
-  // TODO(adonovan): eliminate; clients should explicitly choose getPredeclared or getGlobals.
-  public Map<String, Object> getTransitiveBindings() {
-    // Can't use ImmutableMap.Builder because it doesn't allow duplicates.
-    LinkedHashMap<String, Object> env = new LinkedHashMap<>();
-    env.putAll(Starlark.UNIVERSE);
-    env.putAll(predeclared);
-    env.putAll(globals);
-    return env;
-  }
-
-  /**
-   * Returns the value of the specified global variable, or null if not bound. Does not look in the
-   * predeclared environment.
-   */
-  public Object getGlobal(String name) {
-    return globals.get(name);
-  }
-
-  /**
-   * Returns the value of the named variable in the module global environment (as if by {@link
-   * #getGlobal}), or if not bound there, in the predeclared environment (as if by {@link
-   * #getPredeclared}, or if not bound there, null.
-   */
-  public Object get(String name) {
-    // TODO(adonovan): delete this whole function, and getTransitiveBindings.
-    // With proper resolution, the interpreter will know whether
-    // to look in the module or the predeclared/universal environment.
-    Object v = getGlobal(name);
-    if (v != null) {
-      return v;
-    }
-    return getPredeclared(name);
-  }
-
-  /** Updates a global binding in the module environment. */
-  public void setGlobal(String name, Object value) {
-    Preconditions.checkNotNull(value, "Module.setGlobal(%s, null)", name);
-    globals.put(name, value);
-  }
-
-  @Override
-  public String toString() {
-    return String.format("<module %s>", clientData == null ? "?" : clientData);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Mutability.java b/src/main/java/com/google/devtools/build/lib/syntax/Mutability.java
deleted file mode 100644
index dd9e8c1..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Mutability.java
+++ /dev/null
@@ -1,280 +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 com.google.common.base.Joiner;
-import java.util.IdentityHashMap;
-
-/**
- * An object that manages the capability to mutate Starlark objects and their {@link
- * StarlarkThread}s. Collectively, the managed objects are called {@link Freezable}s.
- *
- * <p>Each {@code StarlarkThread}, and each of the mutable Starlark values (i.e., {@link
- * StarlarkMutable}s) that are created in that {@code StarlarkThread}, holds a pointer to the same
- * {@code Mutability} instance. Once the {@code StarlarkThread} is done evaluating, its {@code
- * Mutability} is irreversibly closed ("frozen"). At that point, it is no longer possible to change
- * either the bindings in that {@code StarlarkThread} or the state of its objects. This protects
- * each {@code StarlarkThread} from unintentional and unsafe modification.
- *
- * <p>{@code Mutability}s enforce isolation between {@code StarlarkThread}s; it is illegal for an
- * evaluation in one {@code StarlarkThread} to affect the bindings or values of another. In
- * particular, the {@code StarlarkThread} for any Starlark module is frozen before its symbols can
- * be imported for use by another module. Each individual {@code StarlarkThread}'s evaluation is
- * single-threaded, so this isolation also translates to thread safety. Any number of threads may
- * simultaneously access frozen data. (The {@code Mutability} itself is also thread-safe if and only
- * if it is frozen.}
- *
- * <p>Although the mutability pointer of a {@code Freezable} contains some debugging information
- * about its context, this should not affect the {@code Freezable}'s semantics. From a behavioral
- * point of view, the only thing that matters is whether the {@code Mutability} is frozen, not what
- * particular {@code Mutability} object is pointed to.
- *
- * <p>When a Starlark program iterates over a mutable sequence value in a for-loop or comprehension,
- * the sequence value becomes temporarily immutable for the duration of the loop. Conceptually, the
- * value maintains a counter of active iterations, and the interpreter notifies the {@code
- * Freezable} value before and after the loop so that it can alter its counter by calling its {@code
- * updateIteratorCount} method. While the counter value is nonzero, the value should cause all
- * attempts to mutate it to fail. The temporary immutability applies only to the sequence itself,
- * not to its elements. Once a mutable sequence becomes frozen, there is no need to count active
- * iterators (and doing so would be racy as frozen objects may be published to other Starlark
- * threads). The default implementation of {@code updateIteratorCount} uses a set of counters in the
- * Mutability, but a Freezable object may define a more efficient intrusive counter implementation.
- *
- * <p>We follow two disciplines to ensure safety. First, all mutation methods of a Freezable value
- * must confirm that the value's Mutability is not yet frozen, nor is the value temporarily
- * immutable due to active iterators.
- *
- * <p>Second, {@code Mutability}s are created using the try-with-resource style:
- *
- * <pre>{@code
- * try (Mutability mutability = Mutability.create(name, ...)) { ... }
- * }</pre>
- *
- * The general pattern is to create a {@code Mutability}, build an {@code StarlarkThread}, mutate
- * that {@code StarlarkThread} and its objects, and possibly return the result from within the
- * {@code try} block, relying on the try-with-resource construct to ensure that everything gets
- * frozen before the result is used. The only code that should create a {@code Mutability} without
- * using try-with-resource is test code that is not part of the Bazel jar.
- *
- * <p>We keep some (unchecked) invariants regarding where {@code Mutability} objects may appear
- * within a compound value.
- *
- * <ol>
- *   <li>A compound value can never contain an unfrozen {@code Mutability} for any {@code
- *       StarlarkThread} except the one currently being evaluated.
- *   <li>If a value has the special {@link #IMMUTABLE} {@code Mutability}, all of its contents are
- *       themselves deeply immutable too (i.e. have frozen {@code Mutability}s).
- * </ol>
- *
- * It follows that, if these invariants hold, an unfrozen value cannot appear as the child of a
- * value whose {@code Mutability} is already frozen. This knowledge is used by {@link
- * StarlarkMutable#isImmutable} to prune traversals of a compound value.
- *
- * <p>There is a special API for freezing individual values rather than whole {@code
- * StarlarkThread}s. Because this API makes it easier to violate the above invariants, you should
- * avoid using it if at all possible; at the moment it is only used for serialization. Under this
- * API, you may call {@link Freezable#unsafeShallowFreeze} to reset a value's {@code Mutability}
- * pointer to be {@link #IMMUTABLE}. This operation has no effect on the {@code Mutability} itself.
- * It is up to the caller to preserve or restore the above invariants by ensuring that any deeply
- * contained values are also frozen. For safety and explicitness, this operation is disallowed
- * unless the {@code Mutability}'s {@link #allowsUnsafeShallowFreeze} method returns true.
- */
-public final class Mutability implements AutoCloseable {
-
-  // Maps each temporarily frozen Freezable value to the (positive) count of active iterators over
-  // the value. This field is set to null when the Mutability becomes permanently frozen, at which
-  // point there is no need to track iterators. This map does not contain Freezable values that
-  // define their own implementation of updateIteratorCount.
-  private IdentityHashMap<Freezable, Integer> iteratorCount =
-      new IdentityHashMap<>(10); // 10 nested for-loops seems plenty
-
-  // An optional list of values that are formatted with toString and joined with spaces to yield the
-  // "annotation", an internal name describing the purpose of this Mutability.
-  private final Object[] annotation;
-
-  /** Controls access to {@link Freezable#unsafeShallowFreeze}. */
-  private final boolean allowsUnsafeShallowFreeze;
-
-  private Mutability(Object[] annotation, boolean allowsUnsafeShallowFreeze) {
-    this.annotation = annotation;
-    this.allowsUnsafeShallowFreeze = allowsUnsafeShallowFreeze;
-  }
-
-  /**
-   * Creates a {@code Mutability}.
-   *
-   * @param annotation a list of objects whose toString representations are joined with spaces to
-   *     yield the annotation, an internal name describing the purpose of this Mutability.
-   */
-  public static Mutability create(Object... annotation) {
-    return new Mutability(annotation, /*allowsUnsafeShallowFreeze=*/ false);
-  }
-
-  /**
-   * Creates a {@code Mutability} whose objects can be individually frozen; see docstrings for
-   * {@link Mutability} and {@link Freezable#unsafeShallowFreeze}.
-   */
-  public static Mutability createAllowingShallowFreeze(Object... annotation) {
-    return new Mutability(annotation, /*allowsUnsafeShallowFreeze=*/ true);
-  }
-
-  /** Returns the Mutability's "annotation", an internal name describing its purpose. */
-  public String getAnnotation() {
-    // The annotation string is computed when needed, typically never,
-    // to avoid the performance penalty of materializing it eagerly.
-    return Joiner.on(" ").join(annotation);
-  }
-
-  @Override
-  public String toString() {
-    return (isFrozen() ? "(" : "[") + getAnnotation() + (isFrozen() ? ")" : "]");
-  }
-
-  public boolean isFrozen() {
-    return this.iteratorCount == null;
-  }
-
-  // Defines the default behavior of mutable Freezable sequence values,
-  // which become temporarily immutable while there are active iterators.
-  private boolean updateIteratorCount(Freezable x, int delta) {
-    if (isFrozen()) {
-      return false;
-    }
-    int i = this.iteratorCount.getOrDefault(x, 0);
-    if (delta > 0) {
-      i++;
-      this.iteratorCount.put(x, i);
-    } else if (delta < 0) {
-      i--;
-      if (i == 0) {
-        this.iteratorCount.remove(x);
-      } else if (i > 0) {
-        this.iteratorCount.put(x, i);
-      } else {
-        throw new IllegalStateException("zero value in this.iteratorCount");
-      }
-    }
-    return i > 0;
-  }
-
-  /**
-   * Freezes this {@code Mutability}, rendering all {@link Freezable} objects that refer to it
-   * immutable.
-   *
-   * Note that freezing does not directly touch all the {@code Freezables}, so this operation is
-   * constant-time.
-   *
-   * @return this object, in the fluent style
-   */
-  public Mutability freeze() {
-    this.iteratorCount = null;
-    return this;
-  }
-
-  @Override
-  public void close() {
-    freeze();
-  }
-
-  /**
-   * Returns whether {@link Freezable}s having this {@code Mutability} allow the {@link
-   * #unsafeShallowFreeze} operation.
-   */
-  public boolean allowsUnsafeShallowFreeze() {
-    return allowsUnsafeShallowFreeze;
-  }
-
-  /**
-   * An object that refers to a {@link Mutability} to decide whether to allow mutation. All {@link
-   * Freezable} Starlark objects created within a given {@link StarlarkThread} will share the same
-   * {@code Mutability} as that {@code StarlarkThread}.
-   */
-  public interface Freezable {
-    /**
-     * Returns the {@link Mutability} associated with this {@code Freezable}. This should not change
-     * over the lifetime of the object, except by calling {@link #shallowFreeze} if applicable.
-     */
-    Mutability mutability();
-
-    /**
-     * Registers a change to this Freezable's iterator count and reports whether it is temporarily
-     * immutable.
-     *
-     * <p>If the value is permanently frozen ({@code mutability().isFrozen()), this function is a
-     * no-op that returns false.
-     *
-     * <p>Otherwise, if delta is positive, this increments the count of active iterators over the
-     * value, causing it to appear temporarily frozen (if it wasn't already). If delta is negative,
-     * the counter is decremented, and if delta is zero the counter is unchanged. It is illegal to
-     * decrement the counter if it was already zero. The return value is true if the count is
-     * positive after the change, and false otherwise.
-     *
-     * <p>The default implementation stores the counter of iterators in a hash table in the
-     * Mutability, but a subclass of Freezable may define a more efficient implementation such as an
-     * integer field in the freezable value itself.
-     *
-     * <p>Call this function with a positive value when starting an iteration and with a negative
-     * value when ending it.
-     */
-    default boolean updateIteratorCount(int delta) {
-      return mutability().updateIteratorCount(this, delta);
-    }
-
-    /**
-     * Freezes this object (and not its contents). Use with care.
-     *
-     * <p>This method is optional (i.e. may throw {@link NotImplementedException}).
-     *
-     * <p>If this object's {@link Mutability} is 1) not frozen, and 2) has {@link
-     * #allowUnsafeShallowFreeze} return true, then the object's {@code Mutability} reference is
-     * updated to point to {@link #IMMUTABLE}. Otherwise, this method throws {@link
-     * IllegalArgumentException}.
-     *
-     * <p>It is up to the caller to ensure that any contents of this {@code Freezable} are also
-     * frozen in order to preserve/restore the invariant that an immutable value cannot contain a
-     * mutable one. Note that {@link StarlarkMutable#isImmutable} correctness and thread-safety are
-     * not guaranteed otherwise.
-     */
-    default void unsafeShallowFreeze() {
-      throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Throws {@link IllegalArgumentException} if the precondition for {@link #unsafeShallowFreeze}
-     * is violated. To be used by implementors of {@link #unsafeShallowFreeze}.
-     */
-    static void checkUnsafeShallowFreezePrecondition(
-        Freezable freezable) {
-      Mutability mutability = freezable.mutability();
-      if (mutability.isFrozen()) {
-        // It's not safe to rewrite the Mutability pointer if this is already frozen, because we
-        // could be accessed by multiple threads.
-        throw new IllegalArgumentException(
-            "cannot call unsafeShallowFreeze() on an object whose Mutability is already frozen");
-      }
-      if (!mutability.allowsUnsafeShallowFreeze()) {
-        throw new IllegalArgumentException(
-            "cannot call unsafeShallowFreeze() on a mutable object whose Mutability's "
-                + "allowsUnsafeShallowFreeze() == false");
-      }
-    }
-  }
-
-  /**
-   * A {@code Mutability} indicating that a value is deeply immutable.
-   *
-   * <p>It is not associated with any particular {@link StarlarkThread}.
-   */
-  public static final Mutability IMMUTABLE = create("IMMUTABLE").freeze();
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Node.java b/src/main/java/com/google/devtools/build/lib/syntax/Node.java
deleted file mode 100644
index e89bc1a..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Node.java
+++ /dev/null
@@ -1,128 +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 com.google.common.base.Preconditions;
-
-/**
- * A Node is a node in a Starlark syntax tree.
- *
- * <p>Nodes may be constructed only by the parser.
- *
- * <p>The syntax tree records the offsets within the file of all salient tokens, such as brackets
- * that mark the beginning or end of an expression, or operators whose position may be needed in a
- * run-time error message. The start and end offsets of each Node are computed inductively from
- * their tokens and subexpressions. Offsets are converted to Locations on demand in methods such as
- * {@link #getStartLocation}.
- */
-public abstract class Node {
-
-  // Use these typical node distributions in Bazel files
-  // as a rough guide for optimization decisions.
-  // BUILD files are much more numerous than .bzl files,
-  // and typically larger.
-  //
-  // Large BUILD file:
-  //   49  % StringLiteral
-  //   17  % Identifier
-  //   12  % Argument.Keyword
-  //    9  % ListExpression
-  //    4  % CallExpression
-  //    3.5% ExpressionStatement
-  //    3.1% Comment
-  //    1.2% Argument.Positional
-  //    1.8% all others
-  //
-  // Large .bzl logic file:
-  //   42 % Identifier
-  //   12 % DotExpression
-  //   7.1% StringLiteral
-  //   6.7% Argument.Keyword
-  //   6.7% CallExpression
-  //   4.6% Argument.Positional
-  //   3.1% Comment
-  //   2.4% ListExpression
-  //   2.4% ExpressionStatement
-  //   2.2% AssignmentStatement
-  //   1.9% DictExpression.Entry
-  //   1.9% BinaryOperatorExpression
-  //   1.0% Comprehension
-  //   6  % all others
-
-  // The FileLocations table holds the file name and a compressed
-  // mapping from token char offsets to Locations.
-  // It is shared by all nodes from the same file.
-  final FileLocations locs;
-
-  Node(FileLocations locs) {
-    this.locs = Preconditions.checkNotNull(locs);
-  }
-
-  /**
-   * Returns the node's start offset, as a char index (zero-based count of UTF-16 codes) from the
-   * start of the file.
-   */
-  public abstract int getStartOffset();
-
-  /** Returns the location of the start of this syntax node. */
-  public final Location getStartLocation() {
-    return locs.getLocation(getStartOffset());
-  }
-
-  /** Returns the char offset of the source position immediately after this syntax node. */
-  public abstract int getEndOffset();
-
-  /** Returns the location of the source position immediately after this syntax node. */
-  public final Location getEndLocation() {
-    return locs.getLocation(getEndOffset());
-  }
-
-  /**
-   * Returns a pretty-printed representation of this syntax tree.
-   *
-   * <p>This function returns the canonical source code corresponding to a syntax tree. Generally,
-   * the output can be round-tripped: pretty-printing a syntax tree then parsing the result should
-   * yield an equivalent syntax tree.
-   *
-   * <p>The pretty-printed form of a syntax tree may be used as a proxy for equality in tests.
-   * However, different trees may have the same printed form. In particular, {@link StarlarkFile}
-   * includes comments that are not reflected in the string.
-   */
-  public final String prettyPrint() {
-    StringBuilder buf = new StringBuilder();
-    new NodePrinter(buf).printNode(this);
-    return buf.toString();
-  }
-
-  /**
-   * Print the syntax node in a form useful for debugging.
-   *
-   * <p>The output is not precisely specified; use {@link #prettyPrint()} if you need more stable
-   * and complete information. For instance, this function may omit child statements of compound
-   * statements, or parentheses around some expressions. It may also abbreviate large list literals.
-   */
-  @Override
-  public String toString() {
-    return prettyPrint(); // default behavior, overridden in several subclasses
-  }
-
-  /**
-   * Implements the double dispatch by calling into the node specific <code>visit</code> method of
-   * the {@link NodeVisitor}
-   *
-   * @param visitor the {@link NodeVisitor} instance to dispatch to.
-   */
-  public abstract void accept(NodeVisitor visitor);
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/NodePrinter.java b/src/main/java/com/google/devtools/build/lib/syntax/NodePrinter.java
deleted file mode 100644
index b9532fa..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/NodePrinter.java
+++ /dev/null
@@ -1,464 +0,0 @@
-// Copyright 2019 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 java.util.List;
-
-/** A pretty-printer for Starlark syntax trees. */
-final class NodePrinter {
-
-  private final StringBuilder buf;
-  private int indent;
-
-  NodePrinter(StringBuilder buf) {
-    this.buf = buf;
-  }
-
-  // Constructor exposed to legacy tests.
-  // TODO(adonovan): rewrite the tests not to care about the indent parameter.
-  NodePrinter(StringBuilder buf, int indent) {
-    this.buf = buf;
-    this.indent = indent;
-  }
-
-  // Main entry point for an arbitrary node.
-  // Called by Node.prettyPrint.
-  void printNode(Node n) {
-    if (n instanceof Expression) {
-      printExpr((Expression) n);
-
-    } else if (n instanceof Statement) {
-      printStmt((Statement) n);
-
-    } else if (n instanceof StarlarkFile) {
-      StarlarkFile file = (StarlarkFile) n;
-      // Only statements are printed, not comments.
-      for (Statement stmt : file.getStatements()) {
-        printStmt(stmt);
-      }
-
-    } else if (n instanceof Comment) {
-      Comment comment = (Comment) n;
-      // We can't really print comments in the right place anyway,
-      // due to how their relative order is lost in the representation
-      // of StarlarkFile. So don't bother word-wrapping and just print
-      // it on a single line.
-      printIndent();
-      buf.append(comment.getText());
-
-    } else if (n instanceof Argument) {
-      printArgument((Argument) n);
-
-    } else if (n instanceof Parameter) {
-      printParameter((Parameter) n);
-
-    } else if (n instanceof DictExpression.Entry) {
-      printDictEntry((DictExpression.Entry) n);
-
-    } else {
-      throw new IllegalArgumentException("unexpected: " + n.getClass());
-    }
-  }
-
-  private void printSuite(List<Statement> statements) {
-    // A suite is non-empty; pass statements are explicit.
-    indent++;
-    for (Statement stmt : statements) {
-      printStmt(stmt);
-    }
-    indent--;
-  }
-
-  private void printIndent() {
-    for (int i = 0; i < indent; i++) {
-      buf.append("  ");
-    }
-  }
-
-  private void printArgument(Argument arg) {
-    if (arg instanceof Argument.Positional) {
-      // nop
-    } else if (arg instanceof Argument.Keyword) {
-      buf.append(((Argument.Keyword) arg).getIdentifier().getName());
-      buf.append(" = ");
-    } else if (arg instanceof Argument.Star) {
-      buf.append('*');
-    } else if (arg instanceof Argument.StarStar) {
-      buf.append("**");
-    }
-    printExpr(arg.getValue());
-  }
-
-  private void printParameter(Parameter param) {
-    if (param instanceof Parameter.Mandatory) {
-      buf.append(param.getName());
-    } else if (param instanceof Parameter.Optional) {
-      buf.append(param.getName());
-      buf.append('=');
-      printExpr(param.getDefaultValue());
-    } else if (param instanceof Parameter.Star) {
-      buf.append('*');
-      if (param.getName() != null) {
-        buf.append(param.getName());
-      }
-    } else if (param instanceof Parameter.StarStar) {
-      buf.append("**");
-      buf.append(param.getName());
-    }
-  }
-
-  private void printDictEntry(DictExpression.Entry e) {
-    printExpr(e.getKey());
-    buf.append(": ");
-    printExpr(e.getValue());
-  }
-
-  // Appends "def f(a, ..., z):" to the buf.
-  // Also used by DefStatement.toString.
-  void printDefSignature(DefStatement def) {
-    buf.append("def ");
-    printExpr(def.getIdentifier());
-    buf.append('(');
-    String sep = "";
-    for (Parameter param : def.getParameters()) {
-      buf.append(sep);
-      printParameter(param);
-      sep = ", ";
-    }
-    buf.append("):");
-  }
-
-  private void printStmt(Statement s) {
-    printIndent();
-
-    switch (s.kind()) {
-      case ASSIGNMENT:
-        {
-          AssignmentStatement stmt = (AssignmentStatement) s;
-          printExpr(stmt.getLHS());
-          buf.append(' ');
-          if (stmt.isAugmented()) {
-            buf.append(stmt.getOperator());
-          }
-          buf.append("= ");
-          printExpr(stmt.getRHS());
-          buf.append('\n');
-          break;
-        }
-
-      case EXPRESSION:
-        {
-          ExpressionStatement stmt = (ExpressionStatement) s;
-          printExpr(stmt.getExpression());
-          buf.append('\n');
-          break;
-        }
-
-      case FLOW:
-        {
-          FlowStatement stmt = (FlowStatement) s;
-          buf.append(stmt.getKind()).append('\n');
-          break;
-        }
-
-      case FOR:
-        {
-          ForStatement stmt = (ForStatement) s;
-          buf.append("for ");
-          printExpr(stmt.getVars());
-          buf.append(" in ");
-          printExpr(stmt.getCollection());
-          buf.append(":\n");
-          printSuite(stmt.getBody());
-          break;
-        }
-
-      case DEF:
-        {
-          DefStatement stmt = (DefStatement) s;
-          printDefSignature(stmt);
-          buf.append('\n');
-          printSuite(stmt.getBody());
-          break;
-        }
-
-      case IF:
-        {
-          IfStatement stmt = (IfStatement) s;
-          buf.append(stmt.isElif() ? "elif " : "if ");
-          printExpr(stmt.getCondition());
-          buf.append(":\n");
-          printSuite(stmt.getThenBlock());
-          List<Statement> elseBlock = stmt.getElseBlock();
-          if (elseBlock != null) {
-            if (elseBlock.size() == 1
-                && elseBlock.get(0) instanceof IfStatement
-                && ((IfStatement) elseBlock.get(0)).isElif()) {
-              printStmt(elseBlock.get(0));
-            } else {
-              printIndent();
-              buf.append("else:\n");
-              printSuite(elseBlock);
-            }
-          }
-          break;
-        }
-
-      case LOAD:
-        {
-          LoadStatement stmt = (LoadStatement) s;
-          buf.append("load(");
-          printExpr(stmt.getImport());
-          for (LoadStatement.Binding binding : stmt.getBindings()) {
-            buf.append(", ");
-            Identifier local = binding.getLocalName();
-            String origName = binding.getOriginalName().getName();
-            if (origName.equals(local.getName())) {
-              buf.append('"');
-              printExpr(local);
-              buf.append('"');
-            } else {
-              printExpr(local);
-              buf.append("=\"");
-              buf.append(origName);
-              buf.append('"');
-            }
-          }
-          buf.append(")\n");
-          break;
-        }
-
-      case RETURN:
-        {
-          ReturnStatement stmt = (ReturnStatement) s;
-          buf.append("return");
-          if (stmt.getResult() != null) {
-            buf.append(' ');
-            printExpr(stmt.getResult());
-          }
-          buf.append('\n');
-          break;
-        }
-    }
-  }
-
-  private void printExpr(Expression expr) {
-    switch (expr.kind()) {
-      case BINARY_OPERATOR:
-        {
-          BinaryOperatorExpression binop = (BinaryOperatorExpression) expr;
-          // TODO(bazel-team): retain parentheses in the syntax tree so we needn't
-          // conservatively emit them here.
-          buf.append('(');
-          printExpr(binop.getX());
-          buf.append(' ');
-          buf.append(binop.getOperator());
-          buf.append(' ');
-          printExpr(binop.getY());
-          buf.append(')');
-          break;
-        }
-
-      case COMPREHENSION:
-        {
-          Comprehension comp = (Comprehension) expr;
-          buf.append(comp.isDict() ? '{' : '[');
-          printNode(comp.getBody()); // Expression or DictExpression.Entry
-          for (Comprehension.Clause clause : comp.getClauses()) {
-            buf.append(' ');
-            if (clause instanceof Comprehension.For) {
-              Comprehension.For forClause = (Comprehension.For) clause;
-              buf.append("for ");
-              printExpr(forClause.getVars());
-              buf.append(" in ");
-              printExpr(forClause.getIterable());
-            } else {
-              Comprehension.If ifClause = (Comprehension.If) clause;
-              buf.append("if ");
-              printExpr(ifClause.getCondition());
-            }
-          }
-          buf.append(comp.isDict() ? '}' : ']');
-          break;
-        }
-
-      case CONDITIONAL:
-        {
-          ConditionalExpression cond = (ConditionalExpression) expr;
-          printExpr(cond.getThenCase());
-          buf.append(" if ");
-          printExpr(cond.getCondition());
-          buf.append(" else ");
-          printExpr(cond.getElseCase());
-          break;
-        }
-
-      case DICT_EXPR:
-        {
-          DictExpression dictexpr = (DictExpression) expr;
-          buf.append("{");
-          String sep = "";
-          for (DictExpression.Entry entry : dictexpr.getEntries()) {
-            buf.append(sep);
-            printDictEntry(entry);
-            sep = ", ";
-          }
-          buf.append("}");
-          break;
-        }
-
-      case DOT:
-        {
-          DotExpression dot = (DotExpression) expr;
-          printExpr(dot.getObject());
-          buf.append('.');
-          printExpr(dot.getField());
-          break;
-        }
-
-      case CALL:
-        {
-          CallExpression call = (CallExpression) expr;
-          printExpr(call.getFunction());
-          buf.append('(');
-          String sep = "";
-          for (Argument arg : call.getArguments()) {
-            buf.append(sep);
-            printArgument(arg);
-            sep = ", ";
-          }
-          buf.append(')');
-          break;
-        }
-
-      case IDENTIFIER:
-        buf.append(((Identifier) expr).getName());
-        break;
-
-      case INDEX:
-        {
-          IndexExpression index = (IndexExpression) expr;
-          printExpr(index.getObject());
-          buf.append('[');
-          printExpr(index.getKey());
-          buf.append(']');
-          break;
-        }
-
-      case INTEGER_LITERAL:
-        {
-          buf.append(((IntegerLiteral) expr).getValue());
-          break;
-        }
-
-      case LIST_EXPR:
-        {
-          ListExpression list = (ListExpression) expr;
-          buf.append(list.isTuple() ? '(' : '[');
-          String sep = "";
-          for (Expression e : list.getElements()) {
-            buf.append(sep);
-            printExpr(e);
-            sep = ", ";
-          }
-          if (list.isTuple() && list.getElements().size() == 1) {
-            buf.append(',');
-          }
-          buf.append(list.isTuple() ? ')' : ']');
-          break;
-        }
-
-      case SLICE:
-        {
-          SliceExpression slice = (SliceExpression) expr;
-          printExpr(slice.getObject());
-          buf.append('[');
-          // The first separator colon is unconditional.
-          // The second separator appears only if step is printed.
-          if (slice.getStart() != null) {
-            printExpr(slice.getStart());
-          }
-          buf.append(':');
-          if (slice.getStop() != null) {
-            printExpr(slice.getStop());
-          }
-          if (slice.getStep() != null) {
-            buf.append(':');
-            printExpr(slice.getStep());
-          }
-          buf.append(']');
-          break;
-        }
-
-      case STRING_LITERAL:
-        {
-          StringLiteral literal = (StringLiteral) expr;
-          String value = literal.getValue();
-
-          // TODO(adonovan): record the raw text of string (and integer) literals
-          // so that we can use the syntax tree for source modification tools.
-          // However, that may come with a memory cost until we start compiling
-          // (at which point the cost is only transient).
-          // For now, just simulate the behavior of repr(str).
-          buf.append('"');
-          for (int i = 0; i < value.length(); i++) {
-            char c = value.charAt(i);
-            switch (c) {
-              case '"':
-                buf.append("\\\"");
-                break;
-              case '\\':
-                buf.append("\\\\");
-                break;
-              case '\r':
-                buf.append("\\r");
-                break;
-              case '\n':
-                buf.append("\\n");
-                break;
-              case '\t':
-                buf.append("\\t");
-                break;
-              default:
-                // The Starlark spec (and lexer) are far from complete here,
-                // and it's hard to come up with a clean semantics for
-                // string escapes that serves Java (UTF-16) and Go (UTF-8).
-                // Clearly string literals should not contain non-printable
-                // characters. For now we'll continue to pretend that all
-                // non-printables are < 32, but this obviously false.
-                if (c < 32) {
-                  buf.append(String.format("\\x%02x", (int) c));
-                } else {
-                  buf.append(c);
-                }
-            }
-          }
-          buf.append('"');
-          break;
-        }
-
-      case UNARY_OPERATOR:
-        {
-          UnaryOperatorExpression unop = (UnaryOperatorExpression) expr;
-          // TODO(bazel-team): retain parentheses in the syntax tree so we needn't
-          // conservatively emit them here.
-          buf.append(unop.getOperator() == TokenKind.NOT ? "not " : unop.getOperator().toString());
-          buf.append('(');
-          printExpr(unop.getX());
-          buf.append(')');
-          break;
-        }
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/NodeVisitor.java b/src/main/java/com/google/devtools/build/lib/syntax/NodeVisitor.java
deleted file mode 100644
index 303d538..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/NodeVisitor.java
+++ /dev/null
@@ -1,193 +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 java.util.List;
-
-/** A visitor for visiting the nodes of a syntax tree in lexical order. */
-public class NodeVisitor {
-
-  public void visit(Node node) {
-    // dispatch to the node specific method
-    node.accept(this);
-  }
-
-  // methods dealing with sequences of nodes
-  public void visitAll(List<? extends Node> nodes) {
-    for (Node node : nodes) {
-      visit(node);
-    }
-  }
-
-  /**
-   * Visit a sequence ("block") of statements (e.g. an if branch, for block, function block etc.)
-   *
-   * This method allows subclasses to handle statement blocks more easily, like doing an action
-   * after every statement in a block without having to override visit(...) for all statements.
-   *
-   * @param statements list of statements in the block
-   */
-  public void visitBlock(List<Statement> statements) {
-    visitAll(statements);
-  }
-
-  // node-specific visit methods
-
-  // All four subclasses of Argument are handled together.
-  public void visit(Argument node) {
-    visit(node.getValue());
-  }
-
-  // All four subclasses of Parameter are handled together.
-  public void visit(Parameter node) {
-    visit(node.getIdentifier());
-    if (node.getDefaultValue() != null) {
-      visit(node.getDefaultValue());
-    }
-  }
-
-  public void visit(StarlarkFile node) {
-    visitBlock(node.getStatements());
-    visitAll(node.getComments());
-  }
-
-  public void visit(BinaryOperatorExpression node) {
-    visit(node.getX());
-    visit(node.getY());
-  }
-
-  public void visit(CallExpression node) {
-    visit(node.getFunction());
-    visitAll(node.getArguments());
-  }
-
-  public void visit(Identifier node) {}
-
-  public void visit(Comprehension node) {
-    for (Comprehension.Clause clause : node.getClauses()) {
-      if (clause instanceof Comprehension.For) {
-        visit((Comprehension.For) clause);
-      } else {
-        visit((Comprehension.If) clause);
-      }
-    }
-    visit(node.getBody());
-  }
-
-  public void visit(Comprehension.For node) {
-    visit(node.getVars());
-    visit(node.getIterable());
-  }
-
-  public void visit(Comprehension.If node) {
-    visit(node.getCondition());
-  }
-
-  public void visit(ForStatement node) {
-    visit(node.getCollection());
-    visit(node.getVars());
-    visitBlock(node.getBody());
-  }
-
-  public void visit(LoadStatement node) {
-    for (LoadStatement.Binding binding : node.getBindings()) {
-      visit(binding.getLocalName());
-    }
-  }
-
-  public void visit(ListExpression node) {
-    visitAll(node.getElements());
-  }
-
-  public void visit(@SuppressWarnings("unused") IntegerLiteral node) {}
-
-  public void visit(@SuppressWarnings("unused") StringLiteral node) {}
-
-  public void visit(AssignmentStatement node) {
-    visit(node.getRHS());
-    visit(node.getLHS());
-  }
-
-  public void visit(ExpressionStatement node) {
-    visit(node.getExpression());
-  }
-
-  public void visit(IfStatement node) {
-    visit(node.getCondition());
-    visitBlock(node.getThenBlock());
-    if (node.getElseBlock() != null) {
-      visitBlock(node.getElseBlock());
-    }
-  }
-
-  public void visit(DefStatement node) {
-    visit(node.getIdentifier());
-    visitAll(node.getParameters());
-    visitBlock(node.getBody());
-  }
-
-  public void visit(ReturnStatement node) {
-    if (node.getResult() != null) {
-      visit(node.getResult());
-    }
-  }
-
-  public void visit(FlowStatement node) {}
-
-  public void visit(DictExpression node) {
-    visitAll(node.getEntries());
-  }
-
-  public void visit(DictExpression.Entry node) {
-    visit(node.getKey());
-    visit(node.getValue());
-  }
-
-  public void visit(UnaryOperatorExpression node) {
-    visit(node.getX());
-  }
-
-  public void visit(DotExpression node) {
-    visit(node.getObject());
-    visit(node.getField());
-  }
-
-  public void visit(IndexExpression node) {
-    visit(node.getObject());
-    visit(node.getKey());
-  }
-
-  public void visit(SliceExpression node) {
-    visit(node.getObject());
-    if (node.getStart() != null) {
-      visit(node.getStart());
-    }
-    if (node.getStop() != null) {
-      visit(node.getStop());
-    }
-    if (node.getStep() != null) {
-      visit(node.getStep());
-    }
-  }
-
-  public void visit(@SuppressWarnings("unused") Comment node) {}
-
-  public void visit(ConditionalExpression node) {
-    visit(node.getCondition());
-    visit(node.getThenCase());
-    if (node.getElseCase() != null) {
-      visit(node.getElseCase());
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/NoneType.java b/src/main/java/com/google/devtools/build/lib/syntax/NoneType.java
deleted file mode 100644
index 9a543c9..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/NoneType.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2019 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 javax.annotation.concurrent.Immutable;
-import net.starlark.java.annot.StarlarkBuiltin;
-
-/** The type of the Starlark None value. */
-@StarlarkBuiltin(
-    name = "NoneType",
-    documented = false,
-    doc = "The type of the Starlark None value.")
-@Immutable
-public final class NoneType implements StarlarkValue {
-
-  static final NoneType NONE = new NoneType();
-
-  private NoneType() {}
-
-  @Override
-  public String toString() {
-    return "None";
-  }
-
-  @Override
-  public boolean isImmutable() {
-    return true;
-  }
-
-  @Override
-  public boolean truth() {
-    return false;
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    printer.append("None");
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java b/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java
deleted file mode 100644
index a364382..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java
+++ /dev/null
@@ -1,227 +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.base.Preconditions;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.ParamType;
-
-/** A value class for storing {@link Param} metadata to avoid using Java proxies. */
-final class ParamDescriptor {
-
-  private final String name;
-  @Nullable private final Object defaultValue;
-  private final boolean noneable;
-  private final boolean named;
-  private final boolean positional;
-  private final List<Class<?>> allowedClasses; // non-empty
-  // The semantics flag responsible for disabling this parameter, or null if enabled.
-  // It is an error for Starlark code to supply a value to a disabled parameter.
-  @Nullable private final String disabledByFlag;
-
-  private ParamDescriptor(
-      String name,
-      String defaultExpr,
-      boolean noneable,
-      boolean named,
-      boolean positional,
-      List<Class<?>> allowedClasses,
-      @Nullable String disabledByFlag) {
-    this.name = name;
-    this.defaultValue = defaultExpr.isEmpty() ? null : evalDefault(name, defaultExpr);
-    this.noneable = noneable;
-    this.named = named;
-    this.positional = positional;
-    this.allowedClasses = allowedClasses;
-    this.disabledByFlag = disabledByFlag;
-  }
-
-  /**
-   * Returns a {@link ParamDescriptor} representing the given raw {@link Param} annotation and the
-   * given semantics.
-   */
-  static ParamDescriptor of(Param param, StarlarkSemantics starlarkSemantics) {
-    String defaultExpr = param.defaultValue();
-    String disabledByFlag = null;
-    if (!starlarkSemantics.isFeatureEnabledBasedOnTogglingFlags(
-        param.enableOnlyWithFlag(), param.disableWithFlag())) {
-      defaultExpr = param.valueWhenDisabled();
-      disabledByFlag =
-          !param.enableOnlyWithFlag().isEmpty()
-              ? param.enableOnlyWithFlag()
-              : param.disableWithFlag();
-      Preconditions.checkState(!disabledByFlag.isEmpty());
-    }
-
-    // Compute set of allowed classes.
-    ParamType[] allowedTypes = param.allowedTypes();
-    List<Class<?>> allowedClasses = new ArrayList<>();
-    if (allowedTypes.length > 0) {
-      for (ParamType pt : allowedTypes) {
-        allowedClasses.add(pt.type());
-      }
-    } else {
-      allowedClasses.add(param.type());
-    }
-    if (param.noneable()) {
-      // A few annotations redundantly declare NoneType.
-      if (!allowedClasses.contains(NoneType.class)) {
-        allowedClasses.add(NoneType.class);
-      }
-    }
-
-    return new ParamDescriptor(
-        param.name(),
-        defaultExpr,
-        param.noneable(),
-        param.named(),
-        param.positional(),
-        allowedClasses,
-        disabledByFlag);
-  }
-
-  /** @see Param#name() */
-  String getName() {
-    return name;
-  }
-
-  /** Returns a description of allowed argument types suitable for an error message. */
-  String getTypeErrorMessage() {
-    return allowedClasses.stream().map(Starlark::classType).collect(Collectors.joining(" or "));
-  }
-
-  List<Class<?>> getAllowedClasses() {
-    return allowedClasses;
-  }
-
-  /** @see Param#noneable() */
-  boolean isNoneable() {
-    return noneable;
-  }
-
-  /** @see Param#positional() */
-  boolean isPositional() {
-    return positional;
-  }
-
-  /** @see Param#named() */
-  boolean isNamed() {
-    return named;
-  }
-
-  /** Returns the effective default value of this parameter, or null if mandatory. */
-  @Nullable
-  Object getDefaultValue() {
-    return defaultValue;
-  }
-
-  /** Returns the flag responsible for disabling this parameter, or null if it is enabled. */
-  @Nullable
-  String disabledByFlag() {
-    return disabledByFlag;
-  }
-
-  // A memoization of evalDefault, keyed by expression.
-  // This cache is manually maintained (instead of using LoadingCache),
-  // as default values may sometimes be recursively requested.
-  private static final ConcurrentHashMap<String, Object> defaultValueCache =
-      new ConcurrentHashMap<>();
-
-  // Evaluates the default value expression for a parameter.
-  private static Object evalDefault(String name, String expr) {
-    // Values required by defaults of functions in UNIVERSE must
-    // be handled without depending on the evaluator, or even
-    // on defaultValueCache, because JVM global variable initialization
-    // is such a mess. (Specifically, it's completely dynamic,
-    // so if two or more variables are mutually dependent, like
-    // defaultValueCache and UNIVERSE would be, you have to write
-    // code that works in all possible dynamic initialization orders.)
-    // Better not to go there.
-    if (expr.equals("None")) {
-      return Starlark.NONE;
-    } else if (expr.equals("True")) {
-      return true;
-    } else if (expr.equals("False")) {
-      return false;
-    } else if (expr.equals("unbound")) {
-      return Starlark.UNBOUND;
-    } else if (expr.equals("0")) {
-      return 0;
-    } else if (expr.equals("1")) {
-      return 1;
-    } else if (expr.equals("[]")) {
-      return StarlarkList.empty();
-    } else if (expr.equals("()")) {
-      return Tuple.empty();
-    } else if (expr.equals("\" \"")) {
-      return " ";
-    }
-
-    Object x = defaultValueCache.get(expr);
-    if (x != null) {
-      return x;
-    }
-
-    // We can't evaluate Starlark code until UNIVERSE is bootstrapped.
-    if (Starlark.UNIVERSE == null) {
-      throw new IllegalStateException("no bootstrap value for " + name + "=" + expr);
-    }
-
-    Module module = Module.create();
-    try (Mutability mu = Mutability.create("Builtin param default init")) {
-      // Note that this Starlark thread ignores command line flags.
-      StarlarkThread thread = new StarlarkThread(mu, StarlarkSemantics.DEFAULT);
-
-      // Disable polling of the java.lang.Thread.interrupt flag during
-      // Starlark evaluation. Assuming the expression does not call a
-      // built-in that throws InterruptedException, this allows us to
-      // assert that InterruptedException "can't happen".
-      //
-      // Bazel Java threads are routinely interrupted during Starlark execution,
-      // and the Starlark interpreter may be in a call to LoadingCache (in CallUtils).
-      // LoadingCache computes the cache entry in the same thread that first
-      // requested the entry, propagating undesirable thread state (which Einstein
-      // called "spooky action at a distance") from an arbitrary application thread
-      // to here, which is logically one-time initialization code.
-      //
-      // A simpler non-solution would be to use a "clean" pool thread
-      // to compute each cache entry; we could safely assume such a thread
-      // is never interrupted. However, this runs afoul of JVM class initialization:
-      // the initialization of Starlark.UNIVERSE depends on Starlark.UNBOUND
-      // because of the reference above. That's fine if they are initialized by
-      // the same thread, as JVM class initialization locks are reentrant,
-      // but the reference deadlocks if made from another thread.
-      // See https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4
-      thread.ignoreThreadInterrupts();
-
-      x = Starlark.eval(ParserInput.fromLines(expr), FileOptions.DEFAULT, module, thread);
-    } catch (InterruptedException ex) {
-      throw new IllegalStateException(ex); // can't happen
-    } catch (SyntaxError.Exception | EvalException ex) {
-      throw new IllegalArgumentException(
-          String.format(
-              "failed to evaluate default value '%s' of parameter '%s': %s",
-              expr, name, ex.getMessage()),
-          ex);
-    }
-    defaultValueCache.put(expr, x);
-    return x;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java b/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
deleted file mode 100644
index 2c4cbae..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
+++ /dev/null
@@ -1,147 +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 javax.annotation.Nullable;
-
-/**
- * Syntax node for a parameter in a function definition.
- *
- * <p>Parameters may be of four forms, as in {@code def f(a, b=c, *args, **kwargs)}. They are
- * represented by the subclasses Mandatory, Optional, Star, and StarStar.
- */
-public abstract class Parameter extends Node {
-
-  @Nullable private final Identifier id;
-
-  private Parameter(FileLocations locs, @Nullable Identifier id) {
-    super(locs);
-    this.id = id;
-  }
-
-  @Nullable
-  public String getName() {
-    return id != null ? id.getName() : null;
-  }
-
-  @Nullable
-  public Identifier getIdentifier() {
-    return id;
-  }
-
-  @Nullable
-  public Expression getDefaultValue() {
-    return null;
-  }
-
-  /**
-   * Syntax node for a mandatory parameter, {@code f(id)}. It may be positional or keyword-only
-   * depending on its position.
-   */
-  public static final class Mandatory extends Parameter {
-    Mandatory(FileLocations locs, Identifier id) {
-      super(locs, id);
-    }
-
-    @Override
-    public int getStartOffset() {
-      return getIdentifier().getStartOffset();
-    }
-
-    @Override
-    public int getEndOffset() {
-      return getIdentifier().getEndOffset();
-    }
-  }
-
-  /**
-   * Syntax node for an optional parameter, {@code f(id=expr).}. It may be positional or
-   * keyword-only depending on its position.
-   */
-  public static final class Optional extends Parameter {
-
-    public final Expression defaultValue;
-
-    Optional(FileLocations locs, Identifier id, @Nullable Expression defaultValue) {
-      super(locs, id);
-      this.defaultValue = defaultValue;
-    }
-
-    @Override
-    @Nullable
-    public Expression getDefaultValue() {
-      return defaultValue;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return getIdentifier().getStartOffset();
-    }
-
-    @Override
-    public int getEndOffset() {
-      return getDefaultValue().getEndOffset();
-    }
-
-    @Override
-    public String toString() {
-      return getName() + "=" + defaultValue;
-    }
-  }
-
-  /** Syntax node for a star parameter, {@code f(*id)} or or {@code f(..., *, ...)}. */
-  public static final class Star extends Parameter {
-    private final int starOffset;
-
-    Star(FileLocations locs, int starOffset, @Nullable Identifier id) {
-      super(locs, id);
-      this.starOffset = starOffset;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return starOffset;
-    }
-
-    @Override
-    public int getEndOffset() {
-      return getIdentifier().getEndOffset();
-    }
-  }
-
-  /** Syntax node for a parameter of the form {@code f(**id)}. */
-  public static final class StarStar extends Parameter {
-    private final int starStarOffset;
-
-    StarStar(FileLocations locs, int starStarOffset, Identifier id) {
-      super(locs, id);
-      this.starStarOffset = starStarOffset;
-    }
-
-    @Override
-    public int getStartOffset() {
-      return starStarOffset;
-    }
-
-    @Override
-    public int getEndOffset() {
-      return getIdentifier().getEndOffset();
-    }
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
deleted file mode 100644
index 2117b84..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ /dev/null
@@ -1,1217 +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 com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.errorprone.annotations.FormatMethod;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.annotation.Nullable;
-
-/** Parser is a recursive-descent parser for Starlark. */
-final class Parser {
-
-  /** Combines the parser result into a single value object. */
-  static final class ParseResult {
-    // Maps char offsets in the file to Locations.
-    final FileLocations locs;
-
-    /** The top-level statements of the parsed file. */
-    final ImmutableList<Statement> statements;
-
-    /** The comments from the parsed file. */
-    final List<Comment> comments;
-
-    // Errors encountered during scanning or parsing.
-    // These lists are ultimately owned by StarlarkFile.
-    final List<SyntaxError> errors;
-
-    private ParseResult(
-        FileLocations locs,
-        ImmutableList<Statement> statements,
-        List<Comment> comments,
-        List<SyntaxError> errors) {
-      this.locs = locs;
-      // No need to copy here; when the object is created, the parser instance is just about to go
-      // out of scope and be garbage collected.
-      this.statements = Preconditions.checkNotNull(statements);
-      this.comments = Preconditions.checkNotNull(comments);
-      this.errors = errors;
-    }
-  }
-
-  private static final EnumSet<TokenKind> STATEMENT_TERMINATOR_SET =
-      EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE, TokenKind.SEMI);
-
-  private static final EnumSet<TokenKind> LIST_TERMINATOR_SET =
-      EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI);
-
-  private static final EnumSet<TokenKind> DICT_TERMINATOR_SET =
-      EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.SEMI);
-
-  private static final EnumSet<TokenKind> EXPR_LIST_TERMINATOR_SET =
-      EnumSet.of(
-          TokenKind.EOF,
-          TokenKind.NEWLINE,
-          TokenKind.EQUALS,
-          TokenKind.RBRACE,
-          TokenKind.RBRACKET,
-          TokenKind.RPAREN,
-          TokenKind.SEMI);
-
-  private static final EnumSet<TokenKind> EXPR_TERMINATOR_SET =
-      EnumSet.of(
-          TokenKind.COLON,
-          TokenKind.COMMA,
-          TokenKind.EOF,
-          TokenKind.FOR,
-          TokenKind.MINUS,
-          TokenKind.PERCENT,
-          TokenKind.PLUS,
-          TokenKind.RBRACKET,
-          TokenKind.RPAREN,
-          TokenKind.SLASH);
-
-  /** Current lookahead token. May be mutated by the parser. */
-  private final Lexer token; // token.kind is a prettier alias for lexer.kind
-
-  private static final boolean DEBUGGING = false;
-
-  private final Lexer lexer;
-  private final FileLocations locs;
-  private final List<SyntaxError> errors;
-
-  // TODO(adonovan): opt: compute this by subtraction.
-  private static final Map<TokenKind, TokenKind> augmentedAssignments =
-      new ImmutableMap.Builder<TokenKind, TokenKind>()
-          .put(TokenKind.PLUS_EQUALS, TokenKind.PLUS)
-          .put(TokenKind.MINUS_EQUALS, TokenKind.MINUS)
-          .put(TokenKind.STAR_EQUALS, TokenKind.STAR)
-          .put(TokenKind.SLASH_EQUALS, TokenKind.SLASH)
-          .put(TokenKind.SLASH_SLASH_EQUALS, TokenKind.SLASH_SLASH)
-          .put(TokenKind.PERCENT_EQUALS, TokenKind.PERCENT)
-          .put(TokenKind.AMPERSAND_EQUALS, TokenKind.AMPERSAND)
-          .put(TokenKind.CARET_EQUALS, TokenKind.CARET)
-          .put(TokenKind.PIPE_EQUALS, TokenKind.PIPE)
-          .put(TokenKind.GREATER_GREATER_EQUALS, TokenKind.GREATER_GREATER)
-          .put(TokenKind.LESS_LESS_EQUALS, TokenKind.LESS_LESS)
-          .build();
-
-  /**
-   * Highest precedence goes last. Based on:
-   * http://docs.python.org/2/reference/expressions.html#operator-precedence
-   */
-  private static final List<EnumSet<TokenKind>> operatorPrecedence =
-      ImmutableList.of(
-          EnumSet.of(TokenKind.OR),
-          EnumSet.of(TokenKind.AND),
-          EnumSet.of(TokenKind.NOT),
-          EnumSet.of(
-              TokenKind.EQUALS_EQUALS,
-              TokenKind.NOT_EQUALS,
-              TokenKind.LESS,
-              TokenKind.LESS_EQUALS,
-              TokenKind.GREATER,
-              TokenKind.GREATER_EQUALS,
-              TokenKind.IN,
-              TokenKind.NOT_IN),
-          EnumSet.of(TokenKind.PIPE),
-          EnumSet.of(TokenKind.CARET),
-          EnumSet.of(TokenKind.AMPERSAND),
-          EnumSet.of(TokenKind.GREATER_GREATER, TokenKind.LESS_LESS),
-          EnumSet.of(TokenKind.MINUS, TokenKind.PLUS),
-          EnumSet.of(TokenKind.SLASH, TokenKind.SLASH_SLASH, TokenKind.STAR, TokenKind.PERCENT));
-
-  private int errorsCount;
-  private boolean recoveryMode;  // stop reporting errors until next statement
-
-  // Intern string literals, as some files contain many literals for the same string.
-  private final Map<String, String> stringInterner = new HashMap<>();
-
-  private Parser(Lexer lexer, List<SyntaxError> errors) {
-    this.lexer = lexer;
-    this.locs = lexer.locs;
-    this.errors = errors;
-    this.token = lexer;
-    nextToken();
-  }
-
-  private String intern(String s) {
-    String prev = stringInterner.putIfAbsent(s, s);
-    return prev != null ? prev : s;
-  }
-
-  // Returns a token's string form as used in error messages.
-  private static String tokenString(TokenKind kind, @Nullable Object value) {
-    return kind == TokenKind.STRING
-        ? "\"" + value + "\"" // TODO(adonovan): do proper quotation
-        : value == null ? kind.toString() : value.toString();
-  }
-
-  // Main entry point for parsing a file.
-  static ParseResult parseFile(ParserInput input, FileOptions options) {
-    List<SyntaxError> errors = new ArrayList<>();
-    Lexer lexer = new Lexer(input, options, errors);
-    Parser parser = new Parser(lexer, errors);
-
-    StarlarkFile.ParseProfiler profiler = Parser.profiler;
-    Object span = profiler != null ? profiler.start(input.getFile()) : null;
-    try {
-      ImmutableList<Statement> statements = parser.parseFileInput();
-      return new ParseResult(lexer.locs, statements, lexer.getComments(), errors);
-    } finally {
-      if (profiler != null) {
-        profiler.end(span);
-      }
-    }
-  }
-
-  @Nullable static StarlarkFile.ParseProfiler profiler;
-
-  // stmt = simple_stmt
-  //      | def_stmt
-  //      | for_stmt
-  //      | if_stmt
-  private void parseStatement(ImmutableList.Builder<Statement> list) {
-    if (token.kind == TokenKind.DEF) {
-      list.add(parseDefStatement());
-    } else if (token.kind == TokenKind.IF) {
-      list.add(parseIfStatement());
-    } else if (token.kind == TokenKind.FOR) {
-      list.add(parseForStatement());
-    } else {
-      parseSimpleStatement(list);
-    }
-  }
-
-  /** Parses an expression, possibly followed by newline tokens. */
-  static Expression parseExpression(ParserInput input, FileOptions options)
-      throws SyntaxError.Exception {
-    List<SyntaxError> errors = new ArrayList<>();
-    Lexer lexer = new Lexer(input, options, errors);
-    Parser parser = new Parser(lexer, errors);
-    Expression result = null;
-    try {
-      result = parser.parseExpression();
-      while (parser.token.kind == TokenKind.NEWLINE) {
-        parser.nextToken();
-      }
-      parser.expect(TokenKind.EOF);
-    } catch (StackOverflowError ex) {
-      // See rationale at parseFile.
-      parser.reportError(
-          lexer.end,
-          "internal error: stack overflow while parsing Starlark expression <<%s>>. Please report"
-              + " the bug.\n"
-              + "%s",
-          new String(input.getContent()),
-          Throwables.getStackTraceAsString(ex));
-    }
-    if (!errors.isEmpty()) {
-      throw new SyntaxError.Exception(errors);
-    }
-    return result;
-  }
-
-  // Equivalent to 'testlist' rule in Python grammar. It can parse every kind of
-  // expression. In many cases, we need to use parseTest to avoid ambiguity:
-  //   e.g. fct(x, y)  vs  fct((x, y))
-  //
-  // A trailing comma is disallowed in an unparenthesized tuple.
-  // This prevents bugs where a one-element tuple is surprisingly created:
-  //   e.g. foo = f(x),
-  private Expression parseExpression() {
-    Expression e = parseTest();
-    if (token.kind != TokenKind.COMMA) {
-      return e;
-    }
-
-    // unparenthesized tuple
-    List<Expression> elems = new ArrayList<>();
-    elems.add(e);
-    parseExprList(elems, /*trailingCommaAllowed=*/ false);
-    return new ListExpression(locs, /*isTuple=*/ true, -1, elems, -1);
-  }
-
-  @FormatMethod
-  private void reportError(int offset, String format, Object... args) {
-    errorsCount++;
-    // Limit the number of reported errors to avoid spamming output.
-    if (errorsCount <= 5) {
-      Location location = locs.getLocation(offset);
-      errors.add(new SyntaxError(location, String.format(format, args)));
-    }
-  }
-
-  private void syntaxError(String message) {
-    if (!recoveryMode) {
-      if (token.kind == TokenKind.INDENT) {
-        reportError(token.start, "indentation error");
-      } else {
-        reportError(
-            token.start, "syntax error at '%s': %s", tokenString(token.kind, token.value), message);
-      }
-      recoveryMode = true;
-    }
-  }
-
-  // Consumes the current token and returns its position, like nextToken.
-  // Reports a syntax error if the new token is not of the expected kind.
-  private int expect(TokenKind kind) {
-    if (token.kind != kind) {
-      syntaxError("expected " + kind);
-    }
-    return nextToken();
-  }
-
-  // Like expect, but stops recovery mode if the token was expected.
-  private int expectAndRecover(TokenKind kind) {
-    if (token.kind != kind) {
-      syntaxError("expected " + kind);
-    } else {
-      recoveryMode = false;
-    }
-    return nextToken();
-  }
-
-  // Consumes tokens past the first token belonging to terminatingTokens.
-  // It returns the end offset of the terminating token.
-  // TODO(adonovan): always used with makeErrorExpression. Combine and simplify.
-  private int syncPast(EnumSet<TokenKind> terminatingTokens) {
-    Preconditions.checkState(terminatingTokens.contains(TokenKind.EOF));
-    while (!terminatingTokens.contains(token.kind)) {
-      nextToken();
-    }
-    int end = token.end;
-    // read past the synchronization token
-    nextToken();
-    return end;
-  }
-
-  /**
-   * Consume tokens until we reach the first token that has a kind that is in
-   * the set of terminatingTokens.
-   * @param terminatingTokens
-   * @return the end offset of the terminating token.
-   */
-  private int syncTo(EnumSet<TokenKind> terminatingTokens) {
-    // EOF must be in the set to prevent an infinite loop
-    Preconditions.checkState(terminatingTokens.contains(TokenKind.EOF));
-    // read past the problematic token
-    int previous = token.end;
-    nextToken();
-    int current = previous;
-    while (!terminatingTokens.contains(token.kind)) {
-      nextToken();
-      previous = current;
-      current = token.end;
-    }
-    return previous;
-  }
-
-  // Keywords that exist in Python and that we don't parse.
-  private static final EnumSet<TokenKind> FORBIDDEN_KEYWORDS =
-      EnumSet.of(
-          TokenKind.AS,
-          TokenKind.ASSERT,
-          TokenKind.CLASS,
-          TokenKind.DEL,
-          TokenKind.EXCEPT,
-          TokenKind.FINALLY,
-          TokenKind.FROM,
-          TokenKind.GLOBAL,
-          TokenKind.IMPORT,
-          TokenKind.IS,
-          TokenKind.LAMBDA,
-          TokenKind.NONLOCAL,
-          TokenKind.RAISE,
-          TokenKind.TRY,
-          TokenKind.WITH,
-          TokenKind.WHILE,
-          TokenKind.YIELD);
-
-  private void checkForbiddenKeywords() {
-    if (!FORBIDDEN_KEYWORDS.contains(token.kind)) {
-      return;
-    }
-    String error;
-    switch (token.kind) {
-      case ASSERT: error = "'assert' not supported, use 'fail' instead"; break;
-      case DEL:
-        error = "'del' not supported, use '.pop()' to delete an item from a dictionary or a list";
-        break;
-      case IMPORT: error = "'import' not supported, use 'load' instead"; break;
-      case IS: error = "'is' not supported, use '==' instead"; break;
-      case LAMBDA: error = "'lambda' not supported, declare a function instead"; break;
-      case RAISE: error = "'raise' not supported, use 'fail' instead"; break;
-      case TRY: error = "'try' not supported, all exceptions are fatal"; break;
-      case WHILE: error = "'while' not supported, use 'for' instead"; break;
-      default:
-        error = "keyword '" + token.kind + "' not supported";
-        break;
-    }
-    reportError(token.start, "%s", error);
-  }
-
-  private int nextToken() {
-    int prev = token.start;
-    if (token.kind != TokenKind.EOF) {
-      lexer.nextToken();
-    }
-    checkForbiddenKeywords();
-    // TODO(adonovan): move this to lexer so we see the first token too.
-    if (DEBUGGING) {
-      System.err.print(tokenString(token.kind, token.value));
-    }
-    return prev;
-  }
-
-  // Returns an "Identifier" whose content is the input from start to end.
-  private Identifier makeErrorExpression(int start, int end) {
-    // It's tempting to define a dedicated BadExpression type,
-    // but it is convenient for parseIdent to return an Identifier
-    // even when it fails.
-    return new Identifier(locs, lexer.bufferSlice(start, end), start);
-  }
-
-
-  // arg = IDENTIFIER '=' test
-  //     | expr
-  //     | *args
-  //     | **kwargs
-  private Argument parseArgument() {
-    Expression expr;
-
-    // parse **expr
-    if (token.kind == TokenKind.STAR_STAR) {
-      int starStarOffset = nextToken();
-      expr = parseTest();
-      return new Argument.StarStar(locs, starStarOffset, expr);
-    }
-
-    // parse *expr
-    if (token.kind == TokenKind.STAR) {
-      int starOffset = nextToken();
-      expr = parseTest();
-      return new Argument.Star(locs, starOffset, expr);
-    }
-
-    // IDENTIFIER  or  IDENTIFIER = test
-    expr = parseTest();
-    if (expr instanceof Identifier) {
-      Identifier id = (Identifier) expr;
-      // parse a named argument
-      if (token.kind == TokenKind.EQUALS) {
-        nextToken();
-        Expression arg = parseTest();
-        return new Argument.Keyword(locs, id, arg);
-      }
-    }
-
-    // parse a positional argument
-    return new Argument.Positional(locs, expr);
-  }
-
-  // arg = IDENTIFIER '=' test
-  //     | IDENTIFIER
-  private Parameter parseFunctionParameter() {
-    // **kwargs
-    if (token.kind == TokenKind.STAR_STAR) {
-      int starStarOffset = nextToken();
-      Identifier id = parseIdent();
-      return new Parameter.StarStar(locs, starStarOffset, id);
-    }
-
-    // * or *args
-    if (token.kind == TokenKind.STAR) {
-      int starOffset = nextToken();
-      if (token.kind == TokenKind.IDENTIFIER) {
-        Identifier id = parseIdent();
-        return new Parameter.Star(locs, starOffset, id);
-      }
-      return new Parameter.Star(locs, starOffset, null);
-    }
-
-    // name=default
-    Identifier id = parseIdent();
-    if (token.kind == TokenKind.EQUALS) {
-      nextToken(); // TODO: save token pos?
-      Expression expr = parseTest();
-      return new Parameter.Optional(locs, id, expr);
-    }
-
-    // name
-    return new Parameter.Mandatory(locs, id);
-  }
-
-  // call_suffix = '(' arg_list? ')'
-  private Expression parseCallSuffix(Expression fn) {
-    ImmutableList<Argument> args = ImmutableList.of();
-    int lparenOffset = expect(TokenKind.LPAREN);
-    if (token.kind != TokenKind.RPAREN) {
-      args = parseArguments(); // (includes optional trailing comma)
-    }
-    int rparenOffset = expect(TokenKind.RPAREN);
-    return new CallExpression(locs, fn, locs.getLocation(lparenOffset), args, rparenOffset);
-  }
-
-  // Parse a list of call arguments.
-  //
-  // arg_list = ( (arg ',')* arg ','? )?
-  private ImmutableList<Argument> parseArguments() {
-    boolean seenArg = false;
-    ImmutableList.Builder<Argument> list = ImmutableList.builder();
-    while (token.kind != TokenKind.RPAREN && token.kind != TokenKind.EOF) {
-      if (seenArg) {
-        expect(TokenKind.COMMA);
-        // If nonempty, the list may end with a comma.
-        if (token.kind == TokenKind.RPAREN) {
-          break;
-        }
-      }
-      list.add(parseArgument());
-      seenArg = true;
-    }
-    return list.build();
-  }
-
-  // selector_suffix = '.' IDENTIFIER
-  private Expression parseSelectorSuffix(Expression e) {
-    int dotOffset = expect(TokenKind.DOT);
-    if (token.kind == TokenKind.IDENTIFIER) {
-      Identifier id = parseIdent();
-      return new DotExpression(locs, e, dotOffset, id);
-    }
-
-    syntaxError("expected identifier after dot");
-    syncTo(EXPR_TERMINATOR_SET);
-    return e;
-  }
-
-  // expr_list parses a comma-separated list of expression. It assumes that the
-  // first expression was already parsed, so it starts with a comma.
-  // It is used to parse tuples and list elements.
-  //
-  // expr_list = ( ',' expr )* ','?
-  private void parseExprList(List<Expression> list, boolean trailingCommaAllowed) {
-    //  terminating tokens for an expression list
-    while (token.kind == TokenKind.COMMA) {
-      expect(TokenKind.COMMA);
-      if (EXPR_LIST_TERMINATOR_SET.contains(token.kind)) {
-        if (!trailingCommaAllowed) {
-          reportError(token.start, "Trailing comma is allowed only in parenthesized tuples.");
-        }
-        break;
-      }
-      list.add(parseTest());
-    }
-  }
-
-  // dict_entry_list = ( (dict_entry ',')* dict_entry ','? )?
-  private List<DictExpression.Entry> parseDictEntryList() {
-    List<DictExpression.Entry> list = new ArrayList<>();
-    // the terminating token for a dict entry list
-    while (token.kind != TokenKind.RBRACE) {
-      list.add(parseDictEntry());
-      if (token.kind == TokenKind.COMMA) {
-        nextToken();
-      } else {
-        break;
-      }
-    }
-    return list;
-  }
-
-  // dict_entry = test ':' test
-  private DictExpression.Entry parseDictEntry() {
-    Expression key = parseTest();
-    int colonOffset = expect(TokenKind.COLON);
-    Expression value = parseTest();
-    return new DictExpression.Entry(locs, key, colonOffset, value);
-  }
-
-  // expr = STRING
-  private StringLiteral parseStringLiteral() {
-    Preconditions.checkState(token.kind == TokenKind.STRING);
-    StringLiteral literal =
-        new StringLiteral(locs, token.start, intern((String) token.value), token.end);
-    nextToken();
-    if (token.kind == TokenKind.STRING) {
-      reportError(token.start, "Implicit string concatenation is forbidden, use the + operator");
-    }
-    return literal;
-  }
-
-  //  primary = INTEGER
-  //          | STRING
-  //          | IDENTIFIER
-  //          | list_expression
-  //          | '(' ')'                    // a tuple with zero elements
-  //          | '(' expr ')'               // a parenthesized expression
-  //          | dict_expression
-  //          | '-' primary_with_suffix
-  private Expression parsePrimary() {
-    switch (token.kind) {
-      case INT:
-        {
-          IntegerLiteral literal =
-              new IntegerLiteral(locs, token.raw, token.start, (Integer) token.value);
-          nextToken();
-          return literal;
-        }
-
-      case STRING:
-        return parseStringLiteral();
-
-      case IDENTIFIER:
-        return parseIdent();
-
-      case LBRACKET: // [...]
-        return parseListMaker();
-
-      case LBRACE: // {...}
-        return parseDictExpression();
-
-      case LPAREN:
-        {
-          int lparenOffset = nextToken();
-
-          // empty tuple: ()
-          if (token.kind == TokenKind.RPAREN) {
-            int rparen = nextToken();
-            return new ListExpression(
-                locs, /*isTuple=*/ true, lparenOffset, ImmutableList.of(), rparen);
-          }
-
-          Expression e = parseTest();
-
-          // parenthesized expression: (e)
-          // TODO(adonovan): materialize paren expressions (for fidelity).
-          if (token.kind == TokenKind.RPAREN) {
-            nextToken();
-            return e;
-          }
-
-          // non-empty tuple: (e,) or (e, ..., e)
-          if (token.kind == TokenKind.COMMA) {
-            List<Expression> elems = new ArrayList<>();
-            elems.add(e);
-            parseExprList(elems, /*trailingCommaAllowed=*/ true);
-            int rparenOffset = expect(TokenKind.RPAREN);
-            return new ListExpression(locs, /*isTuple=*/ true, lparenOffset, elems, rparenOffset);
-          }
-
-          expect(TokenKind.RPAREN);
-          int end = syncTo(EXPR_TERMINATOR_SET);
-          return makeErrorExpression(lparenOffset, end);
-        }
-
-      case MINUS:
-      case PLUS:
-      case TILDE:
-        {
-          TokenKind op = token.kind;
-          int offset = nextToken();
-          Expression x = parsePrimaryWithSuffix();
-          return new UnaryOperatorExpression(locs, op, offset, x);
-        }
-
-      default:
-        {
-          int start = token.start;
-          syntaxError("expected expression");
-          int end = syncTo(EXPR_TERMINATOR_SET);
-          return makeErrorExpression(start, end);
-        }
-    }
-  }
-
-  // primary_with_suffix = primary (selector_suffix | slice_suffix | call_suffix)*
-  private Expression parsePrimaryWithSuffix() {
-    Expression e = parsePrimary();
-    while (true) {
-      if (token.kind == TokenKind.DOT) {
-        e = parseSelectorSuffix(e);
-      } else if (token.kind == TokenKind.LBRACKET) {
-        e = parseSliceSuffix(e);
-      } else if (token.kind == TokenKind.LPAREN) {
-        e = parseCallSuffix(e);
-      } else {
-        return e;
-      }
-    }
-  }
-
-  // slice_suffix = '[' expr? ':' expr?  ':' expr? ']'
-  //              | '[' expr? ':' expr? ']'
-  //              | '[' expr ']'
-  private Expression parseSliceSuffix(Expression e) {
-    int lbracketOffset = expect(TokenKind.LBRACKET);
-    Expression start = null;
-    Expression end = null;
-    Expression step = null;
-
-    if (token.kind != TokenKind.COLON) {
-      start = parseExpression();
-
-      // index x[i]
-      if (token.kind == TokenKind.RBRACKET) {
-        int rbracketOffset = expect(TokenKind.RBRACKET);
-        return new IndexExpression(locs, e, lbracketOffset, start, rbracketOffset);
-      }
-    }
-
-    // slice or substring x[i:j] or x[i:j:k]
-    expect(TokenKind.COLON);
-    if (token.kind != TokenKind.COLON && token.kind != TokenKind.RBRACKET) {
-      end = parseTest();
-    }
-    if (token.kind == TokenKind.COLON) {
-      expect(TokenKind.COLON);
-      if (token.kind != TokenKind.RBRACKET) {
-        step = parseTest();
-      }
-    }
-    int rbracketOffset = expect(TokenKind.RBRACKET);
-    return new SliceExpression(locs, e, lbracketOffset, start, end, step, rbracketOffset);
-  }
-
-  // Equivalent to 'exprlist' rule in Python grammar.
-  // loop_variables = primary_with_suffix ( ',' primary_with_suffix )* ','?
-  private Expression parseForLoopVariables() {
-    // We cannot reuse parseExpression because it would parse the 'in' operator.
-    // e.g.  "for i in e: pass"  -> we want to parse only "i" here.
-    Expression e1 = parsePrimaryWithSuffix();
-    if (token.kind != TokenKind.COMMA) {
-      return e1;
-    }
-
-    // unparenthesized tuple
-    List<Expression> elems = new ArrayList<>();
-    elems.add(e1);
-    while (token.kind == TokenKind.COMMA) {
-      expect(TokenKind.COMMA);
-      if (EXPR_LIST_TERMINATOR_SET.contains(token.kind)) {
-        break;
-      }
-      elems.add(parsePrimaryWithSuffix());
-    }
-    return new ListExpression(locs, /*isTuple=*/ true, -1, elems, -1);
-  }
-
-  // comprehension_suffix = 'FOR' loop_variables 'IN' expr comprehension_suffix
-  //                      | 'IF' expr comprehension_suffix
-  //                      | ']' | '}'
-  private Expression parseComprehensionSuffix(int loffset, Node body, TokenKind closingBracket) {
-    ImmutableList.Builder<Comprehension.Clause> clauses = ImmutableList.builder();
-    while (true) {
-      if (token.kind == TokenKind.FOR) {
-        int forOffset = nextToken();
-        Expression vars = parseForLoopVariables();
-        expect(TokenKind.IN);
-        // The expression cannot be a ternary expression ('x if y else z') due to
-        // conflicts in Python grammar ('if' is used by the comprehension).
-        Expression seq = parseTest(0);
-        clauses.add(new Comprehension.For(locs, forOffset, vars, seq));
-      } else if (token.kind == TokenKind.IF) {
-        int ifOffset = nextToken();
-        // [x for x in li if 1, 2]  # parse error
-        // [x for x in li if (1, 2)]  # ok
-        Expression cond = parseTest(0);
-        clauses.add(new Comprehension.If(locs, ifOffset, cond));
-      } else if (token.kind == closingBracket) {
-        break;
-      } else {
-        syntaxError("expected '" + closingBracket + "', 'for' or 'if'");
-        int end = syncPast(LIST_TERMINATOR_SET);
-        return makeErrorExpression(loffset, end);
-      }
-    }
-
-    boolean isDict = closingBracket == TokenKind.RBRACE;
-    int roffset = expect(closingBracket);
-    return new Comprehension(locs, isDict, loffset, body, clauses.build(), roffset);
-  }
-
-  // list_maker = '[' ']'
-  //            | '[' expr ']'
-  //            | '[' expr expr_list ']'
-  //            | '[' expr comprehension_suffix ']'
-  private Expression parseListMaker() {
-    int lbracketOffset = expect(TokenKind.LBRACKET);
-    if (token.kind == TokenKind.RBRACKET) { // empty List
-      int rbracketOffset = nextToken();
-      return new ListExpression(
-          locs, /*isTuple=*/ false, lbracketOffset, ImmutableList.of(), rbracketOffset);
-    }
-
-    Expression expression = parseTest();
-    switch (token.kind) {
-      case RBRACKET:
-        // [e], singleton list
-        {
-          int rbracketOffset = nextToken();
-          return new ListExpression(
-              locs,
-              /*isTuple=*/ false,
-              lbracketOffset,
-              ImmutableList.of(expression),
-              rbracketOffset);
-        }
-
-      case FOR:
-        // [e for x in y], list comprehension
-        return parseComprehensionSuffix(lbracketOffset, expression, TokenKind.RBRACKET);
-
-      case COMMA:
-        // [e, ...], list expression
-        {
-          List<Expression> elems = new ArrayList<>();
-          elems.add(expression);
-          parseExprList(elems, /*trailingCommaAllowed=*/ true);
-          if (token.kind == TokenKind.RBRACKET) {
-            int rbracketOffset = nextToken();
-            return new ListExpression(
-                locs, /*isTuple=*/ false, lbracketOffset, elems, rbracketOffset);
-          }
-
-          expect(TokenKind.RBRACKET);
-          int end = syncPast(LIST_TERMINATOR_SET);
-          return makeErrorExpression(lbracketOffset, end);
-        }
-
-      default:
-        {
-          syntaxError("expected ',', 'for' or ']'");
-          int end = syncPast(LIST_TERMINATOR_SET);
-          return makeErrorExpression(lbracketOffset, end);
-        }
-    }
-  }
-
-  // dict_expression = '{' '}'
-  //                 | '{' dict_entry_list '}'
-  //                 | '{' dict_entry comprehension_suffix '}'
-  private Expression parseDictExpression() {
-    int lbraceOffset = expect(TokenKind.LBRACE);
-    if (token.kind == TokenKind.RBRACE) { // empty Dict
-      int rbraceOffset = nextToken();
-      return new DictExpression(locs, lbraceOffset, ImmutableList.of(), rbraceOffset);
-    }
-
-    DictExpression.Entry entry = parseDictEntry();
-    if (token.kind == TokenKind.FOR) {
-      // Dict comprehension
-      return parseComprehensionSuffix(lbraceOffset, entry, TokenKind.RBRACE);
-    }
-
-    List<DictExpression.Entry> entries = new ArrayList<>();
-    entries.add(entry);
-    if (token.kind == TokenKind.COMMA) {
-      expect(TokenKind.COMMA);
-      entries.addAll(parseDictEntryList());
-    }
-    if (token.kind == TokenKind.RBRACE) {
-      int rbraceOffset = nextToken();
-      return new DictExpression(locs, lbraceOffset, entries, rbraceOffset);
-    }
-
-    expect(TokenKind.RBRACE);
-    int end = syncPast(DICT_TERMINATOR_SET);
-    return makeErrorExpression(lbraceOffset, end);
-  }
-
-  private Identifier parseIdent() {
-    if (token.kind != TokenKind.IDENTIFIER) {
-      int start = token.start;
-      int end = expect(TokenKind.IDENTIFIER);
-      return makeErrorExpression(start, end);
-    }
-
-    String name = (String) token.value;
-    int offset = nextToken();
-    return new Identifier(locs, name, offset);
-  }
-
-  // binop_expression = binop_expression OP binop_expression
-  //                  | parsePrimaryWithSuffix
-  // This function takes care of precedence between operators (see operatorPrecedence for
-  // the order), and it assumes left-to-right associativity.
-  private Expression parseBinOpExpression(int prec) {
-    Expression x = parseTest(prec + 1);
-    // The loop is not strictly needed, but it prevents risks of stack overflow. Depth is
-    // limited to number of different precedence levels (operatorPrecedence.size()).
-    TokenKind lastOp = null;
-    for (;;) {
-      if (token.kind == TokenKind.NOT) {
-        // If NOT appears when we expect a binary operator, it must be followed by IN.
-        // Since the code expects every operator to be a single token, we push a NOT_IN token.
-        expect(TokenKind.NOT);
-        if (token.kind != TokenKind.IN) {
-          syntaxError("expected 'in'");
-        }
-        token.kind = TokenKind.NOT_IN;
-      }
-
-      TokenKind op = token.kind;
-      if (!operatorPrecedence.get(prec).contains(op)) {
-        return x;
-      }
-
-      // Operator '==' and other operators of the same precedence (e.g. '<', 'in')
-      // are not associative.
-      if (lastOp != null && operatorPrecedence.get(prec).contains(TokenKind.EQUALS_EQUALS)) {
-        reportError(
-            token.start,
-            "Operator '%s' is not associative with operator '%s'. Use parens.",
-            lastOp,
-            op);
-      }
-
-      int opOffset = nextToken();
-      Expression y = parseTest(prec + 1);
-      x = optimizeBinOpExpression(x, op, opOffset, y);
-      lastOp = op;
-    }
-  }
-
-  // Optimize binary expressions.
-  // string literal + string literal can be concatenated into one string literal
-  // so we don't have to do the expensive string concatenation at runtime.
-  private Expression optimizeBinOpExpression(
-      Expression x, TokenKind op, int opOffset, Expression y) {
-    if (op == TokenKind.PLUS && x instanceof StringLiteral && y instanceof StringLiteral) {
-      return new StringLiteral(
-          locs,
-          x.getStartOffset(),
-          intern(((StringLiteral) x).getValue() + ((StringLiteral) y).getValue()),
-          y.getEndOffset());
-    }
-    return new BinaryOperatorExpression(locs, x, op, opOffset, y);
-  }
-
-  // Parses a non-tuple expression ("test" in Python terminology).
-  private Expression parseTest() {
-    int start = token.start;
-    Expression expr = parseTest(0);
-    if (token.kind == TokenKind.IF) {
-      nextToken();
-      Expression condition = parseTest(0);
-      if (token.kind == TokenKind.ELSE) {
-        nextToken();
-        Expression elseClause = parseTest();
-        return new ConditionalExpression(locs, expr, condition, elseClause);
-      } else {
-        reportError(start, "missing else clause in conditional expression or semicolon before if");
-        return expr; // Try to recover from error: drop the if and the expression after it. Ouch.
-      }
-    }
-    return expr;
-  }
-
-  private Expression parseTest(int prec) {
-    if (prec >= operatorPrecedence.size()) {
-      return parsePrimaryWithSuffix();
-    }
-    if (token.kind == TokenKind.NOT && operatorPrecedence.get(prec).contains(TokenKind.NOT)) {
-      return parseNotExpression(prec);
-    }
-    return parseBinOpExpression(prec);
-  }
-
-  // not_expr = 'not' expr
-  private Expression parseNotExpression(int prec) {
-    int notOffset = expect(TokenKind.NOT);
-    Expression x = parseTest(prec);
-    return new UnaryOperatorExpression(locs, TokenKind.NOT, notOffset, x);
-  }
-
-  // file_input = ('\n' | stmt)* EOF
-  private ImmutableList<Statement> parseFileInput() {
-    ImmutableList.Builder<Statement> list = ImmutableList.builder();
-    try {
-      while (token.kind != TokenKind.EOF) {
-        if (token.kind == TokenKind.NEWLINE) {
-          expectAndRecover(TokenKind.NEWLINE);
-        } else if (recoveryMode) {
-          // If there was a parse error, we want to recover here
-          // before starting a new top-level statement.
-          syncTo(STATEMENT_TERMINATOR_SET);
-          recoveryMode = false;
-        } else {
-          parseStatement(list);
-        }
-      }
-    } catch (StackOverflowError ex) {
-      // JVM threads have very limited stack, and deeply nested inputs can
-      // easily cause the parser to consume all available stack. It is hard
-      // to anticipate all the possible recursions in the parser, especially
-      // when considering error recovery. Consider a long list of dicts:
-      // even if the intended parse tree has a depth of only two,
-      // if each dict contains a syntax error, the parser will go into recovery
-      // and may discard each dict's closing '}', turning a shallow tree
-      // into a deep one (see b/157470754).
-      //
-      // So, for robustness, the parser treats StackOverflowError as a parse
-      // error, exhorting the user to report a bug.
-      reportError(
-          token.end,
-          "internal error: stack overflow in Starlark parser. Please report the bug and include"
-              + " the text of %s.\n"
-              + "%s",
-          locs.file(),
-          Throwables.getStackTraceAsString(ex));
-    }
-    return list.build();
-  }
-
-  // load '(' STRING (COMMA [IDENTIFIER EQUALS] STRING)+ COMMA? ')'
-  private Statement parseLoadStatement() {
-    int loadOffset = expect(TokenKind.LOAD);
-    expect(TokenKind.LPAREN);
-    if (token.kind != TokenKind.STRING) {
-      // error: module is not a string literal.
-      StringLiteral module = new StringLiteral(locs, token.start, "", token.end);
-      expect(TokenKind.STRING);
-      return new LoadStatement(locs, loadOffset, module, ImmutableList.of(), token.end);
-    }
-
-    StringLiteral module = parseStringLiteral();
-    if (token.kind == TokenKind.RPAREN) {
-      syntaxError("expected at least one symbol to load");
-      return new LoadStatement(locs, loadOffset, module, ImmutableList.of(), token.end);
-    }
-    expect(TokenKind.COMMA);
-
-    ImmutableList.Builder<LoadStatement.Binding> bindings = ImmutableList.builder();
-    // At least one symbol is required.
-    parseLoadSymbol(bindings);
-    while (token.kind != TokenKind.RPAREN && token.kind != TokenKind.EOF) {
-      // A trailing comma is permitted after the last symbol.
-      expect(TokenKind.COMMA);
-      if (token.kind == TokenKind.RPAREN) {
-        break;
-      }
-      parseLoadSymbol(bindings);
-    }
-
-    int rparen = expect(TokenKind.RPAREN);
-    return new LoadStatement(locs, loadOffset, module, bindings.build(), rparen);
-  }
-
-  /**
-   * Parses the next symbol argument of a load statement and puts it into the output map.
-   *
-   * <p>The symbol is either "name" (STRING) or name = "declared" (IDENTIFIER EQUALS STRING). If no
-   * alias is used, "name" and "declared" will be identical. "Declared" refers to the original name
-   * in the Bazel file that should be loaded, while "name" will be the key of the entry in the map.
-   */
-  private void parseLoadSymbol(ImmutableList.Builder<LoadStatement.Binding> symbols) {
-    if (token.kind != TokenKind.STRING && token.kind != TokenKind.IDENTIFIER) {
-      syntaxError("expected either a literal string or an identifier");
-      return;
-    }
-
-    String name = (String) token.value;
-    int nameOffset = token.start + (token.kind == TokenKind.STRING ? 1 : 0);
-    Identifier local = new Identifier(locs, name, nameOffset);
-
-    Identifier original;
-    if (token.kind == TokenKind.STRING) {
-      // load(..., "name")
-      original = local;
-    } else {
-      // load(..., local = "orig")
-      // The name "orig" is morally an identifier but, for legacy reasons (specifically,
-      // a partial implementation of Starlark embedded in a Python interpreter used by
-      // tests of Blaze), it must be a quoted string literal.
-      expect(TokenKind.IDENTIFIER);
-      expect(TokenKind.EQUALS);
-      if (token.kind != TokenKind.STRING) {
-        syntaxError("expected string");
-        return;
-      }
-      original = new Identifier(locs, (String) token.value, token.start + 1);
-    }
-    nextToken();
-    symbols.add(new LoadStatement.Binding(local, original));
-  }
-
-  // simple_stmt = small_stmt (';' small_stmt)* ';'? NEWLINE
-  private void parseSimpleStatement(ImmutableList.Builder<Statement> list) {
-    list.add(parseSmallStatement());
-
-    while (token.kind == TokenKind.SEMI) {
-      nextToken();
-      if (token.kind == TokenKind.NEWLINE) {
-        break;
-      }
-      list.add(parseSmallStatement());
-    }
-    expectAndRecover(TokenKind.NEWLINE);
-  }
-
-  //     small_stmt = assign_stmt
-  //                | expr
-  //                | load_stmt
-  //                | return_stmt
-  //                | BREAK | CONTINUE | PASS
-  //
-  //     assign_stmt = expr ('=' | augassign) expr
-  //
-  //     augassign = '+=' | '-=' | '*=' | '/=' | '%=' | '//=' | '&=' | '|=' | '^=' |'<<=' | '>>='
-  private Statement parseSmallStatement() {
-    // return
-    if (token.kind == TokenKind.RETURN) {
-      return parseReturnStatement();
-    }
-
-    // control flow
-    if (token.kind == TokenKind.BREAK
-        || token.kind == TokenKind.CONTINUE
-        || token.kind == TokenKind.PASS) {
-      TokenKind kind = token.kind;
-      int offset = nextToken();
-      return new FlowStatement(locs, kind, offset);
-    }
-
-    // load
-    if (token.kind == TokenKind.LOAD) {
-      return parseLoadStatement();
-    }
-
-    Expression lhs = parseExpression();
-
-    // lhs = rhs  or  lhs += rhs
-    TokenKind op = augmentedAssignments.get(token.kind);
-    if (token.kind == TokenKind.EQUALS || op != null) {
-      int opOffset = nextToken();
-      Expression rhs = parseExpression();
-      // op == null for ordinary assignment. TODO(adonovan): represent as EQUALS.
-      return new AssignmentStatement(locs, lhs, op, opOffset, rhs);
-    } else {
-      return new ExpressionStatement(locs, lhs);
-    }
-  }
-
-  // if_stmt = IF expr ':' suite [ELIF expr ':' suite]* [ELSE ':' suite]?
-  private IfStatement parseIfStatement() {
-    int ifOffset = expect(TokenKind.IF);
-    Expression cond = parseTest();
-    expect(TokenKind.COLON);
-    ImmutableList<Statement> body = parseSuite();
-    IfStatement ifStmt = new IfStatement(locs, TokenKind.IF, ifOffset, cond, body);
-    IfStatement tail = ifStmt;
-    while (token.kind == TokenKind.ELIF) {
-      int elifOffset = expect(TokenKind.ELIF);
-      cond = parseTest();
-      expect(TokenKind.COLON);
-      body = parseSuite();
-      IfStatement elif = new IfStatement(locs, TokenKind.ELIF, elifOffset, cond, body);
-      tail.setElseBlock(ImmutableList.of(elif));
-      tail = elif;
-    }
-    if (token.kind == TokenKind.ELSE) {
-      expect(TokenKind.ELSE);
-      expect(TokenKind.COLON);
-      body = parseSuite();
-      tail.setElseBlock(body);
-    }
-    return ifStmt;
-  }
-
-  // for_stmt = FOR IDENTIFIER IN expr ':' suite
-  private ForStatement parseForStatement() {
-    int forOffset = expect(TokenKind.FOR);
-    Expression vars = parseForLoopVariables();
-    expect(TokenKind.IN);
-    Expression collection = parseExpression();
-    expect(TokenKind.COLON);
-    ImmutableList<Statement> body = parseSuite();
-    return new ForStatement(locs, forOffset, vars, collection, body);
-  }
-
-  // def_stmt = DEF IDENTIFIER '(' arguments ')' ':' suite
-  private DefStatement parseDefStatement() {
-    int defOffset = expect(TokenKind.DEF);
-    Identifier ident = parseIdent();
-    expect(TokenKind.LPAREN);
-    ImmutableList<Parameter> params = parseParameters();
-    expect(TokenKind.RPAREN);
-    expect(TokenKind.COLON);
-    ImmutableList<Statement> block = parseSuite();
-    return new DefStatement(locs, defOffset, ident, params, block);
-  }
-
-  // Parse a list of function parameters.
-  // Validation of parameter ordering and uniqueness is the job of the Resolver.
-  private ImmutableList<Parameter> parseParameters() {
-    boolean hasParam = false;
-    ImmutableList.Builder<Parameter> list = ImmutableList.builder();
-
-    while (token.kind != TokenKind.RPAREN && token.kind != TokenKind.EOF) {
-      if (hasParam) {
-        expect(TokenKind.COMMA);
-        // The list may end with a comma.
-        if (token.kind == TokenKind.RPAREN) {
-          break;
-        }
-      }
-      Parameter param = parseFunctionParameter();
-      hasParam = true;
-      list.add(param);
-    }
-    return list.build();
-  }
-
-  // suite is typically what follows a colon (e.g. after def or for).
-  // suite = simple_stmt
-  //       | NEWLINE INDENT stmt+ OUTDENT
-  private ImmutableList<Statement> parseSuite() {
-    ImmutableList.Builder<Statement> list = ImmutableList.builder();
-    if (token.kind == TokenKind.NEWLINE) {
-      expect(TokenKind.NEWLINE);
-      if (token.kind != TokenKind.INDENT) {
-        reportError(token.start, "expected an indented block");
-        return list.build();
-      }
-      expect(TokenKind.INDENT);
-      while (token.kind != TokenKind.OUTDENT && token.kind != TokenKind.EOF) {
-        parseStatement(list);
-      }
-      expectAndRecover(TokenKind.OUTDENT);
-    } else {
-      parseSimpleStatement(list);
-    }
-    return list.build();
-  }
-
-  // return_stmt = RETURN [expr]
-  private ReturnStatement parseReturnStatement() {
-    int returnOffset = expect(TokenKind.RETURN);
-
-    Expression result = null;
-    if (!STATEMENT_TERMINATOR_SET.contains(token.kind)) {
-      result = parseExpression();
-    }
-    return new ReturnStatement(locs, returnOffset, result);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ParserInput.java b/src/main/java/com/google/devtools/build/lib/syntax/ParserInput.java
deleted file mode 100644
index c8da69c..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ParserInput.java
+++ /dev/null
@@ -1,109 +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 java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-/**
- * The apparent name and contents of a source file, for consumption by the parser. The file name
- * appears in the location information in the syntax tree, and in error messages, but the Starlark
- * interpreter will not attempt to open the file. However, the default behavior of {@link
- * EvalException#getMessageWithStack} attempts to read the specified file when formatting a stack
- * trace.
- *
- * <p>The parser consumes a stream of chars (UTF-16 codes), and the syntax positions reported by
- * {@link Node#getStartOffset} and {@link Location.column} are effectively indices into a char
- * array.
- */
-public final class ParserInput {
-
-  private final String file;
-  private final char[] content;
-
-  private ParserInput(char[] content, String file) {
-    this.content = content;
-    this.file = Preconditions.checkNotNull(file);
-  }
-
-  /** Returns the content of the input source. Callers must not modify the result. */
-  char[] getContent() {
-    return content;
-  }
-
-  /** Returns the apparent file name of the input source. */
-  public String getFile() {
-    return file;
-  }
-
-  /**
-   * Returns an input source that uses the name and content of the specified UTF-8-encoded text
-   * file.
-   */
-  public static ParserInput readFile(String file) throws IOException {
-    byte[] utf8 = Files.readAllBytes(Paths.get(file));
-    return fromUTF8(utf8, file);
-  }
-
-  /** Returns an unnamed input source that reads from a list of strings, joined by newlines. */
-  public static ParserInput fromLines(String... lines) {
-    return fromString(Joiner.on("\n").join(lines), "");
-  }
-
-  /**
-   * Returns an input source that reads from a UTF-8-encoded byte array. The caller is free to
-   * subsequently mutate the array.
-   */
-  public static ParserInput fromUTF8(byte[] bytes, String file) {
-    CharBuffer cb = UTF_8.decode(ByteBuffer.wrap(bytes));
-    char[] utf16 = new char[cb.length()];
-    cb.get(utf16);
-    return fromCharArray(utf16, file);
-  }
-
-  /**
-   * Returns an input source that reads from a Latin1-encoded byte array. The caller is free to
-   * subsequently mutate the array.
-   *
-   * <p>This function exists to support legacy uses of Latin1 in Bazel. Do not use Latin1 in new
-   * applications. (Consider this deprecated, without the fussy warnings.)
-   */
-  public static ParserInput fromLatin1(byte[] bytes, String file) {
-    char[] chars = new char[bytes.length];
-    for (int i = 0; i < bytes.length; i++) {
-      chars[i] = (char) (0xff & bytes[i]);
-    }
-    return new ParserInput(chars, file);
-  }
-
-  /** Returns an input source that reads from the given string. */
-  public static ParserInput fromString(String content, String file) {
-    return fromCharArray(content.toCharArray(), file);
-  }
-
-  /**
-   * Returns an input source that reads from the given char array. The caller must not subsequently
-   * modify the array.
-   */
-  public static ParserInput fromCharArray(char[] content, String file) {
-    return new ParserInput(content, file);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Printer.java b/src/main/java/com/google/devtools/build/lib/syntax/Printer.java
deleted file mode 100644
index 0d1766a..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Printer.java
+++ /dev/null
@@ -1,359 +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 java.util.Arrays;
-import java.util.IllegalFormatException;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingFormatWidthException;
-
-/**
- * A printer of Starlark values.
- *
- * <p>Subclasses may override methods such as {@link #repr} and {@link #printList} to alter the
- * formatting behavior.
- */
-// TODO(adonovan): disallow printing of objects that are not Starlark values.
-public class Printer {
-
-  private final StringBuilder buffer;
-
-  // Stack of values in the middle of being printed.
-  // Each renders as "..." if recursively encountered,
-  // indicating a cycle.
-  private Object[] stack;
-  private int depth;
-
-  /** Creates a printer that writes to the given buffer. */
-  public Printer(StringBuilder buffer) {
-    this.buffer = buffer;
-  }
-
-  /** Creates a printer that uses a fresh buffer. */
-  public Printer() {
-    this(new StringBuilder());
-  }
-
-  /** Appends a char to the printer's buffer */
-  public final Printer append(char c) {
-    buffer.append(c);
-    return this;
-  }
-
-  /** Appends a char sequence to the printer's buffer */
-  public final Printer append(CharSequence s) {
-    buffer.append(s);
-    return this;
-  }
-
-  /** Appends a char subsequence to the printer's buffer */
-  public final Printer append(CharSequence s, int start, int end) {
-    buffer.append(s, start, end);
-    return this;
-  }
-
-  /**
-   * Appends a list to the printer's buffer. List elements are rendered with {@code repr}.
-   *
-   * <p>May be overridden by subclasses.
-   *
-   * @param list the list of objects to repr (each as with repr)
-   * @param before a string to print before the list items, e.g. an opening bracket
-   * @param separator a separator to print between items
-   * @param after a string to print after the list items, e.g. a closing bracket
-   */
-  public Printer printList(Iterable<?> list, String before, String separator, String after) {
-    this.append(before);
-    String sep = "";
-    for (Object elem : list) {
-      this.append(sep);
-      sep = separator;
-      this.repr(elem);
-    }
-    return this.append(after);
-  }
-
-  @Override
-  public final String toString() {
-    return buffer.toString();
-  }
-
-  /**
-   * Appends the {@code StarlarkValue.debugPrint} representation of a value (as used by the Starlark
-   * {@code print} statement) to the printer's buffer.
-   *
-   * <p>Implementations of StarlarkValue may define their own behavior of {@code debugPrint}.
-   */
-  public Printer debugPrint(Object o) {
-    if (o instanceof StarlarkValue) {
-      ((StarlarkValue) o).debugPrint(this);
-      return this;
-    }
-
-    return this.str(o);
-  }
-
-  /**
-   * Appends the {@code StarlarkValue.str} representation of a value to the printer's buffer. Unlike
-   * {@code repr(x)}, it does not quote strings at top level, though strings and other values
-   * appearing as elements of other structures are quoted as if by {@code repr}.
-   *
-   * <p>Implementations of StarlarkValue may define their own behavior of {@code str}.
-   */
-  public Printer str(Object o) {
-    if (o instanceof String) {
-      return this.append((String) o);
-
-    } else if (o instanceof StarlarkValue) {
-      ((StarlarkValue) o).str(this);
-      return this;
-
-    } else {
-      return this.repr(o);
-    }
-  }
-
-  /**
-   * Appends the {@code StarlarkValue.repr} (quoted) representation of a value to the printer's
-   * buffer. The quoted form is often a Starlark expression that evaluates to the value.
-   *
-   * <p>Implementations of StarlarkValue may define their own behavior of {@code repr}.
-   *
-   * <p>Cyclic values are rendered as {@code ...} if they are recursively encountered by the same
-   * printer. (Implementations of {@link StarlarkValue#repr} should avoid calling {@code
-   * Starlark#repr}, as it creates another printer, which hide cycles from the cycle detector.)
-   *
-   * <p>In addition to Starlark values, {@code repr} also prints instances of classes Map, List,
-   * Map.Entry, or Class. All other values are formatted using their {@code toString} method.
-   * TODO(adonovan): disallow that.
-   */
-  public Printer repr(Object o) {
-    // atomic values
-    if (o == null) {
-      // Java null is not a valid Starlark value, but sometimes printers are used on non-Starlark
-      // values such as Locations or Nodes.
-      return this.append("null");
-
-    } else if (o instanceof String) {
-      appendQuoted((String) o);
-      return this;
-
-    } else if (o instanceof Integer) {
-      this.buffer.append((int) o);
-      return this;
-
-    } else if (o instanceof Boolean) {
-      this.append(((boolean) o) ? "True" : "False");
-      return this;
-
-    } else if (o instanceof Class) { // (a non-Starlark value)
-      this.append(Starlark.classType((Class<?>) o));
-      return this;
-    }
-
-    // compound values
-
-    if (!push(o)) {
-      return this.append("..."); // elided cycle
-    }
-    try {
-      if (o instanceof StarlarkValue) {
-        ((StarlarkValue) o).repr(this);
-
-        // -- non-Starlark values --
-
-      } else if (o instanceof Map) {
-        Map<?, ?> dict = (Map<?, ?>) o;
-        this.printList(dict.entrySet(), "{", ", ", "}");
-
-      } else if (o instanceof List) {
-        this.printList((List) o, "[", ", ", "]");
-
-      } else if (o instanceof Map.Entry) {
-        Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
-        this.repr(entry.getKey());
-        this.append(": ");
-        this.repr(entry.getValue());
-
-      } else {
-        // All other non-Starlark Java values (e.g. Node, Location).
-        // Starlark code cannot access values of o that would reach here,
-        // and native code is already trusted to be deterministic.
-        this.append(o.toString());
-      }
-    } finally {
-      pop();
-    }
-
-    return this;
-  }
-
-  private Printer appendQuoted(String s) {
-    this.append('"');
-    int len = s.length();
-    for (int i = 0; i < len; i++) {
-      char c = s.charAt(i);
-      escapeCharacter(c);
-    }
-    return this.append('"');
-  }
-
-  private Printer backslashChar(char c) {
-    return this.append('\\').append(c);
-  }
-
-  private Printer escapeCharacter(char c) {
-    if (c == '"') {
-      return backslashChar(c);
-    }
-    switch (c) {
-      case '\\':
-        return backslashChar('\\');
-      case '\r':
-        return backslashChar('r');
-      case '\n':
-        return backslashChar('n');
-      case '\t':
-        return backslashChar('t');
-      default:
-        if (c < 32) {
-          // TODO(bazel-team): support \x escapes
-          return this.append(String.format("\\x%02x", (int) c));
-        }
-        return this.append(c); // no need to support UTF-8
-    }
-  }
-
-  // Reports whether x is already present on the visitation stack, pushing it if not.
-  private boolean push(Object x) {
-    // cyclic?
-    for (int i = 0; i < depth; i++) {
-      if (x == stack[i]) {
-        return false;
-      }
-    }
-
-    if (stack == null) {
-      this.stack = new Object[4];
-    } else if (depth == stack.length) {
-      this.stack = Arrays.copyOf(stack, 2 * stack.length);
-    }
-    this.stack[depth++] = x;
-    return true;
-  }
-
-  private void pop() {
-    this.stack[--depth] = null;
-  }
-
-  /**
-   * Appends a string, formatted as if by Starlark's {@code str % tuple} operator, to the printer's
-   * buffer.
-   *
-   * <p>Supported conversions:
-   *
-   * <ul>
-   *   <li>{@code %s} (convert as if by {@code str()})
-   *   <li>{@code %r} (convert as if by {@code repr()})
-   *   <li>{@code %d} (convert an integer to its decimal representation)
-   * </ul>
-   *
-   * To encode a literal percent character, escape it as {@code %%}. It is an error to have a
-   * non-escaped {@code %} at the end of the string or followed by any character not listed above.
-   *
-   * @param format the format string
-   * @param arguments an array containing arguments to substitute into the format operators in order
-   * @throws IllegalFormatException if the format string is invalid or the arguments do not match it
-   */
-  public static void format(Printer printer, String format, Object... arguments) {
-    formatWithList(printer, format, Arrays.asList(arguments));
-  }
-
-  /** Same as {@link #format}, but with a list instead of variadic args. */
-  public static void formatWithList(Printer printer, String pattern, List<?> arguments) {
-    // N.B. MissingFormatWidthException is the only kind of IllegalFormatException
-    // whose constructor can take and display arbitrary error message, hence its use below.
-    // TODO(adonovan): this suggests we're using the wrong exception. Throw IAE?
-
-    int length = pattern.length();
-    int argLength = arguments.size();
-    int i = 0; // index of next character in pattern
-    int a = 0; // index of next argument in arguments
-
-    while (i < length) {
-      int p = pattern.indexOf('%', i);
-      if (p == -1) {
-        printer.append(pattern, i, length);
-        break;
-      }
-      if (p > i) {
-        printer.append(pattern, i, p);
-      }
-      if (p == length - 1) {
-        throw new MissingFormatWidthException(
-            "incomplete format pattern ends with %: " + Starlark.repr(pattern));
-      }
-      char directive = pattern.charAt(p + 1);
-      i = p + 2;
-      switch (directive) {
-        case '%':
-          printer.append('%');
-          continue;
-        case 'd':
-        case 'r':
-        case 's':
-          if (a >= argLength) {
-            throw new MissingFormatWidthException(
-                "not enough arguments for format pattern "
-                    + Starlark.repr(pattern)
-                    + ": "
-                    + Starlark.repr(Tuple.copyOf(arguments)));
-          }
-          Object argument = arguments.get(a++);
-          switch (directive) {
-            case 'd':
-              if (!(argument instanceof Integer)) {
-                throw new MissingFormatWidthException(
-                    "invalid argument " + Starlark.repr(argument) + " for format pattern %d");
-              }
-              printer.append(argument.toString());
-              continue;
-
-            case 'r':
-              printer.repr(argument);
-              continue;
-
-            case 's':
-              printer.str(argument);
-              continue;
-
-            default:
-              // no-op
-          }
-          // fall through
-        default:
-          throw new MissingFormatWidthException(
-              // The call to Starlark.repr doesn't cause an infinite recursion because it's
-              // only used to format a string properly
-              String.format(
-                  "unsupported format character \"%s\" at index %s in %s",
-                  String.valueOf(directive), p + 1, Starlark.repr(pattern)));
-      }
-    }
-    if (a < argLength) {
-      throw new MissingFormatWidthException("not all arguments converted during string formatting");
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Program.java b/src/main/java/com/google/devtools/build/lib/syntax/Program.java
deleted file mode 100644
index 576b60a..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Program.java
+++ /dev/null
@@ -1,98 +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.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/**
- * An opaque, executable representation of a valid Starlark program. Programs may
- * [eventually---TODO(adonovan)] be efficiently serialized and deserialized without parsing and
- * recompiling.
- */
-public final class Program {
-
-  private final Resolver.Function body;
-  private final ImmutableList<String> loads;
-
-  private Program(Resolver.Function body, ImmutableList<String> loads) {
-    // TODO(adonovan): compile here.
-    this.body = body;
-    this.loads = loads;
-  }
-
-  // TODO(adonovan): eliminate once Eval no longer needs access to syntax.
-  public Resolver.Function getResolvedFunction() {
-    return body;
-  }
-
-  /** Returns the file name of this compiled program. */
-  public String getFilename() {
-    return body.getLocation().file();
-  }
-
-  /** Returns the list of load strings of this compiled program, in source order. */
-  public ImmutableList<String> getLoads() {
-    return loads;
-  }
-
-  /**
-   * Resolves a file syntax tree in the specified environment and compiles it to a Program. This
-   * operation mutates the syntax tree, both by resolving identifiers and recording local variables,
-   * and in case of error, by appending to {@code file.errors()}.
-   *
-   * @throws SyntaxError.Exception in case of resolution error, or if the syntax tree already
-   *     contained syntax scan/parse errors. Resolution errors are added to {@code file.errors()}.
-   */
-  public static Program compileFile(StarlarkFile file, Resolver.Module env)
-      throws SyntaxError.Exception {
-    Resolver.resolveFile(file, env);
-    if (!file.ok()) {
-      throw new SyntaxError.Exception(file.errors());
-    }
-    return compileResolvedFile(file);
-  }
-
-  /** Variant of {@link #compileFile} for an already-resolved file syntax tree. */
-  // TODO(adonovan): eliminate. This is a stop-gap because Bazel's Skyframe functions
-  // are currently split as parse/resolve + compile/run, not parse/resolve/compile + run.
-  public static Program compileResolvedFile(StarlarkFile file) {
-    Preconditions.checkState(file.ok());
-
-    // Extract load statements.
-    ImmutableList.Builder<String> loads = ImmutableList.builder();
-    for (Statement stmt : file.getStatements()) {
-      if (stmt instanceof LoadStatement) {
-        LoadStatement load = (LoadStatement) stmt;
-        String module = load.getImport().getValue();
-        loads.add(module);
-      }
-    }
-
-    return new Program(file.getResolvedFunction(), loads.build());
-  }
-
-  /**
-   * Resolves an expression syntax tree in the specified environment and compiles it to a Program.
-   * This operation mutates the syntax tree. The {@code options} must match those used when parsing
-   * expression.
-   *
-   * @throws SyntaxError.Exception in case of resolution error.
-   */
-  public static Program compileExpr(Expression expr, Resolver.Module module, FileOptions options)
-      throws SyntaxError.Exception {
-    Resolver.Function body = Resolver.resolveExpr(expr, module, options);
-    return new Program(body, /*loads=*/ ImmutableList.of());
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/RangeList.java b/src/main/java/com/google/devtools/build/lib/syntax/RangeList.java
deleted file mode 100644
index 789f201..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/RangeList.java
+++ /dev/null
@@ -1,179 +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.base.Preconditions;
-import com.google.common.collect.UnmodifiableIterator;
-import java.util.AbstractList;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import javax.annotation.concurrent.Immutable;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-
-/**
- * A sequence returned by the {@code range} function invocation.
- *
- * <p>Instead of eagerly allocating an array with all elements of the sequence, this class uses
- * simple math to compute a value at each index. This is particularly useful when range is huge or
- * only a few elements from it are used.
- *
- * <p>Eventually {@code range} function should produce an instance of the {@code range} type as is
- * the case in Python 3, but for now to preserve backwards compatibility with Python 2, {@code list}
- * is returned.
- */
-@StarlarkBuiltin(
-    name = "range",
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc =
-        "A language built-in type to support ranges. Example of range literal:<br>"
-            + "<pre class=language-python>x = range(1, 10, 3)</pre>"
-            + "Accessing elements is possible using indexing (starts from <code>0</code>):<br>"
-            + "<pre class=language-python>e = x[1]   # e == 2</pre>"
-            + "Ranges do not support the <code>+</code> operator for concatenation."
-            + "Similar to strings, ranges support slice operations:"
-            + "<pre class=language-python>range(10)[1:3]   # range(1, 3)\n"
-            + "range(10)[::2]  # range(0, 10, 2)\n"
-            + "range(10)[3:0:-1]  # range(3, 0, -1)</pre>"
-            + "Ranges are immutable, as in Python 3.")
-@Immutable
-final class RangeList extends AbstractList<Integer> implements Sequence<Integer> {
-
-  private final int start;
-  private final int stop;
-  private final int step;
-  private final int size; // (derived)
-
-  RangeList(int start, int stop, int step) {
-    Preconditions.checkArgument(step != 0);
-
-    this.start = start;
-    this.stop = stop;
-    this.step = step;
-
-    // compute size.
-    // Python version:
-    // https://github.com/python/cpython/blob/09bb918a61031377d720f1a0fa1fe53c962791b6/Objects/rangeobject.c#L144
-    int low; // [low,high) is a half-open interval
-    int high;
-    if (step > 0) {
-      low = start;
-      high = stop;
-    } else {
-      low = stop;
-      high = start;
-      step = -step;
-    }
-    if (low >= high) {
-      this.size = 0;
-    } else {
-      int diff = high - low - 1;
-      this.size = diff / step + 1;
-    }
-  }
-
-  @Override
-  public boolean contains(Object x) {
-    if (!(x instanceof Integer)) {
-      return false;
-    }
-    int i = (Integer) x;
-    // constant-time implementation
-    if (step > 0) {
-      return start <= i && i < stop && (i - start) % step == 0;
-    } else {
-      return stop < i && i <= start && (i - start) % step == 0;
-    }
-  }
-
-  @Override
-  public Integer get(int index) {
-    if (index < 0 || index >= size()) {
-      throw new ArrayIndexOutOfBoundsException(index + ":" + this);
-    }
-    return at(index);
-  }
-
-  @Override
-  public int size() {
-    return size;
-  }
-
-  @Override
-  public int hashCode() {
-    return 7873 ^ (5557 * start) ^ (3251 * step) ^ (1091 * size);
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (!(other instanceof RangeList)) {
-      return false;
-    }
-    RangeList that = (RangeList) other;
-
-    // Two RangeLists compare equal if they denote the same sequence.
-    if (this.size != that.size) {
-      return false; // sequences differ in length
-    }
-    if (this.size == 0) {
-      return true; // both sequences are empty
-    }
-    if (this.start != that.start) {
-      return false; // first element differs
-    }
-    return this.size == 1 || this.step == that.step;
-  }
-
-  @Override
-  public Iterator<Integer> iterator() {
-    return new UnmodifiableIterator<Integer>() {
-      int cursor = start;
-
-      @Override
-      public boolean hasNext() {
-        return (step > 0) ? (cursor < stop) : (cursor > stop);
-      }
-
-      @Override
-      public Integer next() {
-        if (!hasNext()) {
-          throw new NoSuchElementException();
-        }
-        int current = cursor;
-        cursor += step;
-        return current;
-      }
-    };
-  }
-
-  @Override
-  public Sequence<Integer> getSlice(Mutability mu, int start, int stop, int step) {
-    return new RangeList(at(start), at(stop), step * this.step);
-  }
-
-  // Like get, but without bounds check or Integer allocation.
-  int at(int i) {
-    return start + step * i;
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    if (step == 1) {
-      Printer.format(printer, "range(%d, %d)", start, stop);
-    } else {
-      Printer.format(printer, "range(%d, %d, %d)", start, stop, step);
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Resolver.java b/src/main/java/com/google/devtools/build/lib/syntax/Resolver.java
deleted file mode 100644
index ad56e3b..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Resolver.java
+++ /dev/null
@@ -1,839 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.errorprone.annotations.FormatMethod;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nullable;
-import net.starlark.java.spelling.SpellChecker;
-
-/**
- * The Resolver resolves each identifier in a syntax tree to its binding, and performs other
- * validity checks.
- *
- * <p>When a variable is defined, it is visible in the entire block. For example, a global variable
- * is visible in the entire file; a variable in a function is visible in the entire function block
- * (even on the lines before its first assignment).
- *
- * <p>Resolution is a mutation of the syntax tree, as it attaches binding information to Identifier
- * nodes. (In the future, it will attach additional information to functions to support lexical
- * scope, and even compilation of the trees to bytecode.) Resolution errors are reported in the
- * analogous manner to scan/parse errors: for a StarlarkFile, they are appended to {@code
- * StarlarkFile.errors}; for an expression they are reported by an SyntaxError.Exception exception.
- * It is legal to resolve a file that already contains scan/parse errors, though it may lead to
- * secondary errors.
- */
-public final class Resolver extends NodeVisitor {
-
-  // TODO(adonovan): use "keyword" (not "named") and "required" (not "mandatory") terminology
-  // everywhere, including the spec.
-
-  /** Scope discriminates the scope of a binding: global, local, etc. */
-  public enum Scope {
-    // TODO(adonovan): Add UNIVERSAL, FREE, CELL.
-    // (PREDECLARED vs UNIVERSAL allows us to represent the app-dependent and fixed parts of the
-    // predeclared environment separately, reducing the amount of copying.)
-
-    /** Binding is local to a function, comprehension, or file (e.g. load). */
-    LOCAL,
-    /** Binding occurs outside any function or comprehension. */
-    GLOBAL,
-    /** Binding is predeclared by the core or application. */
-    PREDECLARED;
-
-    @Override
-    public String toString() {
-      return super.toString().toLowerCase();
-    }
-  }
-
-  /**
-   * A Binding is a static abstraction of a variable. The Resolver maps each Identifier to a
-   * Binding.
-   */
-  public static final class Binding {
-
-    private final Scope scope;
-    @Nullable private final Identifier first; // first binding use, if syntactic
-    private final int index; // within its block (currently unused)
-
-    private Binding(Scope scope, @Nullable Identifier first, int index) {
-      this.scope = scope;
-      this.first = first;
-      this.index = index;
-    }
-
-    /** Returns the scope of the binding. */
-    public Scope getScope() {
-      return scope;
-    }
-
-    @Override
-    public String toString() {
-      return first == null
-          ? scope.toString()
-          : String.format(
-              "%s[%d] %s @ %s", scope, index, first.getName(), first.getStartLocation());
-    }
-  }
-
-  /** A Resolver.Function records information about a resolved function. */
-  public static final class Function {
-
-    private final String name;
-    private final Location location;
-    private final ImmutableList<Parameter> params;
-    private final ImmutableList<Statement> body;
-    private final boolean hasVarargs;
-    private final boolean hasKwargs;
-    private final int numKeywordOnlyParams;
-    private final ImmutableList<String> parameterNames;
-    private final boolean isToplevel;
-
-    private Function(
-        String name,
-        Location loc,
-        ImmutableList<Parameter> params,
-        ImmutableList<Statement> body,
-        boolean hasVarargs,
-        boolean hasKwargs,
-        int numKeywordOnlyParams) {
-      this.name = name;
-      this.location = loc;
-      this.params = params;
-      this.body = body;
-      this.hasVarargs = hasVarargs;
-      this.hasKwargs = hasKwargs;
-      this.numKeywordOnlyParams = numKeywordOnlyParams;
-
-      ImmutableList.Builder<String> names = ImmutableList.builderWithExpectedSize(params.size());
-      for (Parameter p : params) {
-        names.add(p.getName());
-      }
-      this.parameterNames = names.build();
-
-      this.isToplevel = name.equals("<toplevel>");
-    }
-
-    /**
-     * Returns the name of the function. It may be "<toplevel>" for the implicit function that holds
-     * the top-level statements of a file, or "<expr>" for the implicit function that evaluates a
-     * single expression.
-     */
-    public String getName() {
-      return name;
-    }
-
-    /** Returns the location of the function's identifier. */
-    public Location getLocation() {
-      return location;
-    }
-
-    /**
-     * Returns the function's parameters, in "run-time order": non-keyword-only parameters,
-     * keyword-only parameters, {@code *args}, and finally {@code **kwargs}. A bare {@code *}
-     * parameter is dropped.
-     */
-    public ImmutableList<Parameter> getParameters() {
-      return params;
-    }
-
-    /**
-     * Returns the effective statements of the function's body. (For the implicit function created
-     * to evaluate a single standalone expression, this may contain a synthesized Return statement.)
-     */
-    // TODO(adonovan): eliminate when we switch to compiler.
-    public ImmutableList<Statement> getBody() {
-      return body;
-    }
-
-    /** Reports whether the function has an {@code *args} parameter. */
-    public boolean hasVarargs() {
-      return hasVarargs;
-    }
-
-    /** Reports whether the function has a {@code **kwargs} parameter. */
-    public boolean hasKwargs() {
-      return hasKwargs;
-    }
-
-    /**
-     * Returns the number of the function's keyword-only parameters, such as {@code c} in {@code def
-     * f(a, *b, c, **d)} or {@code def f(a, *, c, **d)}.
-     */
-    public int numKeywordOnlyParams() {
-      return numKeywordOnlyParams;
-    }
-
-    /** Returns the names of the parameters. Order is as for {@link #getParameters}. */
-    public ImmutableList<String> getParameterNames() {
-      return parameterNames;
-    }
-
-    /**
-     * isToplevel indicates that this is the <toplevel> function containing top-level statements of
-     * a file. It causes assignments to unresolved identifiers to update the module, not the lexical
-     * frame.
-     */
-    // TODO(adonovan): remove this hack when identifier resolution is accurate.
-    public boolean isToplevel() {
-      return isToplevel;
-    }
-  }
-
-  /**
-   * Module is a static abstraction of a Starlark module. It describes the set of variable names for
-   * use during name resolution.
-   */
-  public interface Module {
-
-    // TODO(adonovan): opt: for efficiency, turn this into a predicate, not an enumerable set,
-    // and look up bindings as they are needed, not preemptively.
-    // Otherwise we must do work proportional to the number of bindings in the
-    // environment, not the number of free variables of the file/expression.
-    //
-    // A single method will then suffice:
-    //   Scope resolve(String name) throws Undeclared
-
-    /** Returns the set of names defined by this module. The caller must not modify the set. */
-    Set<String> getNames();
-
-    /**
-     * Returns (optionally) a more specific error for an undeclared name than the generic message.
-     * This hook allows the module to implement flag-enabled names without any knowledge in this
-     * file.
-     */
-    @Nullable
-    default String getUndeclaredNameError(String name) {
-      return null;
-    }
-  }
-
-  private static class Block {
-    private final Map<String, Binding> bindings = new HashMap<>();
-    private final Scope scope;
-    @Nullable private final Block parent;
-
-    Block(Scope scope, @Nullable Block parent) {
-      this.scope = scope;
-      this.parent = parent;
-    }
-  }
-
-  private final List<SyntaxError> errors;
-  private final FileOptions options;
-  private final Module module;
-  private Block block;
-  private int loopCount;
-
-  // Shared binding for all predeclared names.
-  private static final Binding PREDECLARED = new Binding(Scope.PREDECLARED, null, 0);
-
-  private Resolver(List<SyntaxError> errors, Module module, FileOptions options) {
-    this.errors = errors;
-    this.module = module;
-    this.options = options;
-
-    this.block = new Block(Scope.PREDECLARED, null);
-    for (String name : module.getNames()) {
-      block.bindings.put(name, PREDECLARED);
-    }
-  }
-
-  // Formats and reports an error at the start of the specified node.
-  @FormatMethod
-  private void errorf(Node node, String format, Object... args) {
-    errorf(node.getStartLocation(), format, args);
-  }
-
-  // Formats and reports an error at the specified location.
-  @FormatMethod
-  private void errorf(Location loc, String format, Object... args) {
-    errors.add(new SyntaxError(loc, String.format(format, args)));
-  }
-
-  /**
-   * First pass: add bindings for all variables to the current block. This is done because symbols
-   * are sometimes used before their definition point (e.g. functions are not necessarily declared
-   * in order).
-   */
-  // TODO(adonovan): eliminate this first pass by using go.starlark.net one-pass approach.
-  private void createBindings(Iterable<Statement> stmts) {
-    for (Statement stmt : stmts) {
-      createBindings(stmt);
-    }
-  }
-
-  private void createBindings(Statement stmt) {
-    switch (stmt.kind()) {
-      case ASSIGNMENT:
-        createBindings(((AssignmentStatement) stmt).getLHS());
-        break;
-      case IF:
-        IfStatement ifStmt = (IfStatement) stmt;
-        createBindings(ifStmt.getThenBlock());
-        if (ifStmt.getElseBlock() != null) {
-          createBindings(ifStmt.getElseBlock());
-        }
-        break;
-      case FOR:
-        ForStatement forStmt = (ForStatement) stmt;
-        createBindings(forStmt.getVars());
-        createBindings(forStmt.getBody());
-        break;
-      case DEF:
-        DefStatement def = (DefStatement) stmt;
-        bind(def.getIdentifier());
-        break;
-      case LOAD:
-        LoadStatement load = (LoadStatement) stmt;
-        Set<String> names = new HashSet<>();
-        for (LoadStatement.Binding b : load.getBindings()) {
-          // Reject load('...', '_private').
-          Identifier orig = b.getOriginalName();
-          if (orig.isPrivate() && !options.allowLoadPrivateSymbols()) {
-            errorf(orig, "symbol '%s' is private and cannot be imported", orig.getName());
-          }
-
-          // The allowToplevelRebinding check is not applied to all files
-          // but we apply it to each load statement as a special case,
-          // and emit a better error message than the generic check.
-          if (!names.add(b.getLocalName().getName())) {
-            errorf(
-                b.getLocalName(),
-                "load statement defines '%s' more than once",
-                b.getLocalName().getName());
-          }
-        }
-
-        // TODO(adonovan): support options.loadBindsGlobally().
-        // Requires that we open a LOCAL block for each file,
-        // as well as its Module block, and select which block
-        // to declare it in. See go.starlark.net implementation.
-
-        for (LoadStatement.Binding b : load.getBindings()) {
-          bind(b.getLocalName());
-        }
-        break;
-      case EXPRESSION:
-      case FLOW:
-      case RETURN:
-        // nothing to declare
-    }
-  }
-
-  private void createBindings(Expression lhs) {
-    for (Identifier id : Identifier.boundIdentifiers(lhs)) {
-      bind(id);
-    }
-  }
-
-  private void assign(Expression lhs) {
-    if (lhs instanceof Identifier) {
-      Identifier id = (Identifier) lhs;
-      // Bindings are created by the first pass (createBindings),
-      // so there's nothing to do here.
-      Preconditions.checkNotNull(block.bindings.get(id.getName()));
-    } else if (lhs instanceof IndexExpression) {
-      visit(lhs);
-    } else if (lhs instanceof ListExpression) {
-      for (Expression elem : ((ListExpression) lhs).getElements()) {
-        assign(elem);
-      }
-    } else {
-      // TODO(adonovan): support x.f = y.
-      errorf(lhs, "cannot assign to '%s'", lhs);
-    }
-  }
-
-  @Override
-  public void visit(Identifier id) {
-    for (Block b = block; b != null; b = b.parent) {
-      Binding bind = b.bindings.get(id.getName());
-      if (bind != null) {
-        if (options.recordScope()) {
-          id.setBinding(bind);
-        }
-        return;
-      }
-    }
-
-    // The identifier might not exist because it was restricted (hidden) by flags.
-    // If this is the case, output a more helpful error message than 'not found'.
-    String error = module.getUndeclaredNameError(id.getName());
-    if (error == null) {
-      // generic error
-      error = createInvalidIdentifierException(id.getName(), getAllSymbols());
-    }
-    errorf(id, "%s", error);
-  }
-
-  private static String createInvalidIdentifierException(String name, Set<String> candidates) {
-    if (!Identifier.isValid(name)) {
-      // Identifier was created by Parser.makeErrorExpression and contains misparsed text.
-      return "contains syntax errors";
-    }
-
-    String suggestion = SpellChecker.didYouMean(name, candidates);
-    return "name '" + name + "' is not defined" + suggestion;
-  }
-
-  @Override
-  public void visit(ReturnStatement node) {
-    if (block.scope != Scope.LOCAL) {
-      errorf(node, "return statements must be inside a function");
-    }
-    super.visit(node);
-  }
-
-  @Override
-  public void visit(CallExpression node) {
-    // validate call arguments
-    boolean seenVarargs = false;
-    boolean seenKwargs = false;
-    Set<String> keywords = null;
-    for (Argument arg : node.getArguments()) {
-      if (arg instanceof Argument.Positional) {
-        if (seenVarargs) {
-          errorf(arg, "positional argument may not follow *args");
-        } else if (seenKwargs) {
-          errorf(arg, "positional argument may not follow **kwargs");
-        } else if (keywords != null) {
-          errorf(arg, "positional argument may not follow keyword argument");
-        }
-
-      } else if (arg instanceof Argument.Keyword) {
-        String keyword = ((Argument.Keyword) arg).getName();
-        if (seenVarargs) {
-          errorf(arg, "keyword argument %s may not follow *args", keyword);
-        } else if (seenKwargs) {
-          errorf(arg, "keyword argument %s may not follow **kwargs", keyword);
-        }
-        if (keywords == null) {
-          keywords = new HashSet<>();
-        }
-        if (!keywords.add(keyword)) {
-          errorf(arg, "duplicate keyword argument: %s", keyword);
-        }
-
-      } else if (arg instanceof Argument.Star) {
-        if (seenKwargs) {
-          errorf(arg, "*args may not follow **kwargs");
-        } else if (seenVarargs) {
-          errorf(arg, "multiple *args not allowed");
-        }
-        seenVarargs = true;
-
-      } else if (arg instanceof Argument.StarStar) {
-        if (seenKwargs) {
-          errorf(arg, "multiple **kwargs not allowed");
-        }
-        seenKwargs = true;
-      }
-    }
-
-    super.visit(node);
-  }
-
-  @Override
-  public void visit(ForStatement node) {
-    if (block.scope != Scope.LOCAL) {
-      errorf(
-          node,
-          "for loops are not allowed at the top level. You may move it inside a function "
-              + "or use a comprehension, [f(x) for x in sequence]");
-    }
-    loopCount++;
-    visit(node.getCollection());
-    assign(node.getVars());
-    visitBlock(node.getBody());
-    Preconditions.checkState(loopCount > 0);
-    loopCount--;
-  }
-
-  @Override
-  public void visit(LoadStatement node) {
-    if (block.scope == Scope.LOCAL) {
-      errorf(node, "load statement not at top level");
-    }
-    // Skip super.visit: don't revisit local Identifier as a use.
-  }
-
-  @Override
-  public void visit(FlowStatement node) {
-    if (node.getKind() != TokenKind.PASS && loopCount <= 0) {
-      errorf(node, "%s statement must be inside a for loop", node.getKind());
-    }
-    super.visit(node);
-  }
-
-  @Override
-  public void visit(DotExpression node) {
-    visit(node.getObject());
-    // Do not visit the field.
-  }
-
-  @Override
-  public void visit(Comprehension node) {
-    ImmutableList<Comprehension.Clause> clauses = node.getClauses();
-
-    // Following Python3, the first for clause is resolved
-    // outside the comprehension block. All the other loops
-    // are resolved in the scope of their own bindings,
-    // permitting forward references.
-    Comprehension.For for0 = (Comprehension.For) clauses.get(0);
-    visit(for0.getIterable());
-
-    openBlock(Scope.LOCAL);
-    for (Comprehension.Clause clause : clauses) {
-      if (clause instanceof Comprehension.For) {
-        Comprehension.For forClause = (Comprehension.For) clause;
-        createBindings(forClause.getVars());
-      }
-    }
-    for (int i = 0; i < clauses.size(); i++) {
-      Comprehension.Clause clause = clauses.get(i);
-      if (clause instanceof Comprehension.For) {
-        Comprehension.For forClause = (Comprehension.For) clause;
-        if (i > 0) {
-          visit(forClause.getIterable());
-        }
-        assign(forClause.getVars());
-      } else {
-        Comprehension.If ifClause = (Comprehension.If) clause;
-        visit(ifClause.getCondition());
-      }
-    }
-    visit(node.getBody());
-    closeBlock();
-  }
-
-  @Override
-  public void visit(DefStatement node) {
-    if (block.scope == Scope.LOCAL) {
-      errorf(node, "nested functions are not allowed. Move the function to the top level.");
-    }
-    node.setResolvedFunction(
-        resolveFunction(
-            node.getIdentifier().getName(),
-            node.getIdentifier().getStartLocation(),
-            node.getParameters(),
-            node.getBody()));
-  }
-
-  private Function resolveFunction(
-      String name,
-      Location loc,
-      ImmutableList<Parameter> parameters,
-      ImmutableList<Statement> body) {
-
-    // Resolve defaults in enclosing environment.
-    for (Parameter param : parameters) {
-      if (param instanceof Parameter.Optional) {
-        visit(param.getDefaultValue());
-      }
-    }
-
-    // Enter function block.
-    openBlock(Scope.LOCAL);
-
-    // Check parameter order and convert to run-time order:
-    // positionals, keyword-only, *args, **kwargs.
-    Parameter.Star star = null;
-    Parameter.StarStar starStar = null;
-    boolean seenOptional = false;
-    int numKeywordOnlyParams = 0;
-    // TODO(adonovan): opt: when all Identifiers are resolved to bindings accumulated
-    // in the function, params can be a prefix of the function's array of bindings.
-    ImmutableList.Builder<Parameter> params =
-        ImmutableList.builderWithExpectedSize(parameters.size());
-    for (Parameter param : parameters) {
-      if (param instanceof Parameter.Mandatory) {
-        // e.g. id
-        if (starStar != null) {
-          errorf(
-              param,
-              "required parameter %s may not follow **%s",
-              param.getName(),
-              starStar.getName());
-        } else if (star != null) {
-          numKeywordOnlyParams++;
-        } else if (seenOptional) {
-          errorf(
-              param,
-              "required positional parameter %s may not follow an optional parameter",
-              param.getName());
-        }
-        bindParam(params, param);
-
-      } else if (param instanceof Parameter.Optional) {
-        // e.g. id = default
-        seenOptional = true;
-        if (starStar != null) {
-          errorf(param, "optional parameter may not follow **%s", starStar.getName());
-        } else if (star != null) {
-          numKeywordOnlyParams++;
-        }
-        bindParam(params, param);
-
-      } else if (param instanceof Parameter.Star) {
-        // * or *args
-        if (starStar != null) {
-          errorf(param, "* parameter may not follow **%s", starStar.getName());
-        } else if (star != null) {
-          errorf(param, "multiple * parameters not allowed");
-        } else {
-          star = (Parameter.Star) param;
-        }
-
-      } else {
-        // **kwargs
-        if (starStar != null) {
-          errorf(param, "multiple ** parameters not allowed");
-        }
-        starStar = (Parameter.StarStar) param;
-      }
-    }
-
-    // * or *args
-    if (star != null) {
-      if (star.getIdentifier() != null) {
-        bindParam(params, star);
-      } else if (numKeywordOnlyParams == 0) {
-        errorf(star, "bare * must be followed by keyword-only parameters");
-      }
-    }
-
-    // **kwargs
-    if (starStar != null) {
-      bindParam(params, starStar);
-    }
-
-    createBindings(body);
-    visitAll(body);
-    closeBlock();
-
-    return new Function(
-        name,
-        loc,
-        params.build(),
-        body,
-        star != null && star.getIdentifier() != null,
-        starStar != null,
-        numKeywordOnlyParams);
-  }
-
-  private void bindParam(ImmutableList.Builder<Parameter> params, Parameter param) {
-    if (bind(param.getIdentifier())) {
-      errorf(param, "duplicate parameter: %s", param.getName());
-    }
-    params.add(param);
-  }
-
-  @Override
-  public void visit(IfStatement node) {
-    if (block.scope != Scope.LOCAL) {
-      errorf(
-          node,
-          "if statements are not allowed at the top level. You may move it inside a function "
-              + "or use an if expression (x if condition else y).");
-    }
-    super.visit(node);
-  }
-
-  @Override
-  public void visit(AssignmentStatement node) {
-    visit(node.getRHS());
-
-    // Disallow: [e, ...] += rhs
-    // Other bad cases are handled in assign.
-    if (node.isAugmented() && node.getLHS() instanceof ListExpression) {
-      errorf(
-          node.getOperatorLocation(),
-          "cannot perform augmented assignment on a list or tuple expression");
-    }
-
-    assign(node.getLHS());
-  }
-
-  /**
-   * Process a binding use of a name by adding a binding to the current block if not already bound,
-   * and associate the identifier with it. Reports whether the name was already bound in this block.
-   */
-  private boolean bind(Identifier id) {
-    Binding bind = block.bindings.get(id.getName());
-
-    // Already bound in this block?
-    if (bind != null) {
-      // Symbols defined in the module block cannot be reassigned.
-      if (block.scope == Scope.GLOBAL && !options.allowToplevelRebinding()) {
-        errorf(
-            id,
-            "cannot reassign global '%s' (read more at"
-                + " https://bazel.build/versions/master/docs/skylark/errors/read-only-variable.html)",
-            id.getName());
-        if (bind.first != null) {
-          errorf(bind.first, "'%s' previously declared here", id.getName());
-        }
-      }
-
-      if (options.recordScope()) {
-        id.setBinding(bind);
-      }
-      return true;
-    }
-
-    // new binding
-    // TODO(adonovan): accumulate locals in the enclosing function/file block.
-    bind = new Binding(block.scope, id, block.bindings.size());
-    block.bindings.put(id.getName(), bind);
-    if (options.recordScope()) {
-      id.setBinding(bind);
-    }
-    return false;
-  }
-
-  /** Returns the set of all accessible symbols (both local and global) */
-  private Set<String> getAllSymbols() {
-    Set<String> all = new HashSet<>();
-    for (Block b = block; b != null; b = b.parent) {
-      all.addAll(b.bindings.keySet());
-    }
-    return all;
-  }
-
-  // Report an error if a load statement appears after another kind of statement.
-  private void checkLoadAfterStatement(List<Statement> statements) {
-    Statement firstStatement = null;
-
-    for (Statement statement : statements) {
-      // Ignore string literals (e.g. docstrings).
-      if (statement instanceof ExpressionStatement
-          && ((ExpressionStatement) statement).getExpression() instanceof StringLiteral) {
-        continue;
-      }
-
-      if (statement instanceof LoadStatement) {
-        if (firstStatement == null) {
-          continue;
-        }
-        errorf(statement, "load statements must appear before any other statement");
-        errorf(firstStatement, "\tfirst non-load statement appears here");
-      }
-
-      if (firstStatement == null) {
-        firstStatement = statement;
-      }
-    }
-  }
-
-  private void resolveToplevelStatements(List<Statement> statements) {
-    // Check that load() statements are on top.
-    if (options.requireLoadStatementsFirst()) {
-      checkLoadAfterStatement(statements);
-    }
-
-    openBlock(Scope.GLOBAL);
-
-    // Add a binding for each variable defined by statements, not including definitions that appear
-    // in sub-scopes of the given statements (function bodies and comprehensions).
-    createBindings(statements);
-
-    // Second pass: ensure that all symbols have been defined.
-    visitAll(statements);
-    closeBlock();
-  }
-
-  /**
-   * Performs static checks, including resolution of identifiers in {@code file} in the environment
-   * defined by {@code module}. The StarlarkFile is mutated. Errors are appended to {@link
-   * StarlarkFile#errors}.
-   */
-  public static void resolveFile(StarlarkFile file, Module module) {
-    ImmutableList<Statement> stmts = file.getStatements();
-
-    Resolver r = new Resolver(file.errors, module, file.getOptions());
-    r.resolveToplevelStatements(stmts);
-    // Check that no closeBlock was forgotten.
-    Preconditions.checkState(r.block.parent == null);
-
-    // If the final statement is an expression, synthesize a return statement.
-    int n = stmts.size();
-    if (n > 0 && stmts.get(n - 1) instanceof ExpressionStatement) {
-      Expression expr = ((ExpressionStatement) stmts.get(n - 1)).getExpression();
-      stmts =
-          ImmutableList.<Statement>builder()
-              .addAll(stmts.subList(0, n - 1))
-              .add(ReturnStatement.make(expr))
-              .build();
-    }
-
-    // Annotate with resolved information about the toplevel function.
-    file.setResolvedFunction(
-        new Function(
-            "<toplevel>",
-            file.getStartLocation(),
-            /*params=*/ ImmutableList.of(),
-            /*body=*/ stmts,
-            /*hasVarargs=*/ false,
-            /*hasKwargs=*/ false,
-            /*numKeywordOnlyParams=*/ 0));
-  }
-
-  /**
-   * Performs static checks, including resolution of identifiers in {@code expr} in the environment
-   * defined by {@code module}. This operation mutates the Expression. Syntax must be resolved
-   * before it is evaluated.
-   */
-  public static Function resolveExpr(Expression expr, Module module, FileOptions options)
-      throws SyntaxError.Exception {
-    List<SyntaxError> errors = new ArrayList<>();
-    Resolver r = new Resolver(errors, module, options);
-
-    r.visit(expr);
-
-    if (!errors.isEmpty()) {
-      throw new SyntaxError.Exception(errors);
-    }
-
-    // Return no-arg function that computes the expression.
-    return new Function(
-        "<expr>",
-        expr.getStartLocation(),
-        /*params=*/ ImmutableList.of(),
-        ImmutableList.of(ReturnStatement.make(expr)),
-        /*hasVarargs=*/ false,
-        /*hasKwargs=*/ false,
-        /*numKeywordOnlyParams=*/ 0);
-  }
-
-  /** Open a new lexical block that will contain the future declarations. */
-  private void openBlock(Scope scope) {
-    block = new Block(scope, block);
-  }
-
-  /** Close a lexical block (and lose all declarations it contained). */
-  private void closeBlock() {
-    block = Preconditions.checkNotNull(block.parent);
-  }
-
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
deleted file mode 100644
index 52b1f79..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
+++ /dev/null
@@ -1,62 +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 javax.annotation.Nullable;
-
-/** A syntax node for return statements. */
-public final class ReturnStatement extends Statement {
-
-  private final int returnOffset;
-  @Nullable private final Expression result;
-
-  ReturnStatement(FileLocations locs, int returnOffset, @Nullable Expression result) {
-    super(locs);
-    this.returnOffset = returnOffset;
-    this.result = result;
-  }
-
-  /**
-   * Returns a new return statement that returns expr. It is provided only for use by the evaluator,
-   * and will be removed when it switches to a compiled representation.
-   */
-  static ReturnStatement make(Expression expr) {
-    return new ReturnStatement(expr.locs, expr.getStartOffset(), expr);
-  }
-
-  @Nullable
-  public Expression getResult() {
-    return result;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return returnOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return result != null ? result.getEndOffset() : returnOffset + "return".length();
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.RETURN;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Sequence.java b/src/main/java/com/google/devtools/build/lib/syntax/Sequence.java
deleted file mode 100644
index edd81c2..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Sequence.java
+++ /dev/null
@@ -1,103 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import java.util.RandomAccess;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-
-/**
- * A Sequence is a finite iterable sequence of Starlark values, such as a list or tuple.
- *
- * <p>Sequences implement the read-only operations of the {@link List} interface, but not its update
- * operations, similar to {@code ImmutableList}. The specification of {@code List} governs how such
- * methods behave and in particular how they report errors. Subclasses of sequence may define ad-hoc
- * mutator methods, such as {@link StarlarkList#extend}, exposed to Starlark, or Java, or both.
- *
- * <p>In principle, subclasses of Sequence could also define the standard update operations of List,
- * but there appears to be little demand, and doing so carries some risk of obscuring unintended
- * mutations to Starlark values that would currently cause the program to crash.
- */
-@StarlarkBuiltin(
-    name = "sequence",
-    documented = false,
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc = "common type of lists and tuples.")
-public interface Sequence<E>
-    extends StarlarkValue, List<E>, RandomAccess, StarlarkIndexable, StarlarkIterable<E> {
-
-  @Override
-  default boolean truth() {
-    return !isEmpty();
-  }
-
-  /** Returns an ImmutableList object with the current underlying contents of this Sequence. */
-  default ImmutableList<E> getImmutableList() {
-    return ImmutableList.copyOf(this);
-  }
-
-  /** Retrieves an entry from a Sequence. */
-  @Override
-  default E getIndex(StarlarkSemantics semantics, Object key) throws EvalException {
-    int index = Starlark.toInt(key, "sequence index");
-    return get(EvalUtils.getSequenceIndex(index, size()));
-  }
-
-  @Override
-  default boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalException {
-    return contains(key);
-  }
-
-  /**
-   * Returns the slice of this sequence, {@code this[start:stop:step]}. <br>
-   * For positive strides ({@code step > 0}), {@code 0 <= start <= stop <= size()}. <br>
-   * For negative strides ({@code step < 0}), {@code -1 <= stop <= start < size()}. <br>
-   * The caller must ensure that the start and stop indices are valid and that step is non-zero.
-   */
-  Sequence<E> getSlice(Mutability mu, int start, int stop, int step);
-
-  /**
-   * Casts a non-null Starlark value {@code x} to a {@code Sequence<T>}, after checking that each
-   * element is an instance of {@code elemType}. On error, it throws an EvalException whose message
-   * includes {@code what}, ideally a string literal, as a description of the role of {@code x}.
-   */
-  public static <T> Sequence<T> cast(Object x, Class<T> elemType, String what)
-      throws EvalException {
-    Preconditions.checkNotNull(x);
-    if (!(x instanceof Sequence)) {
-      throw Starlark.errorf("for %s, got %s, want sequence", what, Starlark.type(x));
-    }
-    int i = 0;
-    for (Object elem : (Sequence) x) {
-      if (!elemType.isAssignableFrom(elem.getClass())) {
-        throw Starlark.errorf(
-            "at index %d of %s, got element of type %s, want %s",
-            i, what, Starlark.type(elem), Starlark.classType(elemType));
-      }
-    }
-    @SuppressWarnings("unchecked") // safe
-    Sequence<T> result = (Sequence) x;
-    return result;
-  }
-
-  /** Like {@link #cast}, but if x is None, returns an immutable empty list. */
-  public static <T> Sequence<T> noneableCast(Object x, Class<T> type, String what)
-      throws EvalException {
-    return x == Starlark.NONE ? StarlarkList.empty() : cast(x, type, what);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java
deleted file mode 100644
index 29f6d70..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java
+++ /dev/null
@@ -1,87 +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 javax.annotation.Nullable;
-
-/** Syntax node for a slice expression, {@code object[start:stop:step]}. */
-public final class SliceExpression extends Expression {
-
-  private final Expression object;
-  private final int lbracketOffset;
-  @Nullable private final Expression start;
-  @Nullable private final Expression stop;
-  @Nullable private final Expression step;
-  private final int rbracketOffset;
-
-  SliceExpression(
-      FileLocations locs,
-      Expression object,
-      int lbracketOffset,
-      Expression start,
-      Expression stop,
-      Expression step,
-      int rbracketOffset) {
-    super(locs);
-    this.object = object;
-    this.lbracketOffset = lbracketOffset;
-    this.start = start;
-    this.stop = stop;
-    this.step = step;
-    this.rbracketOffset = rbracketOffset;
-  }
-
-  public Expression getObject() {
-    return object;
-  }
-
-  @Nullable
-  public Expression getStart() {
-    return start;
-  }
-
-  @Nullable
-  public Expression getStop() {
-    return stop;
-  }
-
-  @Nullable
-  public Expression getStep() {
-    return step;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return object.getStartOffset();
-  }
-
-  @Override
-  public int getEndOffset() {
-    return rbracketOffset + 1;
-  }
-
-  public Location getLbracketLocation() {
-    return locs.getLocation(lbracketOffset);
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.SLICE;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java b/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java
deleted file mode 100644
index 9036dee..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java
+++ /dev/null
@@ -1,805 +0,0 @@
-// Copyright 2019 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.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.errorprone.annotations.CheckReturnValue;
-import com.google.errorprone.annotations.FormatMethod;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.Method;
-import java.time.Duration;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.Immutable;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkInterfaceUtils;
-import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.spelling.SpellChecker;
-
-/**
- * The Starlark class defines the most important entry points, constants, and functions needed by
- * all clients of the Starlark interpreter.
- */
-public final class Starlark {
-
-  private Starlark() {} // uninstantiable
-
-  /** The Starlark None value. */
-  public static final NoneType NONE = NoneType.NONE;
-
-  /**
-   * A sentinel value passed to optional parameters of StarlarkMethod-annotated methods to indicate
-   * that no argument value was supplied.
-   */
-  public static final Object UNBOUND = new UnboundMarker();
-
-  @Immutable
-  private static final class UnboundMarker implements StarlarkValue {
-    private UnboundMarker() {}
-
-    @Override
-    public String toString() {
-      return "<unbound>";
-    }
-
-    @Override
-    public boolean isImmutable() {
-      return true;
-    }
-
-    @Override
-    public void repr(Printer printer) {
-      printer.append("<unbound>");
-    }
-  }
-
-  /**
-   * The universal bindings predeclared in every Starlark file, such as None, True, len, and range.
-   */
-  public static final ImmutableMap<String, Object> UNIVERSE = makeUniverse();
-
-  private static ImmutableMap<String, Object> makeUniverse() {
-    ImmutableMap.Builder<String, Object> env = ImmutableMap.builder();
-    env //
-        .put("False", false)
-        .put("True", true)
-        .put("None", NONE);
-    addMethods(env, new MethodLibrary());
-    return env.build();
-  }
-
-  /**
-   * Reports whether the argument is a legal Starlark value: a string, boolean, integer, or
-   * StarlarkValue.
-   */
-  public static boolean valid(Object x) {
-    return x instanceof StarlarkValue
-        || x instanceof String
-        || x instanceof Boolean
-        || x instanceof Integer;
-  }
-
-  /**
-   * Returns {@code x} if it is a {@link #valid} Starlark value, otherwise throws
-   * IllegalArgumentException.
-   */
-  public static <T> T checkValid(T x) {
-    if (!valid(x)) {
-      throw new IllegalArgumentException("invalid Starlark value: " + x.getClass());
-    }
-    return x;
-  }
-
-  /** Reports whether {@code x} is Java null or Starlark None. */
-  public static boolean isNullOrNone(Object x) {
-    return x == null || x == NONE;
-  }
-
-  /** Reports whether a Starlark value is assumed to be deeply immutable. */
-  // TODO(adonovan): eliminate the concept of querying for immutability. It is currently used for
-  // only one purpose, the precondition for adding an element to a Depset, but Depsets should check
-  // hashability, like Dicts. (Similarly, querying for hashability should go: just attempt to hash a
-  // value, and be prepared for it to fail.) In practice, a value may be immutable, either
-  // inherently (e.g. string) or because it has become frozen, but we don't need to query for it.
-  // Just attempt a mutation and be prepared for it to fail.
-  // It is inefficient and potentially inconsistent to ask before doing.
-  //
-  // The main obstacle is that although depsets disallow (say) lists as keys even when frozen,
-  // they permit a tuple of lists, or a struct containing lists, and many users exploit this.
-  public static boolean isImmutable(Object x) {
-    // NB: This is used as the basis for accepting objects in Depsets,
-    // as well as for accepting objects as keys for Starlark dicts.
-
-    if (x instanceof String || x instanceof Integer || x instanceof Boolean) {
-      return true;
-    } else if (x instanceof StarlarkValue) {
-      return ((StarlarkValue) x).isImmutable();
-    } else {
-      throw new IllegalArgumentException("invalid Starlark value: " + x.getClass());
-    }
-  }
-
-  /**
-   * Converts a Java value {@code x} to a Starlark one, if x is not already a valid Starlark value.
-   * A Java List or Map is converted to a Starlark list or dict, respectively, and null becomes
-   * {@link #NONE}. Any other non-Starlark value causes the function to throw
-   * IllegalArgumentException.
-   *
-   * <p>This function is applied to the results of StarlarkMethod-annotated Java methods.
-   */
-  public static Object fromJava(Object x, @Nullable Mutability mutability) {
-    if (x == null) {
-      return NONE;
-    } else if (valid(x)) {
-      return x;
-    } else if (x instanceof List) {
-      return StarlarkList.copyOf(mutability, (List<?>) x);
-    } else if (x instanceof Map) {
-      return Dict.copyOf(mutability, (Map<?, ?>) x);
-    } else {
-      throw new IllegalArgumentException(
-          "cannot expose internal type to Starlark: " + x.getClass());
-    }
-  }
-
-  /**
-   * Returns the truth value of a valid Starlark value, as if by the Starlark expression {@code
-   * bool(x)}.
-   */
-  public static boolean truth(Object x) {
-    if (x instanceof Boolean) {
-      return (Boolean) x;
-    } else if (x instanceof StarlarkValue) {
-      return ((StarlarkValue) x).truth();
-    } else if (x instanceof String) {
-      return !((String) x).isEmpty();
-    } else if (x instanceof Integer) {
-      return (Integer) x != 0;
-    } else {
-      throw new IllegalArgumentException("invalid Starlark value: " + x.getClass());
-    }
-  }
-
-  /**
-   * Checks whether the Freezable Starlark value is frozen or temporarily immutable due to active
-   * iterators.
-   *
-   * @throws EvalException if the value is not mutable.
-   */
-  public static void checkMutable(Mutability.Freezable x) throws EvalException {
-    if (x.mutability().isFrozen()) {
-      throw errorf("trying to mutate a frozen %s value", type(x));
-    }
-    if (x.updateIteratorCount(0)) {
-      throw errorf("%s value is temporarily immutable due to active for-loop iteration", type(x));
-    }
-  }
-
-  /**
-   * Returns an iterable view of {@code x} if it is an iterable Starlark value; throws EvalException
-   * otherwise.
-   *
-   * <p>Whereas the interpreter temporarily freezes the iterable value by bracketing {@code for}
-   * loops and comprehensions in calls to {@link Freezable#updateIteratorCount}, iteration using
-   * this method does not freeze the value. Callers should exercise care not to mutate the
-   * underlying object during iteration.
-   */
-  public static Iterable<?> toIterable(Object x) throws EvalException {
-    if (x instanceof StarlarkIterable) {
-      return (Iterable<?>) x;
-    }
-    throw errorf("type '%s' is not iterable", type(x));
-  }
-
-  /**
-   * Returns a new array containing the elements of Starlark iterable value {@code x}. A Starlark
-   * value is iterable if it implements {@link StarlarkIterable}.
-   */
-  public static Object[] toArray(Object x) throws EvalException {
-    // Specialize Sequence and Dict to avoid allocation and/or indirection.
-    if (x instanceof Sequence) {
-      return ((Sequence<?>) x).toArray();
-    } else if (x instanceof Dict) {
-      return ((Dict<?, ?>) x).keySet().toArray();
-    } else {
-      return Iterables.toArray(toIterable(x), Object.class);
-    }
-  }
-
-  /**
-   * Returns the length of a Starlark string, sequence (such as a list or tuple), dict, or other
-   * iterable, as if by the Starlark expression {@code len(x)}, or -1 if the value is valid but has
-   * no length.
-   */
-  public static int len(Object x) {
-    if (x instanceof String) {
-      return ((String) x).length();
-    } else if (x instanceof Sequence) {
-      return ((Sequence) x).size();
-    } else if (x instanceof Dict) {
-      return ((Dict) x).size();
-    } else if (x instanceof StarlarkIterable) {
-      // Iterables.size runs in constant time if x implements Collection.
-      return Iterables.size((Iterable<?>) x);
-    } else {
-      checkValid(x);
-      return -1; // valid but not a sequence
-    }
-  }
-
-  /** Returns the name of the type of a value as if by the Starlark expression {@code type(x)}. */
-  public static String type(Object x) {
-    return classType(x.getClass());
-  }
-
-  /**
-   * Returns the name of the type of instances of class c.
-   *
-   * <p>This function accepts any class, not just those of legal Starlark values, and may be used
-   * for reporting error messages involving arbitrary Java classes, for example at the interface
-   * between Starlark and Java.
-   */
-  // TODO(adonovan): reconsider allowing any classes other than String, Integer, Boolean, and
-  // subclasses of StarlarkValue, with a special exception for Object.class meaning "any Starlark
-  // value" (not: any Java object). Ditto for Depset.ElementType.
-  public static String classType(Class<?> c) {
-    // Check for "direct hits" first to avoid needing to scan for annotations.
-    if (c.equals(String.class)) {
-      return "string";
-    } else if (c.equals(Integer.class)) {
-      return "int";
-    } else if (c.equals(Boolean.class)) {
-      return "bool";
-    }
-
-    // Shortcut for the most common types.
-    // These cases can be handled by `getStarlarkBuiltin`
-    // but `getStarlarkBuiltin` is quite expensive.
-    if (c.equals(StarlarkList.class)) {
-      return "list";
-    } else if (c.equals(Tuple.class)) {
-      return "tuple";
-    } else if (c.equals(Dict.class)) {
-      return "dict";
-    } else if (c.equals(NoneType.class)) {
-      return "NoneType";
-    } else if (c.equals(StarlarkFunction.class)) {
-      return "function";
-    } else if (c.equals(RangeList.class)) {
-      return "range";
-    }
-
-    StarlarkBuiltin module = StarlarkInterfaceUtils.getStarlarkBuiltin(c);
-    if (module != null) {
-      return module.name();
-
-    } else if (StarlarkCallable.class.isAssignableFrom(c)) {
-      // All callable values have historically been lumped together as "function".
-      // TODO(adonovan): built-in types that don't use StarlarkModule should report
-      // their own type string, but this is a breaking change as users often
-      // use type(x)=="function" for Starlark and built-in functions.
-      return "function";
-
-    } else if (c.equals(Object.class)) {
-      // "Unknown" is another unfortunate choice.
-      // Object.class does mean "unknown" when talking about the type parameter
-      // of a collection (List<Object>), but it also means "any" when used
-      // as an argument to Sequence.cast, and more generally it means "value".
-      return "unknown";
-
-    } else if (List.class.isAssignableFrom(c)) {
-      // Any class of java.util.List that isn't a Sequence.
-      return "List";
-
-    } else if (Map.class.isAssignableFrom(c)) {
-      // Any class of java.util.Map that isn't a Dict.
-      return "Map";
-
-    } else {
-      String simpleName = c.getSimpleName();
-      return simpleName.isEmpty() ? c.getName() : simpleName;
-    }
-  }
-
-  /** Returns the string form of a value as if by the Starlark expression {@code str(x)}. */
-  public static String str(Object x) {
-    return new Printer().str(x).toString();
-  }
-
-  /** Returns the string form of a value as if by the Starlark expression {@code repr(x)}. */
-  public static String repr(Object x) {
-    return new Printer().repr(x).toString();
-  }
-
-  /** Returns a string formatted as if by the Starlark expression {@code pattern % arguments}. */
-  public static String format(String pattern, Object... arguments) {
-    Printer pr = new Printer();
-    Printer.format(pr, pattern, arguments);
-    return pr.toString();
-  }
-
-  /** Returns a string formatted as if by the Starlark expression {@code pattern % arguments}. */
-  public static String formatWithList(String pattern, List<?> arguments) {
-    Printer pr = new Printer();
-    Printer.formatWithList(pr, pattern, arguments);
-    return pr.toString();
-  }
-
-  /** Returns a slice of a sequence as if by the Starlark operation {@code x[start:stop:step]}. */
-  public static Object slice(
-      Mutability mu, Object x, Object startObj, Object stopObj, Object stepObj)
-      throws EvalException {
-    int n;
-    if (x instanceof String) {
-      n = ((String) x).length();
-    } else if (x instanceof Sequence) {
-      n = ((Sequence) x).size();
-    } else {
-      throw errorf("invalid slice operand: %s", type(x));
-    }
-
-    int start;
-    int stop;
-    int step;
-
-    // step
-    if (stepObj == NONE) {
-      step = 1;
-    } else {
-      step = toInt(stepObj, "slice step");
-      if (step == 0) {
-        throw errorf("slice step cannot be zero");
-      }
-    }
-
-    // start, stop
-    if (step > 0) {
-      // positive stride: default indices are [0:n].
-      if (startObj == NONE) {
-        start = 0;
-      } else {
-        start = EvalUtils.toIndex(toInt(startObj, "start index"), n);
-      }
-
-      if (stopObj == NONE) {
-        stop = n;
-      } else {
-        stop = EvalUtils.toIndex(toInt(stopObj, "stop index"), n);
-      }
-
-      if (stop < start) {
-        stop = start; // => empty result
-      }
-
-    } else {
-      // negative stride: default indices are effectively [n-1:-1],
-      // though to get this effect using explicit indices requires
-      // [n-1:-1-n:-1] because of the treatment of negative values.
-      if (startObj == NONE) {
-        start = n - 1;
-      } else {
-        start = toInt(startObj, "start index");
-        if (start < 0) {
-          start += n;
-        }
-        if (start >= n) {
-          start = n - 1;
-        }
-      }
-
-      if (stopObj == NONE) {
-        stop = -1;
-      } else {
-        stop = toInt(stopObj, "stop index");
-        if (stop < 0) {
-          stop += n;
-        }
-        if (stop < -1) {
-          stop = -1;
-        }
-      }
-
-      if (start < stop) {
-        start = stop; // => empty result
-      }
-    }
-
-    // slice operation
-    if (x instanceof String) {
-      return StringModule.slice((String) x, start, stop, step);
-    } else {
-      return ((Sequence<?>) x).getSlice(mu, start, stop, step);
-    }
-  }
-
-  static int toInt(Object x, String name) throws EvalException {
-    if (x instanceof Integer) {
-      return (Integer) x;
-    }
-    throw errorf("got %s for %s, want int", type(x), name);
-  }
-
-  /**
-   * Calls the function-like value {@code fn} in the specified thread, passing it the given
-   * positional and named arguments, as if by the Starlark expression {@code fn(*args, **kwargs)}.
-   *
-   * <p>See also {@link #fastcall}.
-   */
-  public static Object call(
-      StarlarkThread thread, Object fn, List<Object> args, Map<String, Object> kwargs)
-      throws EvalException, InterruptedException {
-    Object[] named = new Object[2 * kwargs.size()];
-    int i = 0;
-    for (Map.Entry<String, Object> e : kwargs.entrySet()) {
-      named[i++] = e.getKey();
-      named[i++] = e.getValue();
-    }
-    return fastcall(thread, fn, args.toArray(), named);
-  }
-
-  /**
-   * Calls the function-like value {@code fn} in the specified thread, passing it the given
-   * positional and named arguments in the "fastcall" array representation.
-   *
-   * <p>The caller must not subsequently modify or even inspect the two arrays.
-   *
-   * <p>If the call throws a StackOverflowError or any instance of RuntimeException (other than
-   * UncheckedEvalException), regardless of whether it originates in a user-defined built-in
-   * function or a bug in the interpreter itself, the exception is wrapped by an
-   * UncheckedEvalException whose message includes the Starlark stack. The original exception may be
-   * retrieved using {@code getCause}.
-   */
-  public static Object fastcall(
-      StarlarkThread thread, Object fn, Object[] positional, Object[] named)
-      throws EvalException, InterruptedException {
-    StarlarkCallable callable;
-    if (fn instanceof StarlarkCallable) {
-      callable = (StarlarkCallable) fn;
-    } else {
-      // @StarlarkMethod(selfCall)?
-      MethodDescriptor desc =
-          CallUtils.getSelfCallMethodDescriptor(thread.getSemantics(), fn.getClass());
-      if (desc == null) {
-        throw errorf("'%s' object is not callable", type(fn));
-      }
-      callable = new BuiltinCallable(fn, desc.getName(), desc);
-    }
-
-    thread.push(callable);
-    try {
-      return callable.fastcall(thread, positional, named);
-    } catch (UncheckedEvalException ex) {
-      throw ex; // already wrapped
-    } catch (RuntimeException | StackOverflowError ex) {
-      throw new UncheckedEvalException(ex, thread.getCallStack());
-    } catch (EvalException ex) {
-      // If this exception was newly thrown, set its stack.
-      throw ex.ensureStack(thread);
-    } finally {
-      thread.pop();
-    }
-  }
-
-  /**
-   * An UncheckedEvalException decorates an unchecked exception with its Starlark stack, to help
-   * maintainers locate problematic source expressions. The original exception can be retrieved
-   * using {@code getCause}.
-   */
-  public static final class UncheckedEvalException extends RuntimeException {
-    private final ImmutableList<StarlarkThread.CallStackEntry> stack;
-
-    private UncheckedEvalException(
-        Throwable cause, ImmutableList<StarlarkThread.CallStackEntry> stack) {
-      super(cause);
-      this.stack = stack;
-    }
-
-    /** Returns the stack of Starlark calls active at the moment of the error. */
-    public ImmutableList<StarlarkThread.CallStackEntry> getCallStack() {
-      return stack;
-    }
-
-    @Override
-    public String getMessage() {
-      return String.format("%s (Starlark stack: %s)", super.getMessage(), stack);
-    }
-  }
-
-  /**
-   * Returns a new EvalException with no location and an error message produced by Java-style string
-   * formatting ({@code String.format(format, args)}). Use {@code errorf("%s", msg)} to produce an
-   * error message from a non-constant expression {@code msg}.
-   */
-  @FormatMethod
-  @CheckReturnValue // don't forget to throw it
-  public static EvalException errorf(String format, Object... args) {
-    return new EvalException(String.format(format, args));
-  }
-
-  // --- methods related to attributes (fields and methods) ---
-
-  /**
-   * Reports whether the value {@code x} has a field or method of the given name, as if by the
-   * Starlark expression {@code hasattr(x, name)}.
-   */
-  public static boolean hasattr(StarlarkSemantics semantics, Object x, String name)
-      throws EvalException {
-    return (x instanceof ClassObject && ((ClassObject) x).getValue(name) != null)
-        || CallUtils.getAnnotatedMethodNames(semantics, x.getClass()).contains(name);
-  }
-
-  /**
-   * Returns the named field or method of value {@code x}, as if by the Starlark expression {@code
-   * getattr(x, name, defaultValue)}. If the value has no such attribute, getattr returns {@code
-   * defaultValue} if non-null, or throws an EvalException otherwise.
-   */
-  public static Object getattr(
-      Mutability mu,
-      StarlarkSemantics semantics,
-      Object x,
-      String name,
-      @Nullable Object defaultValue)
-      throws EvalException, InterruptedException {
-    // StarlarkMethod-annotated field or method?
-    MethodDescriptor method = CallUtils.getAnnotatedMethod(semantics, x.getClass(), name);
-    if (method != null) {
-      if (method.isStructField()) {
-        return method.callField(x, semantics, mu);
-      } else {
-        return new BuiltinCallable(x, name, method);
-      }
-    }
-
-    // user-defined field?
-    if (x instanceof ClassObject) {
-      ClassObject obj = (ClassObject) x;
-      Object field = obj.getValue(semantics, name);
-      if (field != null) {
-        return Starlark.checkValid(field);
-      }
-
-      if (defaultValue != null) {
-        return defaultValue;
-      }
-
-      String error = obj.getErrorMessageForUnknownField(name);
-      if (error != null) {
-        throw Starlark.errorf("%s", error);
-      }
-
-    } else if (defaultValue != null) {
-      return defaultValue;
-    }
-
-    throw Starlark.errorf(
-        "'%s' value has no field or method '%s'%s",
-        Starlark.type(x), name, SpellChecker.didYouMean(name, dir(mu, semantics, x)));
-  }
-
-  /**
-   * Returns a new sorted list containing the names of the Starlark-accessible fields and methods of
-   * the specified value, as if by the Starlark expression {@code dir(x)}.
-   */
-  public static StarlarkList<String> dir(Mutability mu, StarlarkSemantics semantics, Object x) {
-    // Order the fields alphabetically.
-    Set<String> fields = new TreeSet<>();
-    if (x instanceof ClassObject) {
-      fields.addAll(((ClassObject) x).getFieldNames());
-    }
-    fields.addAll(CallUtils.getAnnotatedMethodNames(semantics, x.getClass()));
-    return StarlarkList.copyOf(mu, fields);
-  }
-
-  // --- methods related to StarlarkMethod-annotated classes ---
-
-  /**
-   * Returns the value of the named field of Starlark value {@code x}, as defined by a Java method
-   * with a {@code StarlarkMethod(structField=true)} annotation.
-   *
-   * <p>Most callers should use {@link #getattr} instead.
-   */
-  public static Object getAnnotatedField(StarlarkSemantics semantics, Object x, String name)
-      throws EvalException, InterruptedException {
-    return CallUtils.getAnnotatedField(semantics, x, name);
-  }
-
-  /**
-   * Returns the names of the fields of Starlark value {@code x}, as defined by Java methods with
-   * {@code StarlarkMethod(structField=true)} annotations under the specified semantics.
-   *
-   * <p>Most callers should use {@link #dir} instead.
-   */
-  public static ImmutableSet<String> getAnnotatedFieldNames(StarlarkSemantics semantics, Object x) {
-    return CallUtils.getAnnotatedFieldNames(semantics, x);
-  }
-
-  /**
-   * Returns a map from annotated methods of the specified class to their corresponding {@link
-   * StarlarkMethod} annotations. Elements are ordered by Java method name, which is not necessarily
-   * the same as the Starlark attribute name.
-   *
-   * <p>Most callers should use {@link #dir} and {@link #getattr} instead.
-   */
-  public static ImmutableMap<Method, StarlarkMethod> getAnnotatedMethods(Class<?> clazz) {
-    return CallUtils.getAnnotatedMethods(clazz);
-  }
-
-  /**
-   * Returns the {@code StarlarkMethod(selfCall=true)}-annotated Java method of the specified Java
-   * class that is called when Starlark calls an instance of that class like a function. It returns
-   * null if no such method exists.
-   */
-  @Nullable
-  public static Method getSelfCallMethod(StarlarkSemantics semantics, Class<?> clazz) {
-    return CallUtils.getSelfCallMethod(semantics, clazz);
-  }
-
-  /** Equivalent to {@code addMethods(env, v, StarlarkSemantics.DEFAULT)}. */
-  public static void addMethods(ImmutableMap.Builder<String, Object> env, Object v) {
-    addMethods(env, v, StarlarkSemantics.DEFAULT);
-  }
-
-  /**
-   * Adds to the environment {@code env} all {@code StarlarkCallable}-annotated fields and methods
-   * of value {@code v}, filtered by the given semantics. The class of {@code v} must have or
-   * inherit a {@link StarlarkBuiltin} or {@code StarlarkGlobalLibrary} annotation.
-   */
-  public static void addMethods(
-      ImmutableMap.Builder<String, Object> env, Object v, StarlarkSemantics semantics) {
-    Class<?> cls = v.getClass();
-    if (!StarlarkInterfaceUtils.hasStarlarkGlobalLibrary(cls)
-        && StarlarkInterfaceUtils.getStarlarkBuiltin(cls) == null) {
-      throw new IllegalArgumentException(
-          cls.getName() + " is annotated with neither @StarlarkGlobalLibrary nor @StarlarkBuiltin");
-    }
-    for (String name : CallUtils.getAnnotatedMethodNames(semantics, v.getClass())) {
-      // We use the 2-arg (desc=null) BuiltinCallable constructor instead of passing
-      // the descriptor that CallUtils.getAnnotatedMethod would return,
-      // because most calls to addMethods pass StarlarkSemantics.DEFAULT,
-      // which is probably incorrect for the call.
-      // The effect is that the default semantics determine which methods appear in
-      // env, but the thread's semantics determine which method calls succeed.
-      env.put(name, new BuiltinCallable(v, name));
-    }
-  }
-
-  /**
-   * Adds to the environment {@code env} the value {@code v}, under its annotated name. The class of
-   * {@code v} must have or inherit a {@link StarlarkBuiltin} annotation.
-   */
-  public static void addModule(ImmutableMap.Builder<String, Object> env, Object v) {
-    Class<?> cls = v.getClass();
-    StarlarkBuiltin annot = StarlarkInterfaceUtils.getStarlarkBuiltin(cls);
-    if (annot == null) {
-      throw new IllegalArgumentException(cls.getName() + " is not annotated with @StarlarkBuiltin");
-    }
-    env.put(annot.name(), v);
-  }
-
-  /**
-   * Parses the input as a file, resolves it in the specified module environment, compiles it, and
-   * executes it in the specified thread. On success it returns None, unless the file's final
-   * statement is an expression, in which case its value is returned.
-   *
-   * @throws SyntaxError.Exception if there were (static) scanner, parser, or resolver errors.
-   * @throws EvalException if there was a (dynamic) evaluation error.
-   * @throws InterruptedException if the Java thread was interrupted during evaluation.
-   */
-  public static Object execFile(
-      ParserInput input, FileOptions options, Module module, StarlarkThread thread)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    StarlarkFile file = StarlarkFile.parse(input, options);
-    Program prog = Program.compileFile(file, module);
-    return execFileProgram(prog, module, thread);
-  }
-
-  /** Variant of {@link #execFile} that creates a module for the given predeclared environment. */
-  // TODO(adonovan): is this needed?
-  public static Object execFile(
-      ParserInput input,
-      FileOptions options,
-      Map<String, Object> predeclared,
-      StarlarkThread thread)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    Module module = Module.withPredeclared(thread.getSemantics(), predeclared);
-    return execFile(input, options, module, thread);
-  }
-
-  /**
-   * Executes a compiled Starlark file (as obtained from {@link Program#compileFile}) in the given
-   * StarlarkThread. On success it returns None, unless the file's final statement is an expression,
-   * in which case its value is returned.
-   *
-   * @throws EvalException if there was a (dynamic) evaluation error.
-   * @throws InterruptedException if the Java thread was interrupted during evaluation.
-   */
-  public static Object execFileProgram(Program prog, Module module, StarlarkThread thread)
-      throws EvalException, InterruptedException {
-    Tuple<Object> defaultValues = Tuple.empty();
-    StarlarkFunction toplevel =
-        new StarlarkFunction(prog.getResolvedFunction(), defaultValues, module);
-    return Starlark.fastcall(thread, toplevel, NOARGS, NOARGS);
-  }
-
-  private static final Object[] NOARGS = {};
-
-  /**
-   * Parses the input as an expression, resolves it in the specified module environment, compiles
-   * it, evaluates it, and returns its value.
-   *
-   * @throws SyntaxError.Exception if there were (static) scanner, parser, or resolver errors.
-   * @throws EvalException if there was a (dynamic) evaluation error.
-   * @throws InterruptedException if the Java thread was interrupted during evaluation.
-   */
-  public static Object eval(
-      ParserInput input, FileOptions options, Module module, StarlarkThread thread)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    StarlarkFunction fn = newExprFunction(input, options, module);
-    return Starlark.fastcall(thread, fn, NOARGS, NOARGS);
-  }
-
-  /** Variant of {@link #eval} that creates a module for the given predeclared environment. */
-  // TODO(adonovan): is this needed?
-  public static Object eval(
-      ParserInput input,
-      FileOptions options,
-      Map<String, Object> predeclared,
-      StarlarkThread thread)
-      throws SyntaxError.Exception, EvalException, InterruptedException {
-    Module module = Module.withPredeclared(thread.getSemantics(), predeclared);
-    return eval(input, options, module, thread);
-  }
-
-  /**
-   * Parses the input as an expression, resolves it in the specified module environment, and returns
-   * a callable no-argument Starlark function value that computes and returns the value of the
-   * expression.
-   *
-   * @throws SyntaxError.Exception if there were scanner, parser, or resolver errors.
-   */
-  public static StarlarkFunction newExprFunction(
-      ParserInput input, FileOptions options, Module module) throws SyntaxError.Exception {
-    Expression expr = Expression.parse(input, options);
-    Program prog = Program.compileExpr(expr, module, options);
-    Tuple<Object> defaultValues = Tuple.empty();
-    return new StarlarkFunction(prog.getResolvedFunction(), defaultValues, module);
-  }
-
-  /**
-   * Starts the CPU profiler with the specified sampling period, writing a pprof profile to {@code
-   * out}. All running Starlark threads are profiled. May be called concurrent with Starlark
-   * execution.
-   *
-   * @throws IllegalStateException exception if the Starlark profiler is already running or if the
-   *     operating system's profiling resources for this process are already in use.
-   */
-  public static void startCpuProfile(OutputStream out, Duration period) {
-    CpuProfiler.start(out, period);
-  }
-
-  /**
-   * Stops the profiler and waits for the log to be written. Throws an unchecked exception if the
-   * profiler was not already started by a prior call to {@link #startCpuProfile}.
-   */
-  public static void stopCpuProfile() throws IOException {
-    CpuProfiler.stop();
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java
deleted file mode 100644
index 85723db..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java
+++ /dev/null
@@ -1,98 +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.Maps;
-import java.util.LinkedHashMap;
-
-/**
- * The StarlarkCallable interface is implemented by all Starlark values that may be called from
- * Starlark like a function, including built-in functions and methods, Starlark functions, and
- * application-defined objects (such as rules, aspects, and providers in Bazel).
- *
- * <p>It defines two methods: {@code fastcall}, for performance, or {@code call} for convenience. By
- * default, {@code fastcall} delegates to {@code call}, and call throws an exception, so an
- * implementer may override either one.
- */
-public interface StarlarkCallable extends StarlarkValue {
-
-  /**
-   * Defines the "convenient" implementation of function calling for a callable value.
-   *
-   * <p>Do not call this function directly. Use the {@link Starlark#call} function to make a call,
-   * as it handles necessary book-keeping such as maintenance of the call stack, exception handling,
-   * and so on.
-   *
-   * <p>The default implementation throws an EvalException.
-   *
-   * <p>See {@link Starlark#fastcall} for basic information about function calls.
-   *
-   * @param thread the StarlarkThread in which the function is called
-   * @param args a tuple of the arguments passed by position
-   * @param kwargs a new, mutable dict of the arguments passed by keyword. Iteration order is
-   *     determined by keyword order in the call expression.
-   */
-  default Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
-      throws EvalException, InterruptedException {
-    throw Starlark.errorf("function %s not implemented", getName());
-  }
-
-  /**
-   * Defines the "fast" implementation of function calling for a callable value.
-   *
-   * <p>Do not call this function directly. Use the {@link Starlark#call} or {@link
-   * Starlark#fastcall} function to make a call, as it handles necessary book-keeping such as
-   * maintenance of the call stack, exception handling, and so on.
-   *
-   * <p>The fastcall implementation takes ownership of the two arrays, and may retain them
-   * indefinitely or modify them. The caller must not modify or even access the two arrays after
-   * making the call.
-   *
-   * <p>This method defines the low-level or "fast" calling convention. A more convenient interface
-   * is provided by the {@link #call} method, which provides a signature analogous to {@code def
-   * f(*args, **kwargs)}, or possibly the "self-call" feature of the {@link StarlarkMethod#selfCall}
-   * annotation mechanism.
-   *
-   * <p>The default implementation forwards the call to {@code call}, after rejecting any duplicate
-   * named arguments. Other implementations of this method should similarly reject duplicates.
-   *
-   * <p>See {@link Starlark#fastcall} for basic information about function calls.
-   *
-   * @param thread the StarlarkThread in which the function is called
-   * @param positional a list of positional arguments
-   * @param named a list of named arguments, as alternating Strings/Objects. May contain dups.
-   */
-  default Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
-      throws EvalException, InterruptedException {
-    LinkedHashMap<String, Object> kwargs = Maps.newLinkedHashMapWithExpectedSize(named.length >> 1);
-    for (int i = 0; i < named.length; i += 2) {
-      if (kwargs.put((String) named[i], named[i + 1]) != null) {
-        throw Starlark.errorf("%s got multiple values for parameter '%s'", this, named[i]);
-      }
-    }
-    return call(thread, Tuple.of(positional), Dict.wrap(thread.mutability(), kwargs));
-  }
-
-  /** Returns the form this callable value should take in a stack trace. */
-  String getName();
-
-  /**
-   * Returns the location of the definition of this callable value, or BUILTIN if it was not defined
-   * in Starlark code.
-   */
-  default Location getLocation() {
-    return Location.BUILTIN;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFile.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFile.java
deleted file mode 100644
index e601938..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFile.java
+++ /dev/null
@@ -1,186 +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 com.google.common.collect.ImmutableList;
-import java.util.Collections;
-import java.util.List;
-import javax.annotation.Nullable;
-
-/**
- * Syntax tree for a Starlark file, such as a Bazel BUILD or .bzl file.
- *
- * <p>Call {@link #parse} to parse a file. Parser errors are recorded in the syntax tree (see {@link
- * #errors}), which may be incomplete.
- */
-public final class StarlarkFile extends Node {
-
-  private final ImmutableList<Statement> statements;
-  private final FileOptions options;
-  private final ImmutableList<Comment> comments;
-  final List<SyntaxError> errors; // appended to by Resolver
-
-  // set by resolver
-  @Nullable private Resolver.Function resolved;
-
-  @Override
-  public int getStartOffset() {
-    return 0;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return locs.size();
-  }
-
-  private StarlarkFile(
-      FileLocations locs,
-      ImmutableList<Statement> statements,
-      FileOptions options,
-      ImmutableList<Comment> comments,
-      List<SyntaxError> errors) {
-    super(locs);
-    this.statements = statements;
-    this.options = options;
-    this.comments = comments;
-    this.errors = errors;
-  }
-
-  // Creates a StarlarkFile from the given effective list of statements,
-  // which may include the prelude.
-  private static StarlarkFile create(
-      FileLocations locs,
-      ImmutableList<Statement> statements,
-      FileOptions options,
-      Parser.ParseResult result) {
-    return new StarlarkFile(
-        locs, statements, options, ImmutableList.copyOf(result.comments), result.errors);
-  }
-
-  /** Extract a subtree containing only statements from i (included) to j (excluded). */
-  public StarlarkFile subTree(int i, int j) {
-    return new StarlarkFile(
-        this.locs,
-        this.statements.subList(i, j),
-        this.options,
-        /*comments=*/ ImmutableList.of(),
-        errors);
-  }
-  /**
-   * Returns an unmodifiable view of the list of scanner, parser, and (perhaps) resolver errors
-   * accumulated in this Starlark file.
-   */
-  public List<SyntaxError> errors() {
-    return Collections.unmodifiableList(errors);
-  }
-
-  /** Returns errors().isEmpty(). */
-  public boolean ok() {
-    return errors.isEmpty();
-  }
-
-  /** Returns an (immutable, ordered) list of statements in this BUILD file. */
-  public ImmutableList<Statement> getStatements() {
-    return statements;
-  }
-
-  /** Returns an (immutable, ordered) list of comments in this BUILD file. */
-  public ImmutableList<Comment> getComments() {
-    return comments;
-  }
-
-  @Override
-  public String toString() {
-    return "<StarlarkFile with " + statements.size() + " statements>";
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  void setResolvedFunction(Resolver.Function resolved) {
-    this.resolved = resolved;
-  }
-
-  /**
-   * Returns information about the implicit function containing the top-level statements of the
-   * file. Set by the resolver.
-   */
-  @Nullable
-  public Resolver.Function getResolvedFunction() {
-    return resolved;
-  }
-
-  /**
-   * Parse the specified file, returning its syntax tree with the prelude statements inserted at the
-   * front of its statement list.
-   */
-  public static StarlarkFile parseWithPrelude(
-      ParserInput input, List<Statement> prelude, FileOptions options) {
-    Parser.ParseResult result = Parser.parseFile(input, options);
-
-    ImmutableList.Builder<Statement> stmts = ImmutableList.builder();
-    stmts.addAll(prelude);
-    stmts.addAll(result.statements);
-
-    return create(result.locs, stmts.build(), options, result);
-  }
-
-  /**
-   * Parse a Starlark file.
-   *
-   * <p>A syntax tree is always returned, even in case of error. Errors are recorded in the tree.
-   * Example usage:
-   *
-   * <pre>
-   * StarlarkFile file = StarlarkFile.parse(input, options);
-   * if (!file.ok()) {
-   *    Event.replayEventsOn(handler, file.errors());
-   *    ...
-   * }
-   * </pre>
-   */
-  public static StarlarkFile parse(ParserInput input, FileOptions options) {
-    Parser.ParseResult result = Parser.parseFile(input, options);
-    return create(result.locs, ImmutableList.copyOf(result.statements), options, result);
-  }
-
-  /** Parse a Starlark file with default options. */
-  public static StarlarkFile parse(ParserInput input) {
-    return parse(input, FileOptions.DEFAULT);
-  }
-
-  /** Returns the options specified when parsing this file. */
-  public FileOptions getOptions() {
-    return options;
-  }
-
-  /** Returns the name of this file, as specified to the parser. */
-  public String getName() {
-    return locs.file();
-  }
-
-  /** A ParseProfiler records the start and end times of parse operations. */
-  public interface ParseProfiler {
-    Object start(String filename);
-
-    void end(Object span);
-  }
-
-  /** Installs a global hook that will be notified of parse operations. */
-  public static void setParseProfiler(@Nullable ParseProfiler p) {
-    Parser.profiler = p;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java
deleted file mode 100644
index f2cfe9f..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java
+++ /dev/null
@@ -1,363 +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 com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import javax.annotation.Nullable;
-import net.starlark.java.spelling.SpellChecker;
-
-/** A StarlarkFunction is a function value created by a Starlark {@code def} statement. */
-public final class StarlarkFunction implements StarlarkCallable {
-
-  private final Resolver.Function rfn;
-  private final Module module; // a function closes over its defining module
-  private final Tuple<Object> defaultValues;
-
-  StarlarkFunction(Resolver.Function rfn, Tuple<Object> defaultValues, Module module) {
-    this.rfn = rfn;
-    this.module = module;
-    this.defaultValues = defaultValues;
-  }
-
-  boolean isToplevel() {
-    return rfn.isToplevel();
-  }
-
-  // TODO(adonovan): many functions would be simpler if
-  // parameterNames excluded the *args and **kwargs parameters,
-  // (whose names are immaterial to the callee anyway). Do that.
-  // Also, reject getDefaultValue for varargs and kwargs.
-
-  /**
-   * Returns the default value of the ith parameter ({@code 0 <= i < getParameterNames().size()}),
-   * or null if the parameter is required. Residual parameters, if any, are always last, and have no
-   * default value.
-   */
-  @Nullable
-  public Object getDefaultValue(int i) {
-    if (i < 0 || i >= rfn.getParameters().size()) {
-      throw new IndexOutOfBoundsException();
-    }
-    int nparams =
-        rfn.getParameters().size() - (rfn.hasKwargs() ? 1 : 0) - (rfn.hasVarargs() ? 1 : 0);
-    int prefix = nparams - defaultValues.size();
-    if (i < prefix) {
-      return null; // implicit prefix of mandatory parameters
-    }
-    if (i < nparams) {
-      Object v = defaultValues.get(i - prefix);
-      return v == MANDATORY ? null : v;
-    }
-    return null; // *args or *kwargs
-  }
-
-  /**
-   * Returns the names of this function's parameters. The residual {@code *args} and {@code
-   * **kwargs} parameters, if any, are always last.
-   */
-  public ImmutableList<String> getParameterNames() {
-    return rfn.getParameterNames();
-  }
-
-  /**
-   * Reports whether this function has a residual positional arguments parameter, {@code def
-   * f(*args)}.
-   */
-  public boolean hasVarargs() {
-    return rfn.hasVarargs();
-  }
-
-  /**
-   * Reports whether this function has a residual keyword arguments parameter, {@code def
-   * f(**kwargs)}.
-   */
-  public boolean hasKwargs() {
-    return rfn.hasKwargs();
-  }
-
-  /** Returns the location of the function's defining identifier. */
-  @Override
-  public Location getLocation() {
-    return rfn.getLocation();
-  }
-
-  /**
-   * Returns the name of the function. Implicit functions (those not created by a def statement),
-   * may have names such as "<toplevel>" or "<expr>".
-   */
-  @Override
-  public String getName() {
-    return rfn.getName();
-  }
-
-  /** Returns the value denoted by the function's doc string literal, or null if absent. */
-  @Nullable
-  public String getDocumentation() {
-    if (rfn.getBody().isEmpty()) {
-      return null;
-    }
-    Statement first = rfn.getBody().get(0);
-    if (!(first instanceof ExpressionStatement)) {
-      return null;
-    }
-    Expression expr = ((ExpressionStatement) first).getExpression();
-    if (!(expr instanceof StringLiteral)) {
-      return null;
-    }
-    return ((StringLiteral) expr).getValue();
-  }
-
-  public Module getModule() {
-    return module;
-  }
-
-  @Override
-  public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
-      throws EvalException, InterruptedException {
-    if (thread.mutability().isFrozen()) {
-      throw Starlark.errorf("Trying to call in frozen environment");
-    }
-    if (thread.isRecursiveCall(this)) {
-      throw Starlark.errorf("function '%s' called recursively", getName());
-    }
-
-    // Compute the effective parameter values
-    // and update the corresponding variables.
-    Object[] arguments = processArgs(thread.mutability(), positional, named);
-
-    StarlarkThread.Frame fr = thread.frame(0);
-    ImmutableList<String> names = rfn.getParameterNames();
-    for (int i = 0; i < names.size(); ++i) {
-      fr.locals.put(names.get(i), arguments[i]);
-    }
-
-    return Eval.execFunctionBody(fr, rfn.getBody());
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    // TODO(adonovan): use the file name instead. But that's a breaking Bazel change.
-    Object clientData = module.getClientData();
-
-    printer.append("<function " + getName());
-    if (clientData != null) {
-      printer.append(" from " + clientData);
-    }
-    printer.append(">");
-  }
-
-  // Checks the positional and named arguments to ensure they match the signature. It returns a new
-  // array of effective parameter values corresponding to the parameters of the signature. Newly
-  // allocated values (e.g. a **kwargs dict) use the Mutability mu.
-  //
-  // If the function has optional parameters, their default values are supplied by getDefaultValue.
-  private Object[] processArgs(Mutability mu, Object[] positional, Object[] named)
-      throws EvalException {
-
-    // This is the general schema of a function:
-    //
-    //   def f(p1, p2=dp2, p3=dp3, *args, k1, k2=dk2, k3, **kwargs)
-    //
-    // The p parameters are non-kwonly, and may be specified positionally.
-    // The k parameters are kwonly, and must be specified by name.
-    // The defaults tuple is (dp2, dp3, MANDATORY, dk2, MANDATORY).
-    // The missing prefix (p1) is assumed to be all MANDATORY.
-    //
-    // Arguments are processed as follows:
-    // - positional arguments are bound to a prefix of [p1, p2, p3].
-    // - surplus positional arguments are bound to *args.
-    // - keyword arguments are bound to any of {p1, p2, p3, k1, k2, k3};
-    //   duplicate bindings are rejected.
-    // - surplus keyword arguments are bound to **kwargs.
-    // - defaults are bound to each parameter from p2 to k3 if no value was set.
-    //   default values come from the tuple above.
-    //   It is an error if the defaults tuple entry for an unset parameter is MANDATORY.
-
-    ImmutableList<String> names = rfn.getParameterNames();
-
-    // TODO(adonovan): when we have flat frames, pass in the locals array here instead of
-    // allocating.
-    Object[] arguments = new Object[names.size()];
-
-    // nparams is the number of ordinary parameters.
-    int nparams =
-        rfn.getParameters().size() - (rfn.hasKwargs() ? 1 : 0) - (rfn.hasVarargs() ? 1 : 0);
-
-    // numPositionalParams is the number of non-kwonly parameters.
-    int numPositionalParams = nparams - rfn.numKeywordOnlyParams();
-
-    // Too many positional args?
-    int n = positional.length;
-    if (n > numPositionalParams) {
-      if (!rfn.hasVarargs()) {
-        if (numPositionalParams > 0) {
-          throw Starlark.errorf(
-              "%s() accepts no more than %d positional argument%s but got %d",
-              getName(), numPositionalParams, plural(numPositionalParams), n);
-        } else {
-          throw Starlark.errorf(
-              "%s() does not accept positional arguments, but got %d", getName(), n);
-        }
-      }
-      n = numPositionalParams;
-    }
-    // Inv: n is number of positional arguments that are not surplus.
-
-    // Bind positional arguments to non-kwonly parameters.
-    for (int i = 0; i < n; i++) {
-      arguments[i] = positional[i];
-    }
-
-    // Bind surplus positional arguments to *args parameter.
-    if (rfn.hasVarargs()) {
-      arguments[nparams] = Tuple.wrap(Arrays.copyOfRange(positional, n, positional.length));
-    }
-
-    List<String> unexpected = null;
-
-    // named arguments
-    Dict<String, Object> kwargs = null;
-    if (rfn.hasKwargs()) {
-      kwargs = Dict.of(mu);
-      arguments[rfn.getParameters().size() - 1] = kwargs;
-    }
-    for (int i = 0; i < named.length; i += 2) {
-      String keyword = (String) named[i]; // safe
-      Object value = named[i + 1];
-      int pos = names.indexOf(keyword); // the list should be short, so linear scan is OK.
-      if (0 <= pos && pos < nparams) {
-        // keyword is the name of a named parameter
-        if (arguments[pos] != null) {
-          throw Starlark.errorf("%s() got multiple values for parameter '%s'", getName(), keyword);
-        }
-        arguments[pos] = value;
-
-      } else if (kwargs != null) {
-        // residual keyword argument
-        int sz = kwargs.size();
-        kwargs.put(keyword, value, null);
-        if (kwargs.size() == sz) {
-          throw Starlark.errorf(
-              "%s() got multiple values for keyword argument '%s'", getName(), keyword);
-        }
-
-      } else {
-        // unexpected keyword argument
-        if (unexpected == null) {
-          unexpected = new ArrayList<>();
-        }
-        unexpected.add(keyword);
-      }
-    }
-    if (unexpected != null) {
-      // Give a spelling hint if there is exactly one.
-      // More than that suggests the wrong function was called.
-      throw Starlark.errorf(
-          "%s() got unexpected keyword argument%s: %s%s",
-          getName(),
-          plural(unexpected.size()),
-          Joiner.on(", ").join(unexpected),
-          unexpected.size() == 1
-              ? SpellChecker.didYouMean(unexpected.get(0), names.subList(0, nparams))
-              : "");
-    }
-
-    // Apply defaults and report errors for missing required arguments.
-    int m = nparams - defaultValues.size(); // first default
-    List<String> missingPositional = null;
-    List<String> missingKwonly = null;
-    for (int i = n; i < nparams; i++) {
-      // provided?
-      if (arguments[i] != null) {
-        continue;
-      }
-
-      // optional?
-      if (i >= m) {
-        Object dflt = defaultValues.get(i - m);
-        if (dflt != MANDATORY) {
-          arguments[i] = dflt;
-          continue;
-        }
-      }
-
-      // missing
-      if (i < numPositionalParams) {
-        if (missingPositional == null) {
-          missingPositional = new ArrayList<>();
-        }
-        missingPositional.add(names.get(i));
-      } else {
-        if (missingKwonly == null) {
-          missingKwonly = new ArrayList<>();
-        }
-        missingKwonly.add(names.get(i));
-      }
-    }
-    if (missingPositional != null) {
-      throw Starlark.errorf(
-          "%s() missing %d required positional argument%s: %s",
-          getName(),
-          missingPositional.size(),
-          plural(missingPositional.size()),
-          Joiner.on(", ").join(missingPositional));
-    }
-    if (missingKwonly != null) {
-      throw Starlark.errorf(
-          "%s() missing %d required keyword-only argument%s: %s",
-          getName(),
-          missingKwonly.size(),
-          plural(missingKwonly.size()),
-          Joiner.on(", ").join(missingKwonly));
-    }
-
-    return arguments;
-  }
-
-  private static String plural(int n) {
-    return n == 1 ? "" : "s";
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder out = new StringBuilder();
-    out.append(getName());
-    out.append('(');
-    String sep = "";
-    // TODO(adonovan): include *, ** tokens.
-    for (String param : getParameterNames()) {
-      out.append(sep).append(param);
-      sep = ", ";
-    }
-    out.append(')');
-    return out.toString();
-  }
-
-  @Override
-  public boolean isImmutable() {
-    // Only correct because closures are not yet supported.
-    return true;
-  }
-
-  // The MANDATORY sentinel indicates a slot in the defaultValues
-  // tuple corresponding to a required parameter. It is not visible
-  // to Java or Starlark code.
-  static final Object MANDATORY = new Mandatory();
-
-  private static class Mandatory implements StarlarkValue {}
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIndexable.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIndexable.java
deleted file mode 100644
index 07717cd..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIndexable.java
+++ /dev/null
@@ -1,33 +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;
-
-/**
- * A Starlark value that support indexed access ({@code object[key]}) and membership tests ({@code
- * key in object}).
- */
-public interface StarlarkIndexable extends StarlarkValue {
-
-  /** Returns the value associated with the given key. */
-  Object getIndex(StarlarkSemantics semantics, Object key) throws EvalException;
-
-  /**
-   * Returns whether the key is in the object. New types should try to follow the semantics of dict:
-   * 'x in y' should return True when 'y[x]' is valid; otherwise, it should either be False or a
-   * failure. Note however that the builtin types string, list, and tuple do not follow this
-   * convention.
-   */
-  boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalException;
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIterable.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIterable.java
deleted file mode 100644
index 1db623f..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkIterable.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2019 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;
-
-/**
- * A StarlarkIterable value may be iterated by Starlark language constructs such as {@code for}
- * loops, list and dict comprehensions, and {@code f(*args)}.
- *
- * <p>Functionally this interface is equivalent to {@code java.lang.Iterable}, but it additionally
- * affirms that the iterability of a Java class should be exposed to Starlark programs.
- */
-public interface StarlarkIterable<T> extends StarlarkValue, Iterable<T> {}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkList.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkList.java
deleted file mode 100644
index a438d06..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkList.java
+++ /dev/null
@@ -1,476 +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 com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import java.util.AbstractList;
-import java.util.Arrays;
-import java.util.Collection;
-import javax.annotation.Nullable;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-import net.starlark.java.annot.StarlarkMethod;
-
-/** A StarlarkList is a mutable finite sequence of values. */
-@StarlarkBuiltin(
-    name = "list",
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc =
-        "The built-in list type. Example list expressions:<br>"
-            + "<pre class=language-python>x = [1, 2, 3]</pre>"
-            + "Accessing elements is possible using indexing (starts from <code>0</code>):<br>"
-            + "<pre class=language-python>e = x[1]   # e == 2</pre>"
-            + "Lists support the <code>+</code> operator to concatenate two lists. Example:<br>"
-            + "<pre class=language-python>x = [1, 2] + [3, 4]   # x == [1, 2, 3, 4]\n"
-            + "x = [\"a\", \"b\"]\n"
-            + "x += [\"c\"]            # x == [\"a\", \"b\", \"c\"]</pre>"
-            + "Similar to strings, lists support slice operations:"
-            + "<pre class=language-python>['a', 'b', 'c', 'd'][1:3]   # ['b', 'c']\n"
-            + "['a', 'b', 'c', 'd'][::2]  # ['a', 'c']\n"
-            + "['a', 'b', 'c', 'd'][3:0:-1]  # ['d', 'c', 'b']</pre>"
-            + "Lists are mutable, as in Python.")
-public final class StarlarkList<E> extends AbstractList<E>
-    implements Sequence<E>, StarlarkValue, Mutability.Freezable {
-
-  // The implementation strategy is similar to ArrayList,
-  // but without the extra indirection of using ArrayList.
-
-  private int size;
-  private int iteratorCount; // number of active iterators (unused once frozen)
-  private Object[] elems = EMPTY_ARRAY; // elems[i] == null  iff  i >= size
-
-  /** Final except for {@link #unsafeShallowFreeze}; must not be modified any other way. */
-  private Mutability mutability;
-
-  private static final Object[] EMPTY_ARRAY = {};
-
-  private StarlarkList(@Nullable Mutability mutability, Object[] elems) {
-    this.elems = elems;
-    this.size = elems.length;
-    this.mutability = mutability == null ? Mutability.IMMUTABLE : mutability;
-  }
-
-  /**
-   * Takes ownership of the supplied array and returns a new StarlarkList instance that initially
-   * wraps the array. The caller must not subsequently modify the array, but the StarlarkList
-   * instance may do so.
-   */
-  static <T> StarlarkList<T> wrap(@Nullable Mutability mutability, Object[] elems) {
-    return new StarlarkList<>(mutability, elems);
-  }
-
-  @Override
-  public boolean isImmutable() {
-    return mutability().isFrozen();
-  }
-
-  @Override
-  public boolean isHashable() {
-    return false; // even a frozen list is unhashable in Starlark
-  }
-
-  @Override
-  public boolean updateIteratorCount(int delta) {
-    if (mutability().isFrozen()) {
-      return false;
-    }
-    if (delta > 0) {
-      iteratorCount++;
-    } else if (delta < 0) {
-      iteratorCount--;
-    }
-    return iteratorCount > 0;
-  }
-
-  /**
-   * A shared instance for the empty list with immutable mutability.
-   *
-   * <p>Other immutable empty list objects can exist, e.g. lists that were once mutable but whose
-   * environments were then frozen. This instance is for empty lists that were always frozen from
-   * the beginning.
-   */
-  private static final StarlarkList<?> EMPTY = wrap(Mutability.IMMUTABLE, EMPTY_ARRAY);
-
-  /** Returns an empty frozen list of the desired type. */
-  @SuppressWarnings("unchecked")
-  public static <T> StarlarkList<T> empty() {
-    return (StarlarkList<T>) EMPTY;
-  }
-
-  /** Returns a new, empty list with the specified Mutability. */
-  public static <T> StarlarkList<T> newList(Mutability mutability) {
-    return wrap(mutability, EMPTY_ARRAY);
-  }
-
-  /**
-   * Returns a {@code StarlarkList} whose items are given by an iterable and which has the given
-   * {@link Mutability}. If {@code mutability} is null, the list is immutable.
-   */
-  public static <T> StarlarkList<T> copyOf(
-      @Nullable Mutability mutability, Iterable<? extends T> elems) {
-    return wrap(mutability, Iterables.toArray(elems, Object.class));
-  }
-
-  /**
-   * Returns an immutable list with the given elements. Equivalent to {@code copyOf(null, elems)}.
-   */
-  public static <T> StarlarkList<T> immutableCopyOf(Iterable<? extends T> elems) {
-    return copyOf(null, elems);
-  }
-
-  /**
-   * Returns a {@code StarlarkList} with the given items and the {@link Mutability}. If {@code
-   * mutability} is null, the list is immutable.
-   */
-  public static <T> StarlarkList<T> of(@Nullable Mutability mutability, T... elems) {
-    return wrap(mutability, Arrays.copyOf(elems, elems.length));
-  }
-
-  @Override
-  public Mutability mutability() {
-    return mutability;
-  }
-
-  @Override
-  public void unsafeShallowFreeze() {
-    Mutability.Freezable.checkUnsafeShallowFreezePrecondition(this);
-    this.mutability = Mutability.IMMUTABLE;
-  }
-
-  @Override
-  public ImmutableList<E> getImmutableList() {
-    // Optimization: a frozen array needn't be copied.
-    // If the entire array is full, we can wrap it directly.
-    if (elems.length == size && mutability().isFrozen()) {
-      return Tuple.wrapImmutable(elems);
-    }
-
-    return ImmutableList.copyOf(this);
-  }
-
-  /**
-   * Returns a new {@code StarlarkList} that is the concatenation of two {@code StarlarkList}s. The
-   * new list will have the given {@link Mutability}.
-   */
-  public static <T> StarlarkList<T> concat(
-      StarlarkList<? extends T> x, StarlarkList<? extends T> y, Mutability mutability) {
-    Object[] res = new Object[x.size + y.size];
-    System.arraycopy(x.elems, 0, res, 0, x.size);
-    System.arraycopy(y.elems, 0, res, x.size, y.size);
-    return wrap(mutability, res);
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    // This slightly violates the java.util.List equivalence contract
-    // because it considers the class, not just the elements.
-    return this == that || (that instanceof StarlarkList && sameElems(this, ((StarlarkList) that)));
-  }
-
-  private static boolean sameElems(StarlarkList<?> x, StarlarkList<?> y) {
-    if (x.size != y.size) {
-      return false;
-    }
-    for (int i = 0; i < x.size; i++) {
-      if (!x.elems[i].equals(y.elems[i])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    // Roll our own hash code to avoid iterating through null part of elems.
-    int result = 1;
-    for (int i = 0; i < size; i++) {
-      result = 31 * result + elems[i].hashCode();
-    }
-    return 6047 + 4673 * result;
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    printer.printList(this, "[", ", ", "]");
-  }
-
-  // TODO(adonovan): StarlarkValue has 3 String methods yet still we need this fourth. Why?
-  @Override
-  public String toString() {
-    return Starlark.repr(this);
-  }
-
-  /** Returns a new StarlarkList containing n consecutive repeats of this tuple. */
-  public StarlarkList<E> repeat(int n, Mutability mutability) {
-    if (n <= 0) {
-      return wrap(mutability, EMPTY_ARRAY);
-    }
-
-    // TODO(adonovan): reject unreasonably large n.
-    Object[] res = new Object[n * size];
-    for (int i = 0; i < n; i++) {
-      System.arraycopy(elems, 0, res, i * size, size);
-    }
-    return wrap(mutability, res);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public E get(int i) {
-    return (E) elems[i]; // unchecked
-  }
-
-  @Override
-  public int size() {
-    return size;
-  }
-
-  @Override
-  public StarlarkList<E> getSlice(Mutability mu, int start, int stop, int step) {
-    RangeList indices = new RangeList(start, stop, step);
-    int n = indices.size();
-    Object[] res = new Object[n];
-    if (step == 1) { // common case
-      System.arraycopy(elems, indices.at(0), res, 0, n);
-    } else {
-      for (int i = 0; i < n; ++i) {
-        res[i] = elems[indices.at(i)];
-      }
-    }
-    return wrap(mu, res);
-  }
-
-  // Postcondition: elems.length >= mincap.
-  private void grow(int mincap) {
-    int oldcap = elems.length;
-    if (oldcap < mincap) {
-      int newcap = oldcap + (oldcap >> 1); // grow by at least 50%
-      if (newcap < mincap) {
-        newcap = mincap;
-      }
-      elems = Arrays.copyOf(elems, newcap);
-    }
-  }
-
-  /**
-   * Appends an element to the end of the list, after validating that mutation is allowed.
-   *
-   * @param element the element to add
-   * @param unused a nonce value to select this overload, not List.add
-   */
-  public void add(E element, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    grow(size + 1);
-    elems[size++] = element;
-  }
-
-  /**
-   * Inserts an element at a given position to the list.
-   *
-   * @param index the new element's index
-   * @param element the element to add
-   * @param unused a nonce value to select this overload, not List.add
-   */
-  public void add(int index, E element, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    grow(size + 1);
-    System.arraycopy(elems, index, elems, index + 1, size - index);
-    elems[index] = element;
-    size++;
-  }
-
-  /**
-   * Appends all the elements to the end of the list.
-   *
-   * @param elements the elements to add
-   * @param unused a nonce value to select this overload, not List.addAll
-   */
-  public void addAll(Iterable<? extends E> elements, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    if (elements instanceof StarlarkList) {
-      StarlarkList<?> that = (StarlarkList) elements;
-      // (safe even if this == that)
-      grow(this.size + that.size);
-      System.arraycopy(that.elems, 0, this.elems, this.size, that.size);
-      this.size += that.size;
-    } else if (elements instanceof Collection) {
-      // collection of known size
-      Collection<?> that = (Collection) elements;
-      grow(size + that.size());
-      for (Object x : that) {
-        elems[size++] = x;
-      }
-    } else {
-      // iterable
-      for (Object x : elements) {
-        grow(size + 1);
-        elems[size++] = x;
-      }
-    }
-  }
-
-  /**
-   * Removes the element at a given index. The index must already have been validated to be in
-   * range.
-   *
-   * @param index the index of the element to remove
-   * @param unused a nonce value to select this overload, not List.remove
-   */
-  public void remove(int index, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    int n = size - index - 1;
-    if (n > 0) {
-      System.arraycopy(elems, index + 1, elems, index, n);
-    }
-    elems[--size] = null; // aid GC
-  }
-
-  @StarlarkMethod(
-      name = "remove",
-      doc =
-          "Removes the first item from the list whose value is x. "
-              + "It is an error if there is no such item.",
-      parameters = {@Param(name = "x", type = Object.class, doc = "The object to remove.")})
-  public NoneType removeObject(Object x) throws EvalException {
-    for (int i = 0; i < size; i++) {
-      if (elems[i].equals(x)) {
-        remove(i, (Location) null);
-        return Starlark.NONE;
-      }
-    }
-    throw Starlark.errorf("item %s not found in list", Starlark.repr(x));
-  }
-
-  /**
-   * Sets the position at the given index to contain the given value. The index must already have
-   * been validated to be in range.
-   *
-   * @param index the position to change
-   * @param value the new value
-   * @param unused a nonce value to select this overload, not List.set
-   */
-  public void set(int index, E value, Location unused) throws EvalException {
-    Starlark.checkMutable(this);
-    elems[index] = value;
-  }
-
-  @StarlarkMethod(
-      name = "append",
-      doc = "Adds an item to the end of the list.",
-      parameters = {
-        @Param(name = "item", type = Object.class, doc = "Item to add at the end.", noneable = true)
-      })
-  @SuppressWarnings("unchecked")
-  public NoneType append(Object item) throws EvalException {
-    add((E) item, (Location) null); // unchecked
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(name = "clear", doc = "Removes all the elements of the list.")
-  public NoneType clearMethod() throws EvalException {
-    Starlark.checkMutable(this);
-    for (int i = 0; i < size; i++) {
-      elems[i] = null; // aid GC
-    }
-    size = 0;
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(
-      name = "insert",
-      doc = "Inserts an item at a given position.",
-      parameters = {
-        @Param(name = "index", type = Integer.class, doc = "The index of the given position."),
-        @Param(name = "item", type = Object.class, doc = "The item.", noneable = true)
-      })
-  @SuppressWarnings("unchecked")
-  public NoneType insert(Integer index, Object item) throws EvalException {
-    add(EvalUtils.toIndex(index, size), (E) item, (Location) null); // unchecked
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(
-      name = "extend",
-      doc = "Adds all items to the end of the list.",
-      parameters = {@Param(name = "items", type = Object.class, doc = "Items to add at the end.")})
-  public NoneType extend(Object items) throws EvalException {
-    @SuppressWarnings("unchecked")
-    Iterable<? extends E> src = (Iterable<? extends E>) Starlark.toIterable(items);
-    addAll(src, (Location) null);
-    return Starlark.NONE;
-  }
-
-  @StarlarkMethod(
-      name = "index",
-      doc =
-          "Returns the index in the list of the first item whose value is x. "
-              + "It is an error if there is no such item.",
-      parameters = {
-        @Param(name = "x", type = Object.class, doc = "The object to search."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "None",
-            noneable = true, // TODO(adonovan): this is wrong
-            named = true,
-            doc = "The start index of the list portion to inspect."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            defaultValue = "None",
-            noneable = true, // TODO(adonovan): this is wrong
-            named = true,
-            doc = "The end index of the list portion to inspect.")
-      })
-  public Integer index(Object x, Object start, Object end) throws EvalException {
-    int i = start == Starlark.NONE ? 0 : EvalUtils.toIndex((Integer) start, size);
-    int j = end == Starlark.NONE ? size : EvalUtils.toIndex((Integer) end, size);
-    for (; i < j; i++) {
-      if (elems[i].equals(x)) {
-        return i;
-      }
-    }
-    throw Starlark.errorf("item %s not found in list", Starlark.repr(x));
-  }
-
-  @StarlarkMethod(
-      name = "pop",
-      doc =
-          "Removes the item at the given position in the list, and returns it. "
-              + "If no <code>index</code> is specified, "
-              + "it removes and returns the last item in the list.",
-      parameters = {
-        @Param(
-            name = "i",
-            type = Integer.class,
-            noneable = true, // TODO(adonovan): this is wrong
-            defaultValue = "-1",
-            doc = "The index of the item.")
-      })
-  public Object pop(Object i) throws EvalException {
-    int arg = i == Starlark.NONE ? -1 : (Integer) i;
-    int index = EvalUtils.getSequenceIndex(arg, size);
-    Object result = elems[index];
-    remove(index, (Location) null);
-    return result;
-  }
-
-  @Override
-  public Object[] toArray() {
-    return size != 0 ? Arrays.copyOf(elems, size) : EMPTY_ARRAY;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
deleted file mode 100644
index 04b4937..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2019 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.base.Preconditions;
-import com.google.common.collect.ImmutableSortedMap;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A StarlarkSemantics is an immutable set of optional name/value pairs that affect the dynamic
- * behavior of Starlark operators and built-in functions, both core and application-defined.
- *
- * <p>For extensibility, a StarlarkSemantics only records a name/value pair when the value differs
- * from the default value appropriate to that name. Values of most types are accessed using a {@link
- * Key}, which defines the name, type, and default value for an entry. Boolean values are accessed
- * using a string key; the string must have the prefix "+" or "-", indicating the default value: +
- * for true, - for false. The reason for the special treatment of boolean entries is that they may
- * enable or disable methods and parameters in the StarlarkMethod annotation system, and it is not
- * possible to refer to a Key from a Java annotation, only a string.
- *
- * <p>It is the client's responsibility to ensure that a StarlarkSemantics does not encounter
- * multiple Keys of the same name but different value types.
- *
- * <p>For Bazel's semantics options, see {@link packages.semantics.BuildLanguageOptions}.
- *
- * <p>For options that affect the static behavior of the Starlark frontend (lexer, parser,
- * validator, compiler), see {@link FileOptions}.
- */
-public final class StarlarkSemantics {
-
-  /** Returns the empty semantics, in which every option has its default value. */
-  public static final StarlarkSemantics DEFAULT = new StarlarkSemantics(ImmutableSortedMap.of());
-
-  // A map entry must be accessed by Key iff its name has no [+-] prefix.
-  // Key<Boolean> is permitted too.
-  // We use ImmutableSortedMap for the benefit of equals/hashCode/toString.
-  private final ImmutableSortedMap<String, Object> map;
-  private final int hashCode;
-
-  private StarlarkSemantics(ImmutableSortedMap<String, Object> map) {
-    this.map = map;
-    this.hashCode = map.hashCode();
-  }
-
-  /** Returns the value of a boolean option, which must have a [+-] prefix. */
-  public boolean getBool(String name) {
-    char prefix = name.charAt(0);
-    Preconditions.checkArgument(prefix == '+' || prefix == '-');
-    boolean defaultValue = prefix == '+';
-    Boolean v = (Boolean) map.get(name); // prefix => cast cannot fail
-    return v != null ? v : defaultValue;
-  }
-
-  /** Returns the value of the option denoted by {@code key}. */
-  public <T> T get(Key<T> key) {
-    @SuppressWarnings("unchecked") // safe, if Key.names are unique
-    T v = (T) map.get(key.name);
-    return v != null ? v : key.defaultValue;
-  }
-
-  /** A Key identifies an option, providing its name, type, and default value. */
-  public static class Key<T> {
-    public final String name;
-    public final T defaultValue;
-
-    /**
-     * Constructs a key. The name must not start with [+-]. The value must not be subsequently
-     * modified.
-     */
-    public Key(String name, T defaultValue) {
-      char prefix = name.charAt(0);
-      Preconditions.checkArgument(prefix != '-' && prefix != '+');
-      this.name = name;
-      this.defaultValue = Preconditions.checkNotNull(defaultValue);
-    }
-
-    @Override
-    public String toString() {
-      return this.name;
-    }
-  }
-
-  /**
-   * Returns a new builder that initially holds the same key/value pairs as this StarlarkSemantics.
-   */
-  public Builder toBuilder() {
-    return new Builder(new HashMap<>(map));
-  }
-
-  /** Returns a new empty builder. */
-  public static Builder builder() {
-    return new Builder(new HashMap<>());
-  }
-
-  /** A Builder is a mutable container used to construct an immutable StarlarkSemantics. */
-  public static final class Builder {
-    private final HashMap<String, Object> map;
-
-    private Builder(HashMap<String, Object> map) {
-      this.map = map;
-    }
-
-    /** Sets the value for the specified key. */
-    public <T> Builder set(Key<T> key, T value) {
-      if (!value.equals(key.defaultValue)) {
-        map.put(key.name, value);
-      } else {
-        map.remove(key.name);
-      }
-      return this;
-    }
-
-    /** Sets the value for the boolean key, which must have a [+-] prefix. */
-    public Builder setBool(String name, boolean value) {
-      char prefix = name.charAt(0);
-      Preconditions.checkArgument(prefix == '+' || prefix == '-');
-      boolean defaultValue = prefix == '+';
-      if (value != defaultValue) {
-        map.put(name, value);
-      } else {
-        map.remove(name);
-      }
-      return this;
-    }
-
-    /** Returns an immutable StarlarkSemantics. */
-    public StarlarkSemantics build() {
-      return new StarlarkSemantics(ImmutableSortedMap.copyOf(map));
-    }
-  }
-
-  /**
-   * Returns true if a feature attached to the given toggling flags should be enabled.
-   *
-   * <ul>
-   *   <li>If both parameters are empty, this indicates the feature is not controlled by flags, and
-   *       should thus be enabled.
-   *   <li>If the {@code enablingFlag} parameter is non-empty, this returns true if and only if that
-   *       flag is true. (This represents a feature that is only on if a given flag is *on*).
-   *   <li>If the {@code disablingFlag} parameter is non-empty, this returns true if and only if
-   *       that flag is false. (This represents a feature that is only on if a given flag is *off*).
-   *   <li>It is illegal to pass both parameters as non-empty.
-   * </ul>
-   */
-  boolean isFeatureEnabledBasedOnTogglingFlags(String enablingFlag, String disablingFlag) {
-    Preconditions.checkArgument(
-        enablingFlag.isEmpty() || disablingFlag.isEmpty(),
-        "at least one of 'enablingFlag' or 'disablingFlag' must be empty");
-    if (!enablingFlag.isEmpty()) {
-      return this.getBool(enablingFlag);
-    } else if (!disablingFlag.isEmpty()) {
-      return !this.getBool(disablingFlag);
-    } else {
-      return true;
-    }
-  }
-
-  @Override
-  public int hashCode() {
-    return hashCode;
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    return this == that
-        || (that instanceof StarlarkSemantics && this.map.equals(((StarlarkSemantics) that).map));
-  }
-
-  /**
-   * Returns a representation of this StarlarkSemantics' non-default key/value pairs in key order.
-   */
-  @Override
-  public String toString() {
-    // Print "StarlarkSemantics{k=v, ...}", without +/- prefixes.
-    StringBuilder buf = new StringBuilder();
-    buf.append("StarlarkSemantics{");
-    String sep = "";
-    for (Map.Entry<String, Object> e : map.entrySet()) {
-      String key = e.getKey();
-      buf.append(sep);
-      sep = ", ";
-      if (key.charAt(0) == '+' || key.charAt(0) == '-') {
-        buf.append(key, 1, key.length());
-      } else {
-        buf.append(key);
-      }
-      buf.append('=').append(e.getValue());
-    }
-    return buf.append('}').toString();
-  }
-
-  // -- semantics options affecting the Starlark interpreter itself --
-
-  /** Ignore negative n in string.replace(count=n), and treat n=None as an error. */
-  public static final String INCOMPATIBLE_STRING_REPLACE_COUNT =
-      "-incompatible_string_replace_count";
-
-  /** Change the behavior of 'print' statements. Used in tests to verify flag propagation. */
-  public static final String PRINT_TEST_MARKER = "-print_test_marker";
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkThread.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkThread.java
deleted file mode 100644
index f6cc8b3..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkThread.java
+++ /dev/null
@@ -1,473 +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 com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.Immutable;
-
-/**
- * An StarlarkThread represents a Starlark thread.
- *
- * <p>It holds the stack of active Starlark and built-in function calls. In addition, it may hold
- * per-thread application state (see {@link #setThreadLocal}) that passes through Starlark functions
- * but does not directly affect them, such as information about the BUILD file being loaded.
- *
- * <p>Every {@code StarlarkThread} has a {@link Mutability} field, and must be used within a
- * function that creates and closes this {@link Mutability} with the try-with-resource pattern. This
- * {@link Mutability} is also used when initializing mutable objects within that {@code
- * StarlarkThread}. When the {@code Mutability} is closed at the end of the computation, it freezes
- * the {@code StarlarkThread} along with all of those objects. This pattern enforces the discipline
- * that there should be no dangling mutable {@code StarlarkThread}, or concurrency between
- * interacting {@code StarlarkThread}s. It is a Starlark-level error to attempt to mutate a frozen
- * {@code StarlarkThread} or its objects, but it is a Java-level error to attempt to mutate an
- * unfrozen {@code StarlarkThread} or its objects from within a different {@code StarlarkThread}.
- */
-public final class StarlarkThread {
-
-  /** The mutability of values created by this thread. */
-  private final Mutability mutability;
-
-  // profiler state
-  //
-  // The profiler field (and savedThread) are set when we first observe during a
-  // push (function call entry) that the profiler is active. They are unset
-  // not in the corresponding pop, but when the last frame is popped, because
-  // the profiler session might start in the middle of a call and/or run beyond
-  // the lifetime of this thread.
-  final AtomicInteger cpuTicks = new AtomicInteger();
-  @Nullable private CpuProfiler profiler;
-  StarlarkThread savedThread; // saved StarlarkThread, when profiling reentrant evaluation
-
-  private final Map<Class<?>, Object> threadLocals = new HashMap<>();
-
-  private boolean interruptible = true;
-
-  long steps; // count of logical computation steps executed so far
-  long stepLimit = Long.MAX_VALUE; // limit on logical computation steps
-
-  /**
-   * Returns the number of Starlark computation steps executed by this thread according to a
-   * small-step semantics. (Today, that means exec, eval, and assign operations executed by the
-   * tree-walking evaluator, but in future will mean byte code instructions; the two are not
-   * commensurable.)
-   */
-  public long getExecutedSteps() {
-    return steps;
-  }
-
-  /**
-   * Sets the maximum number of Starlark computation steps that may be executed by this thread (see
-   * {@link #getExecutedSteps}). When the step counter reaches or exceeds this value, execution
-   * fails with an EvalException.
-   */
-  public void setMaxExecutionSteps(long steps) {
-    this.stepLimit = steps;
-  }
-
-  /**
-   * Disables polling of the {@link java.lang.Thread#interrupted} flag during Starlark evaluation.
-   */
-  // TODO(adonovan): expose a public API for this if we can establish a stronger semantics. (There
-  // are other ways besides polling for evaluation to be interrupted, such as calling certain
-  // built-in functions.)
-  void ignoreThreadInterrupts() {
-    interruptible = false;
-  }
-
-  void checkInterrupt() throws InterruptedException {
-    if (interruptible && Thread.interrupted()) {
-      throw new InterruptedException();
-    }
-  }
-
-  /**
-   * setThreadLocal saves {@code value} as a thread-local variable of this Starlark thread, keyed by
-   * {@code key}, so that it can later be retrieved by {@code getThreadLocal(key)}.
-   */
-  public <T> void setThreadLocal(Class<T> key, T value) {
-    threadLocals.put(key, value);
-  }
-
-  /**
-   * getThreadLocal returns the value {@code v} supplied to the most recent {@code
-   * setThreadLocal(key, v)} call, or null if there was no prior call.
-   */
-  public <T> T getThreadLocal(Class<T> key) {
-    Object v = threadLocals.get(key);
-    return v == null ? null : key.cast(v);
-  }
-
-  /** A Frame records information about an active function call. */
-  static final class Frame implements Debug.Frame {
-    final StarlarkThread thread;
-    final StarlarkCallable fn; // the called function
-
-    @Nullable
-    final Debug.Debugger dbg = Debug.debugger.get(); // the debugger, if active for this frame
-
-    int compcount = 0; // number of enclosing comprehensions
-
-    Object result = Starlark.NONE; // the operand of a Starlark return statement
-
-    // Current PC location. Initially fn.getLocation(); for Starlark functions,
-    // it is updated at key points when it may be observed: calls, breakpoints, errors.
-    private Location loc;
-
-    // Indicates that setErrorLocation has been called already and the error
-    // location (loc) should not be overrwritten.
-    private boolean errorLocationSet;
-
-    // The locals of this frame, if fn is a StarlarkFunction, otherwise empty.
-    Map<String, Object> locals;
-
-    @Nullable private Object profileSpan; // current span of walltime call profiler
-
-    private Frame(StarlarkThread thread, StarlarkCallable fn) {
-      this.thread = thread;
-      this.fn = fn;
-    }
-
-    // Updates the PC location in this frame.
-    void setLocation(Location loc) {
-      this.loc = loc;
-    }
-
-    // Sets location only the first time it is called,
-    // to ensure that the location of the innermost expression
-    // is used for errors.
-    // (Once we switch to a bytecode interpreter, we can afford
-    // to update fr.pc before each fallible operation, but until then
-    // we must materialize Locations only after the fact of failure.)
-    // Sets errorLocationSet.
-    void setErrorLocation(Location loc) {
-      if (!errorLocationSet) {
-        errorLocationSet = true;
-        setLocation(loc);
-      }
-    }
-
-    @Override
-    public StarlarkCallable getFunction() {
-      return fn;
-    }
-
-    @Override
-    public Location getLocation() {
-      return loc;
-    }
-
-    @Override
-    public ImmutableMap<String, Object> getLocals() {
-      return ImmutableMap.copyOf(this.locals);
-    }
-
-    @Override
-    public String toString() {
-      return fn.getName() + "@" + loc;
-    }
-  }
-
-  /** The semantics options that affect how Starlark code is evaluated. */
-  private final StarlarkSemantics semantics;
-
-  /** PrintHandler for Starlark print statements. */
-  private PrintHandler printHandler = StarlarkThread::defaultPrintHandler;
-
-  /** Loader for Starlark load statements. Null if loading is disallowed. */
-  @Nullable private Loader loader = null;
-
-  /** Stack of active function calls. */
-  private final ArrayList<Frame> callstack = new ArrayList<>();
-
-  /** A hook for notifications of assignments at top level. */
-  PostAssignHook postAssignHook;
-
-  /** Pushes a function onto the call stack. */
-  void push(StarlarkCallable fn) {
-    Frame fr = new Frame(this, fn);
-    callstack.add(fr);
-
-    // Notify debug tools of the thread's first push.
-    if (callstack.size() == 1 && Debug.threadHook != null) {
-      Debug.threadHook.onPushFirst(this);
-    }
-
-    if (fn instanceof StarlarkFunction) {
-      StarlarkFunction sfn = (StarlarkFunction) fn;
-      fr.locals = Maps.newLinkedHashMapWithExpectedSize(sfn.getParameterNames().size());
-    } else {
-      // built-in function
-      fr.locals = ImmutableMap.of();
-    }
-
-    fr.loc = fn.getLocation();
-
-    // Start wall-time call profile span.
-    CallProfiler callProfiler = StarlarkThread.callProfiler;
-    if (callProfiler != null) {
-      fr.profileSpan = callProfiler.start(fn);
-    }
-
-    // Poll for newly installed CPU profiler.
-    if (profiler == null) {
-      this.profiler = CpuProfiler.get();
-      if (profiler != null) {
-        cpuTicks.set(0);
-        // Associated current Java thread with this StarlarkThread.
-        // (Save the previous association so we can restore it later.)
-        this.savedThread = CpuProfiler.setStarlarkThread(this);
-      }
-    }
-  }
-
-  /** Pops a function off the call stack. */
-  void pop() {
-    int last = callstack.size() - 1;
-    Frame fr = callstack.get(last);
-
-    if (profiler != null) {
-      int ticks = cpuTicks.getAndSet(0);
-      if (ticks > 0) {
-        profiler.addEvent(ticks, getDebugCallStack());
-      }
-
-      // If this is the final pop in this thread,
-      // unregister it from the profiler.
-      if (last == 0) {
-        // Restore the previous association (in case of reentrant evaluation).
-        CpuProfiler.setStarlarkThread(this.savedThread);
-        this.savedThread = null;
-        this.profiler = null;
-      }
-    }
-
-    callstack.remove(last); // pop
-
-    // End wall-time profile span.
-    CallProfiler callProfiler = StarlarkThread.callProfiler;
-    if (callProfiler != null && fr.profileSpan != null) {
-      callProfiler.end(fr.profileSpan);
-    }
-
-    // Notify debug tools of the thread's last pop.
-    if (last == 0 && Debug.threadHook != null) {
-      Debug.threadHook.onPopLast(this);
-    }
-  }
-
-  /** Returns the mutability for values created by this thread. */
-  public Mutability mutability() {
-    return mutability;
-  }
-
-  /**
-   * A PrintHandler determines how a Starlark thread deals with print statements. It is invoked by
-   * the built-in {@code print} function. Its default behavior is to write the message to standard
-   * error, preceded by the location of the print statement, {@code thread.getCallerLocation()}.
-   */
-  @FunctionalInterface
-  public interface PrintHandler {
-    void print(StarlarkThread thread, String msg);
-  }
-
-  /** Returns the PrintHandler for Starlark print statements. */
-  PrintHandler getPrintHandler() {
-    return printHandler;
-  }
-
-  /** Sets the behavior of Starlark print statements executed by this thread. */
-  public void setPrintHandler(PrintHandler h) {
-    this.printHandler = Preconditions.checkNotNull(h);
-  }
-
-  private static void defaultPrintHandler(StarlarkThread thread, String msg) {
-    System.err.println(thread.getCallerLocation() + ": " + msg);
-  }
-
-  /**
-   * A Loader determines the behavior of load statements executed by this thread. It returns the
-   * named module, or null if not found.
-   */
-  @FunctionalInterface
-  public interface Loader {
-    @Nullable
-    Module load(String module);
-  }
-
-  /** Returns the loader for Starlark load statements. */
-  Loader getLoader() {
-    return loader;
-  }
-
-  /** Sets the behavior of Starlark load statements executed by this thread. */
-  public void setLoader(Loader loader) {
-    this.loader = Preconditions.checkNotNull(loader);
-  }
-
-  /** Reports whether {@code fn} has been recursively reentered within this thread. */
-  boolean isRecursiveCall(StarlarkFunction fn) {
-    // Find fn buried within stack. (The top of the stack is assumed to be fn.)
-    for (int i = callstack.size() - 2; i >= 0; --i) {
-      Frame fr = callstack.get(i);
-      // TODO(adonovan): compare code, not closure values, otherwise
-      // one can defeat this check by writing the Y combinator.
-      if (fr.fn.equals(fn)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Returns the location of the program counter in the enclosing call frame. If called from within
-   * a built-in function, this is the location of the call expression that called the built-in. It
-   * returns BUILTIN if called with fewer than two frames (such as within a test).
-   */
-  public Location getCallerLocation() {
-    return toplevel() ? Location.BUILTIN : frame(1).loc;
-  }
-
-  /**
-   * Reports whether the call stack has less than two frames. Zero frames means an idle thread. One
-   * frame means the function for the top-level statements of a file is active. More than that means
-   * a function call is in progress.
-   *
-   * <p>Every use of this function is a hack to work around the lack of proper local vs global
-   * identifier resolution at top level.
-   */
-  boolean toplevel() {
-    return callstack.size() < 2;
-  }
-
-  // Returns the stack frame at the specified depth. 0 means top of stack, 1 is its caller, etc.
-  Frame frame(int depth) {
-    return callstack.get(callstack.size() - 1 - depth);
-  }
-
-  /**
-   * Constructs a StarlarkThread.
-   *
-   * @param mu the (non-frozen) mutability of values created by this thread.
-   * @param semantics the StarlarkSemantics for this thread.
-   */
-  public StarlarkThread(Mutability mu, StarlarkSemantics semantics) {
-    Preconditions.checkArgument(!mu.isFrozen());
-    this.mutability = mu;
-    this.semantics = semantics;
-  }
-
-  /**
-   * Specifies a hook function to be run after each assignment at top level.
-   *
-   * <p>This is a short-term hack to allow us to consolidate all StarlarkFile execution in one place
-   * even while BzlLoadFunction implements the old "export" behavior, in which rules, aspects and
-   * providers are "exported" as soon as they are assigned, not at the end of file execution.
-   */
-  public void setPostAssignHook(PostAssignHook postAssignHook) {
-    this.postAssignHook = postAssignHook;
-  }
-
-  /** A hook for notifications of assignments at top level. */
-  @FunctionalInterface
-  public interface PostAssignHook {
-    void assign(String name, Object value);
-  }
-
-  public StarlarkSemantics getSemantics() {
-    return semantics;
-  }
-
-  // Implementation of Debug.getCallStack.
-  // Intentionally obscured to steer most users to the simpler getCallStack.
-  ImmutableList<Debug.Frame> getDebugCallStack() {
-    return ImmutableList.<Debug.Frame>copyOf(callstack);
-  }
-
-  /** Returns the size of the callstack. This is needed for the debugger. */
-  int getCallStackSize() {
-    return callstack.size();
-  }
-
-  /**
-   * A CallStackEntry describes the name and PC location of an active function call. See {@link
-   * #getCallStack}.
-   */
-  @Immutable
-  public static final class CallStackEntry {
-    public final String name;
-    public final Location location;
-
-    public CallStackEntry(String name, Location location) {
-      this.location = location;
-      this.name = name;
-    }
-
-    @Override
-    public String toString() {
-      return name + "@" + location;
-    }
-  }
-
-  /**
-   * Returns information about this thread's current stack of active function calls, outermost call
-   * first. For each function, it reports its name, and the location of its current program counter.
-   * The result is immutable and does not reference interpreter data structures, so it may retained
-   * indefinitely and safely shared with other threads.
-   */
-  public ImmutableList<CallStackEntry> getCallStack() {
-    ImmutableList.Builder<CallStackEntry> stack = ImmutableList.builder();
-    for (Frame fr : callstack) {
-      stack.add(new CallStackEntry(fr.fn.getName(), fr.loc));
-    }
-    return stack.build();
-  }
-
-  @Override
-  public int hashCode() {
-    throw new UnsupportedOperationException(); // avoid nondeterminism
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String toString() {
-    return String.format("<StarlarkThread%s>", mutability);
-  }
-
-  /** CallProfiler records the start and end wall times of function calls. */
-  public interface CallProfiler {
-    Object start(StarlarkCallable fn);
-
-    void end(Object span);
-  }
-
-  /** Installs a global hook that will be notified of function calls. */
-  public static void setCallProfiler(@Nullable CallProfiler p) {
-    callProfiler = p;
-  }
-
-  @Nullable private static CallProfiler callProfiler = null;
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkValue.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkValue.java
deleted file mode 100644
index 8a14128..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkValue.java
+++ /dev/null
@@ -1,79 +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;
-
-/** Base interface for all Starlark values besides boxed Java primitives. */
-public interface StarlarkValue {
-
-  /**
-   * Prints an official representation of object x.
-   *
-   * <p>Convention is that the string should be parseable back to the value x. If this isn't
-   * feasible then it should be a short human-readable description enclosed in angled brackets, e.g.
-   * {@code "<foo object>"}.
-   *
-   * @param printer a printer to be used for formatting nested values.
-   */
-  default void repr(Printer printer) {
-    printer.append("<unknown object ").append(getClass().getName()).append(">");
-  }
-
-  /**
-   * Prints an informal, human-readable representation of the value.
-   *
-   * <p>By default dispatches to the {@code repr} method.
-   *
-   * @param printer a printer to be used for formatting nested values.
-   */
-  default void str(Printer printer) {
-    repr(printer);
-  }
-
-  /**
-   * Prints an informal debug representation of the value.
-   *
-   * <p>This debug representation is only ever printed to the terminal or to another out-of-band
-   * channel, and is never accessible to Starlark code. Therefore, it is safe for the debug
-   * representation to reveal properties of the value that are usually hidden for the sake of
-   * performance, determinism, or forward-compatibility.
-   *
-   * <p>By default dispatches to the {@code str} method.
-   *
-   * @param printer a printer to be used for formatting nested values.
-   */
-  default void debugPrint(Printer printer) {
-    str(printer);
-  }
-
-  /** Returns the truth-value of this Starlark value. */
-  default boolean truth() {
-    return true;
-  }
-
-  /** Reports whether the value is deeply immutable. */
-  // TODO(adonovan): eliminate this concept. All uses really need to know is, is it hashable?,
-  // because Starlark values must have stable hashes: a hashable value must either be immutable or
-  // its hash must be part of its identity.
-  // But this must wait until --incompatible_disallow_hashing_frozen_mutables=true is removed.
-  // (see github.com/bazelbuild/bazel/issues/7800)
-  default boolean isImmutable() {
-    return false;
-  }
-
-  /** Reports whether the Starlark value is hashable and thus suitable as a dict key. */
-  default boolean isHashable() {
-    return this.isImmutable();
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Statement.java b/src/main/java/com/google/devtools/build/lib/syntax/Statement.java
deleted file mode 100644
index e3633b4..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Statement.java
+++ /dev/null
@@ -1,43 +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;
-
-/** Base class for all statements nodes in the AST. */
-public abstract class Statement extends Node {
-
-  /**
-   * Kind of the statement. This is similar to using instanceof, except that it's more efficient and
-   * can be used in a switch/case.
-   */
-  public enum Kind {
-    ASSIGNMENT,
-    EXPRESSION,
-    FLOW,
-    FOR,
-    DEF,
-    IF,
-    LOAD,
-    RETURN,
-  }
-
-  Statement(FileLocations locs) {
-    super(locs);
-  }
-
-  /**
-   * Kind of the statement. This is similar to using instanceof, except that it's more efficient and
-   * can be used in a switch/case.
-   */
-  public abstract Kind kind();
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
deleted file mode 100644
index 51d4909..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
+++ /dev/null
@@ -1,77 +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;
-
-/** Syntax node for a string literal. */
-public final class StringLiteral extends Expression {
-
-  // See skyframe.serialization.StringLiteralCodec for custom serialization logic.
-
-  private final int startOffset;
-  private final String value;
-  private final int endOffset;
-
-  StringLiteral(FileLocations locs, int startOffset, String value, int endOffset) {
-    super(locs);
-    this.startOffset = startOffset;
-    this.value = value;
-    this.endOffset = endOffset;
-  }
-
-  /** Returns the value denoted by the string literal */
-  public String getValue() {
-    return value;
-  }
-
-  public Location getLocation() {
-    return locs.getLocation(startOffset);
-  }
-
-  @Override
-  public int getStartOffset() {
-    return startOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    // TODO(adonovan): when we switch to compilation,
-    // making syntax trees ephemeral, we can afford to
-    // record the raw literal. This becomes:
-    //   return startOffset + raw.length().
-    return endOffset;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.STRING_LITERAL;
-  }
-
-  // -- hooks to support Skyframe serialization without creating a dependency --
-
-  /** Returns an opaque serializable object that may be passed to {@link #fromSerialization}. */
-  public Object getFileLocations() {
-    return locs;
-  }
-
-  /** Constructs a StringLiteral from its serialized components. */
-  public static StringLiteral fromSerialization(
-      Object fileLocations, int startOffset, String value, int endOffset) {
-    return new StringLiteral((FileLocations) fileLocations, startOffset, value, endOffset);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java b/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java
deleted file mode 100644
index bb28acb..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java
+++ /dev/null
@@ -1,993 +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.base.Ascii;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.ParamType;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-import net.starlark.java.annot.StarlarkMethod;
-
-/**
- * Starlark String module.
- *
- * <p>This module has special treatment in Starlark, as its methods represent methods represent for
- * any 'string' objects in the language.
- *
- * <p>Methods of this class annotated with {@link StarlarkMethod} must have a positional-only
- * 'String self' parameter as the first parameter of the method.
- */
-@StarlarkBuiltin(
-    name = "string",
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc =
-        "A language built-in type to support strings. "
-            + "Examples of string literals:<br>"
-            + "<pre class=\"language-python\">a = 'abc\\ndef'\n"
-            + "b = \"ab'cd\"\n"
-            + "c = \"\"\"multiline string\"\"\"\n"
-            + "\n"
-            + "# Strings support slicing (negative index starts from the end):\n"
-            + "x = \"hello\"[2:4]  # \"ll\"\n"
-            + "y = \"hello\"[1:-1]  # \"ell\"\n"
-            + "z = \"hello\"[:4]  # \"hell\""
-            + "# Slice steps can be used, too:\n"
-            + "s = \"hello\"[::2] # \"hlo\"\n"
-            + "t = \"hello\"[3:0:-1] # \"lle\"\n</pre>"
-            + "Strings are not directly iterable, use the <code>.elems()</code> "
-            + "method to iterate over their characters. Examples:<br>"
-            + "<pre class=\"language-python\">\"bc\" in \"abcd\"   # evaluates to True\n"
-            + "x = [s for s.elems() in \"abc\"]  # x == [\"a\", \"b\", \"c\"]</pre>\n"
-            + "Implicit concatenation of strings is not allowed; use the <code>+</code> "
-            + "operator instead. Comparison operators perform a lexicographical comparison; "
-            + "use <code>==</code> to test for equality.")
-final class StringModule implements StarlarkValue {
-
-  static final StringModule INSTANCE = new StringModule();
-
-  private StringModule() {}
-
-  // Returns s[start:stop:step], as if by Sequence.getSlice.
-  static String slice(String s, int start, int stop, int step) {
-    RangeList indices = new RangeList(start, stop, step);
-    int n = indices.size();
-    if (step == 1) { // common case
-      return s.substring(indices.at(0), indices.at(n));
-    } else {
-      char[] res = new char[n];
-      for (int i = 0; i < n; ++i) {
-        res[i] = s.charAt(indices.at(i));
-      }
-      return new String(res);
-    }
-  }
-
-  // Returns the substring denoted by str[start:end], which is never out of bounds.
-  // For speed, we don't return str.substring(start, end), as substring allocates a copy.
-  // Instead we return the (start, end) indices, packed into the lo/hi arms of a long.
-  private static long substringIndices(String str, int start, Object end, String name)
-      throws EvalException {
-    // This function duplicates the logic of Starlark.slice for strings.
-    int n = str.length();
-    // TODO(adonovan): allow start to be None, as required by spec.
-    start = EvalUtils.toIndex(start, n);
-    int stop = end == Starlark.NONE ? n : EvalUtils.toIndex(Starlark.toInt(end, name), n);
-    if (stop < start) {
-      stop = start; // => empty result
-    }
-    return pack(start, stop); // = str.substring(start, stop)
-  }
-
-  private static long pack(int lo, int hi) {
-    return (((long) hi) << 32) | (lo & 0xffffffffL);
-  }
-
-  private static int lo(long x) {
-    return (int) x;
-  }
-
-  private static int hi(long x) {
-    return (int) (x >>> 32);
-  }
-
-  @StarlarkMethod(
-      name = "join",
-      doc =
-          "Returns a string in which the string elements of the argument have been "
-              + "joined by this string as a separator. Example:<br>"
-              + "<pre class=\"language-python\">\"|\".join([\"a\", \"b\", \"c\"]) == \"a|b|c\""
-              + "</pre>",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "elements", type = Object.class, doc = "The objects to join.")
-      })
-  public String join(String self, Object elements) throws EvalException {
-    Iterable<?> items = Starlark.toIterable(elements);
-    int i = 0;
-    for (Object item : items) {
-      if (!(item instanceof String)) {
-        throw Starlark.errorf(
-            "expected string for sequence element %d, got '%s'", i, Starlark.type(item));
-      }
-      i++;
-    }
-    return Joiner.on(self).join(items);
-  }
-
-  @StarlarkMethod(
-      name = "lower",
-      doc = "Returns the lower case version of this string.",
-      parameters = {@Param(name = "self", type = String.class)})
-  public String lower(String self) {
-    return Ascii.toLowerCase(self);
-  }
-
-  @StarlarkMethod(
-      name = "upper",
-      doc = "Returns the upper case version of this string.",
-      parameters = {@Param(name = "self", type = String.class)})
-  public String upper(String self) {
-    return Ascii.toUpperCase(self);
-  }
-
-  /**
-   * For consistency with Python we recognize the same whitespace characters as they do over the
-   * range 0x00-0xFF. See https://hg.python.org/cpython/file/3.6/Objects/unicodetype_db.h#l5738 This
-   * list is a consequence of Unicode character information.
-   *
-   * <p>Note that this differs from Python 2.7, which uses ctype.h#isspace(), and from
-   * java.lang.Character#isWhitespace(), which does not recognize U+00A0.
-   */
-  private static final String LATIN1_WHITESPACE =
-      ("\u0009" + "\n" + "\u000B" + "\u000C" + "\r" + "\u001C" + "\u001D" + "\u001E" + "\u001F"
-          + "\u0020" + "\u0085" + "\u00A0");
-
-  private static String stringLStrip(String self, String chars) {
-    CharMatcher matcher = CharMatcher.anyOf(chars);
-    for (int i = 0; i < self.length(); i++) {
-      if (!matcher.matches(self.charAt(i))) {
-        return self.substring(i);
-      }
-    }
-    return ""; // All characters were stripped.
-  }
-
-  private static String stringRStrip(String self, String chars) {
-    CharMatcher matcher = CharMatcher.anyOf(chars);
-    for (int i = self.length() - 1; i >= 0; i--) {
-      if (!matcher.matches(self.charAt(i))) {
-        return self.substring(0, i + 1);
-      }
-    }
-    return ""; // All characters were stripped.
-  }
-
-  private static String stringStrip(String self, String chars) {
-    return stringLStrip(stringRStrip(self, chars), chars);
-  }
-
-  @StarlarkMethod(
-      name = "lstrip",
-      doc =
-          "Returns a copy of the string where leading characters that appear in "
-              + "<code>chars</code> are removed. Note that <code>chars</code> "
-              + "is not a prefix: all combinations of its value are removed:"
-              + "<pre class=\"language-python\">"
-              + "\"abcba\".lstrip(\"ba\") == \"cba\""
-              + "</pre>",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(
-            name = "chars",
-            type = String.class,
-            noneable = true,
-            doc = "The characters to remove, or all whitespace if None.",
-            defaultValue = "None")
-      })
-  public String lstrip(String self, Object charsOrNone) {
-    String chars = charsOrNone != Starlark.NONE ? (String) charsOrNone : LATIN1_WHITESPACE;
-    return stringLStrip(self, chars);
-  }
-
-  @StarlarkMethod(
-      name = "rstrip",
-      doc =
-          "Returns a copy of the string where trailing characters that appear in "
-              + "<code>chars</code> are removed. Note that <code>chars</code> "
-              + "is not a suffix: all combinations of its value are removed:"
-              + "<pre class=\"language-python\">"
-              + "\"abcbaa\".rstrip(\"ab\") == \"abc\""
-              + "</pre>",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(
-            name = "chars",
-            type = String.class,
-            noneable = true,
-            doc = "The characters to remove, or all whitespace if None.",
-            defaultValue = "None")
-      })
-  public String rstrip(String self, Object charsOrNone) {
-    String chars = charsOrNone != Starlark.NONE ? (String) charsOrNone : LATIN1_WHITESPACE;
-    return stringRStrip(self, chars);
-  }
-
-  @StarlarkMethod(
-      name = "strip",
-      doc =
-          "Returns a copy of the string where leading or trailing characters that appear in "
-              + "<code>chars</code> are removed. Note that <code>chars</code> "
-              + "is neither a prefix nor a suffix: all combinations of its value "
-              + "are removed:"
-              + "<pre class=\"language-python\">"
-              + "\"aabcbcbaa\".strip(\"ab\") == \"cbc\""
-              + "</pre>",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(
-            name = "chars",
-            type = String.class,
-            noneable = true,
-            doc = "The characters to remove, or all whitespace if None.",
-            defaultValue = "None")
-      })
-  public String strip(String self, Object charsOrNone) {
-    String chars = charsOrNone != Starlark.NONE ? (String) charsOrNone : LATIN1_WHITESPACE;
-    return stringStrip(self, chars);
-  }
-
-  @StarlarkMethod(
-      name = "replace",
-      doc =
-          "Returns a copy of the string in which the occurrences "
-              + "of <code>old</code> have been replaced with <code>new</code>, optionally "
-              + "restricting the number of replacements to <code>maxsplit</code>.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "old", type = String.class, doc = "The string to be replaced."),
-        @Param(name = "new", type = String.class, doc = "The string to replace with."),
-        @Param(
-            name = "count",
-            type = Integer.class,
-            noneable = true, // TODO(#11244): Set false once incompatible flag is deleted.
-            defaultValue = "unbound",
-            doc =
-                "The maximum number of replacements. If omitted, there is no limit."
-                    + "<p>If <code>--incompatible_string_replace_count</code> is true, a negative "
-                    + "value is ignored (so there's no limit) and a <code>None</code> value is an "
-                    + "error. Otherwise, a negative value is treated as 0 and a <code>None</code> "
-                    + "value is ignored. (See also issue <a "
-                    + "href='https://github.com/bazelbuild/bazel/issues/11244'>#11244</a>.)")
-      },
-      useStarlarkThread = true)
-  public String replace(
-      String self, String oldString, String newString, Object countUnchecked, StarlarkThread thread)
-      throws EvalException {
-    int count = Integer.MAX_VALUE;
-
-    StarlarkSemantics semantics = thread.getSemantics();
-    if (semantics.getBool(StarlarkSemantics.INCOMPATIBLE_STRING_REPLACE_COUNT)) {
-      if (countUnchecked == Starlark.NONE) {
-        throw Starlark.errorf(
-            "Cannot pass a None count to string.replace(); omit the count argument instead. (You "
-                + "can temporarily opt out of this change by setting "
-                + "--incompatible_string_replace_count=false.)");
-      }
-      if (countUnchecked != Starlark.UNBOUND && (Integer) countUnchecked >= 0) {
-        count = (Integer) countUnchecked;
-      }
-    } else {
-      if (countUnchecked != Starlark.UNBOUND && countUnchecked != Starlark.NONE) {
-        // Negative has same effect as 0 below.
-        count = (Integer) countUnchecked;
-      }
-    }
-
-    StringBuilder sb = new StringBuilder();
-    int start = 0;
-    for (int i = 0; i < count; i++) {
-      if (oldString.isEmpty()) {
-        sb.append(newString);
-        if (start < self.length()) {
-          sb.append(self.charAt(start++));
-        } else {
-          break;
-        }
-      } else {
-        int end = self.indexOf(oldString, start);
-        if (end < 0) {
-          break;
-        }
-        sb.append(self, start, end).append(newString);
-        start = end + oldString.length();
-      }
-    }
-    sb.append(self, start, self.length());
-    return sb.toString();
-  }
-
-  @StarlarkMethod(
-      name = "split",
-      doc =
-          "Returns a list of all the words in the string, using <code>sep</code> as the "
-              + "separator, optionally limiting the number of splits to <code>maxsplit</code>.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sep", type = String.class, doc = "The string to split on."),
-        @Param(
-            name = "maxsplit",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "The maximum number of splits.")
-      },
-      useStarlarkThread = true)
-  public StarlarkList<String> split(
-      String self, String sep, Object maxSplitO, StarlarkThread thread) throws EvalException {
-    if (sep.isEmpty()) {
-      throw Starlark.errorf("Empty separator");
-    }
-    int maxSplit = Integer.MAX_VALUE;
-    if (maxSplitO != Starlark.NONE) {
-      maxSplit = (Integer) maxSplitO;
-    }
-    ArrayList<String> res = new ArrayList<>();
-    int start = 0;
-    while (true) {
-      int end = self.indexOf(sep, start);
-      if (end < 0 || maxSplit-- == 0) {
-        res.add(self.substring(start));
-        break;
-      }
-      res.add(self.substring(start, end));
-      start = end + sep.length();
-    }
-    return StarlarkList.copyOf(thread.mutability(), res);
-  }
-
-  @StarlarkMethod(
-      name = "rsplit",
-      doc =
-          "Returns a list of all the words in the string, using <code>sep</code> as the "
-              + "separator, optionally limiting the number of splits to <code>maxsplit</code>. "
-              + "Except for splitting from the right, this method behaves like split().",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sep", type = String.class, doc = "The string to split on."),
-        @Param(
-            name = "maxsplit",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "The maximum number of splits.")
-      },
-      useStarlarkThread = true)
-  public StarlarkList<String> rsplit(
-      String self, String sep, Object maxSplitO, StarlarkThread thread) throws EvalException {
-    if (sep.isEmpty()) {
-      throw Starlark.errorf("Empty separator");
-    }
-    int maxSplit = Integer.MAX_VALUE;
-    if (maxSplitO != Starlark.NONE) {
-      maxSplit = (Integer) maxSplitO;
-    }
-    ArrayList<String> res = new ArrayList<>();
-    int end = self.length();
-    while (true) {
-      int start = self.lastIndexOf(sep, end - 1);
-      if (start < 0 || maxSplit-- == 0) {
-        res.add(self.substring(0, end));
-        break;
-      }
-      res.add(self.substring(start + sep.length(), end));
-      end = start;
-    }
-    Collections.reverse(res);
-    return StarlarkList.copyOf(thread.mutability(), res);
-  }
-
-  @StarlarkMethod(
-      name = "partition",
-      doc =
-          "Splits the input string at the first occurrence of the separator <code>sep</code> and"
-              + " returns the resulting partition as a three-element tuple of the form (before,"
-              + " separator, after). If the input string does not contain the separator, partition"
-              + " returns (self, '', '').",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "sep", type = String.class, doc = "The string to split on.")
-      })
-  public Tuple<String> partition(String self, String sep) throws EvalException {
-    return partitionCommon(self, sep, /*first=*/ true);
-  }
-
-  @StarlarkMethod(
-      name = "rpartition",
-      doc =
-          "Splits the input string at the last occurrence of the separator <code>sep</code> and"
-              + " returns the resulting partition as a three-element tuple of the form (before,"
-              + " separator, after). If the input string does not contain the separator,"
-              + " rpartition returns ('', '', self).",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "sep", type = String.class, doc = "The string to split on.")
-      })
-  public Tuple<String> rpartition(String self, String sep) throws EvalException {
-    return partitionCommon(self, sep, /*first=*/ false);
-  }
-
-  // Splits input at the first or last occurrence of the given separator,
-  // and returns a triple of substrings (before, separator, after).
-  // If the input does not contain the separator,
-  // it returns (input, "", "") if first, or ("", "", input), if !first.
-  private static Tuple<String> partitionCommon(String input, String separator, boolean first)
-      throws EvalException {
-    if (separator.isEmpty()) {
-      throw Starlark.errorf("empty separator");
-    }
-
-    String a = "";
-    String b = "";
-    String c = "";
-
-    int pos = first ? input.indexOf(separator) : input.lastIndexOf(separator);
-    if (pos < 0) {
-      if (first) {
-        a = input;
-      } else {
-        c = input;
-      }
-    } else {
-      a = input.substring(0, pos);
-      b = separator;
-      c = input.substring(pos + separator.length());
-    }
-
-    return Tuple.triple(a, b, c);
-  }
-
-  @StarlarkMethod(
-      name = "capitalize",
-      doc =
-          "Returns a copy of the string with its first character (if any) capitalized and the rest "
-              + "lowercased. This method does not support non-ascii characters. ",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public String capitalize(String self) throws EvalException {
-    if (self.isEmpty()) {
-      return self;
-    }
-    // TODO(adonovan): fix: support non-ASCII characters. Requires that Bazel stop abusing Latin1.
-    return Character.toUpperCase(self.charAt(0)) + Ascii.toLowerCase(self.substring(1));
-  }
-
-  @StarlarkMethod(
-      name = "title",
-      doc =
-          "Converts the input string into title case, i.e. every word starts with an "
-              + "uppercase letter while the remaining letters are lowercase. In this "
-              + "context, a word means strictly a sequence of letters. This method does "
-              + "not support supplementary Unicode characters.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public String title(String self) throws EvalException {
-    char[] data = self.toCharArray();
-    boolean previousWasLetter = false;
-
-    for (int pos = 0; pos < data.length; ++pos) {
-      char current = data[pos];
-      boolean currentIsLetter = Character.isLetter(current);
-
-      if (currentIsLetter) {
-        if (previousWasLetter && Character.isUpperCase(current)) {
-          data[pos] = Character.toLowerCase(current);
-        } else if (!previousWasLetter && Character.isLowerCase(current)) {
-          data[pos] = Character.toUpperCase(current);
-        }
-      }
-      previousWasLetter = currentIsLetter;
-    }
-
-    return new String(data);
-  }
-
-  /**
-   * Common implementation for find, rfind, index, rindex.
-   *
-   * @param forward true if we want to return the last matching index.
-   */
-  private static int stringFind(
-      boolean forward, String self, String sub, int start, Object end, String msg)
-      throws EvalException {
-    long indices = substringIndices(self, start, end, msg);
-    // Unfortunately Java forces us to allocate here, even though
-    // String has a private indexOf method that accepts indices.
-    // Fortunately the common case is self[0:n].
-    String substr = self.substring(lo(indices), hi(indices));
-    int subpos = forward ? substr.indexOf(sub) : substr.lastIndexOf(sub);
-    return subpos < 0
-        ? subpos //
-        : subpos + lo(indices);
-  }
-
-  private static final Pattern SPLIT_LINES_PATTERN =
-      Pattern.compile("(?<line>.*)(?<break>(\\r\\n|\\r|\\n)?)");
-
-  @StarlarkMethod(
-      name = "rfind",
-      doc =
-          "Returns the last index where <code>sub</code> is found, or -1 if no such index exists, "
-              + "optionally restricting to <code>[start:end]</code>, "
-              + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Restrict to search from this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position before which to restrict to search.")
-      })
-  public Integer rfind(String self, String sub, Integer start, Object end) throws EvalException {
-    return stringFind(false, self, sub, start, end, "'end' argument to rfind");
-  }
-
-  @StarlarkMethod(
-      name = "find",
-      doc =
-          "Returns the first index where <code>sub</code> is found, or -1 if no such index exists, "
-              + "optionally restricting to <code>[start:end]</code>, "
-              + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Restrict to search from this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position before which to restrict to search.")
-      })
-  public Integer find(String self, String sub, Integer start, Object end) throws EvalException {
-    return stringFind(true, self, sub, start, end, "'end' argument to find");
-  }
-
-  @StarlarkMethod(
-      name = "rindex",
-      doc =
-          "Returns the last index where <code>sub</code> is found, or raises an error if no such "
-              + "index exists, optionally restricting to <code>[start:end]</code>, "
-              + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Restrict to search from this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position before which to restrict to search.")
-      })
-  public Integer rindex(String self, String sub, Integer start, Object end) throws EvalException {
-    int res = stringFind(false, self, sub, start, end, "'end' argument to rindex");
-    if (res < 0) {
-      throw Starlark.errorf(
-          "substring %s not found in %s", Starlark.repr(sub), Starlark.repr(self));
-    }
-    return res;
-  }
-
-  @StarlarkMethod(
-      name = "index",
-      doc =
-          "Returns the first index where <code>sub</code> is found, or raises an error if no such "
-              + " index exists, optionally restricting to <code>[start:end]</code>"
-              + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Restrict to search from this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position before which to restrict to search.")
-      })
-  public Integer index(String self, String sub, Integer start, Object end) throws EvalException {
-    int res = stringFind(true, self, sub, start, end, "'end' argument to index");
-    if (res < 0) {
-      throw Starlark.errorf(
-          "substring %s not found in %s", Starlark.repr(sub), Starlark.repr(self));
-    }
-    return res;
-  }
-
-  @StarlarkMethod(
-      name = "splitlines",
-      doc =
-          "Splits the string at line boundaries ('\\n', '\\r\\n', '\\r') "
-              + "and returns the result as a list.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(
-            name = "keepends",
-            type = Boolean.class,
-            defaultValue = "False",
-            doc = "Whether the line breaks should be included in the resulting list.")
-      })
-  public Sequence<String> splitLines(String self, Boolean keepEnds) throws EvalException {
-    List<String> result = new ArrayList<>();
-    Matcher matcher = SPLIT_LINES_PATTERN.matcher(self);
-    while (matcher.find()) {
-      String line = matcher.group("line");
-      String lineBreak = matcher.group("break");
-      boolean trailingBreak = lineBreak.isEmpty();
-      if (line.isEmpty() && trailingBreak) {
-        break;
-      }
-      if (keepEnds && !trailingBreak) {
-        result.add(line + lineBreak);
-      } else {
-        result.add(line);
-      }
-    }
-    return StarlarkList.immutableCopyOf(result);
-  }
-
-  @StarlarkMethod(
-      name = "isalpha",
-      doc =
-          "Returns True if all characters in the string are alphabetic ([a-zA-Z]) and there is "
-              + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isAlpha(String self) throws EvalException {
-    return matches(self, ALPHA, false);
-  }
-
-  @StarlarkMethod(
-      name = "isalnum",
-      doc =
-          "Returns True if all characters in the string are alphanumeric ([a-zA-Z0-9]) and there "
-              + "is at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isAlnum(String self) throws EvalException {
-    return matches(self, ALNUM, false);
-  }
-
-  @StarlarkMethod(
-      name = "isdigit",
-      doc =
-          "Returns True if all characters in the string are digits ([0-9]) and there is "
-              + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isDigit(String self) throws EvalException {
-    return matches(self, DIGIT, false);
-  }
-
-  @StarlarkMethod(
-      name = "isspace",
-      doc =
-          "Returns True if all characters are white space characters and the string "
-              + "contains at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isSpace(String self) throws EvalException {
-    return matches(self, SPACE, false);
-  }
-
-  @StarlarkMethod(
-      name = "islower",
-      doc =
-          "Returns True if all cased characters in the string are lowercase and there is "
-              + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isLower(String self) throws EvalException {
-    // Python also accepts non-cased characters, so we cannot use LOWER.
-    return matches(self, UPPER.negate(), true);
-  }
-
-  @StarlarkMethod(
-      name = "isupper",
-      doc =
-          "Returns True if all cased characters in the string are uppercase and there is "
-              + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isUpper(String self) throws EvalException {
-    // Python also accepts non-cased characters, so we cannot use UPPER.
-    return matches(self, LOWER.negate(), true);
-  }
-
-  @StarlarkMethod(
-      name = "istitle",
-      doc =
-          "Returns True if the string is in title case and it contains at least one character. "
-              + "This means that every uppercase character must follow an uncased one (e.g. "
-              + "whitespace) and every lowercase character must follow a cased one (e.g. "
-              + "uppercase or lowercase).",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Boolean isTitle(String self) throws EvalException {
-    if (self.isEmpty()) {
-      return false;
-    }
-    // From the Python documentation: "uppercase characters may only follow uncased characters
-    // and lowercase characters only cased ones".
-    char[] data = self.toCharArray();
-    CharMatcher matcher = CharMatcher.any();
-    char leftMostCased = ' ';
-    for (int pos = data.length - 1; pos >= 0; --pos) {
-      char current = data[pos];
-      // 1. Check condition that was determined by the right neighbor.
-      if (!matcher.matches(current)) {
-        return false;
-      }
-      // 2. Determine condition for the left neighbor.
-      if (LOWER.matches(current)) {
-        matcher = CASED;
-      } else if (UPPER.matches(current)) {
-        matcher = CASED.negate();
-      } else {
-        matcher = CharMatcher.any();
-      }
-      // 3. Store character if it is cased.
-      if (CASED.matches(current)) {
-        leftMostCased = current;
-      }
-    }
-    // The leftmost cased letter must be uppercase. If leftMostCased is not a cased letter here,
-    // then the string doesn't have any cased letter, so UPPER.test will return false.
-    return UPPER.matches(leftMostCased);
-  }
-
-  private static boolean matches(
-      String str, CharMatcher matcher, boolean requiresAtLeastOneCasedLetter) {
-    if (str.isEmpty()) {
-      return false;
-    } else if (!requiresAtLeastOneCasedLetter) {
-      return matcher.matchesAllOf(str);
-    }
-    int casedLetters = 0;
-    for (char current : str.toCharArray()) {
-      if (!matcher.matches(current)) {
-        return false;
-      } else if (requiresAtLeastOneCasedLetter && CASED.matches(current)) {
-        ++casedLetters;
-      }
-    }
-    return casedLetters > 0;
-  }
-
-  private static final CharMatcher DIGIT = CharMatcher.javaDigit();
-  private static final CharMatcher LOWER = CharMatcher.inRange('a', 'z');
-  private static final CharMatcher UPPER = CharMatcher.inRange('A', 'Z');
-  private static final CharMatcher ALPHA = LOWER.or(UPPER);
-  private static final CharMatcher ALNUM = ALPHA.or(DIGIT);
-  private static final CharMatcher CASED = ALPHA;
-  private static final CharMatcher SPACE = CharMatcher.whitespace();
-
-  @StarlarkMethod(
-      name = "count",
-      doc =
-          "Returns the number of (non-overlapping) occurrences of substring <code>sub</code> in "
-              + "string, optionally restricting to <code>[start:end]</code>, <code>start</code> "
-              + "being inclusive and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to count."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Restrict to search from this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position before which to restrict to search.")
-      })
-  public Integer count(String self, String sub, Integer start, Object end) throws EvalException {
-    long indices = substringIndices(self, start, end, "'end' operand of 'count'");
-    if (sub.isEmpty()) {
-      return hi(indices) - lo(indices) + 1; // str.length() + 1
-    }
-    // Unfortunately Java forces us to allocate here, even though
-    // String has a private indexOf method that accepts indices.
-    // Fortunately the common case is self[0:n].
-    String str = self.substring(lo(indices), hi(indices));
-    int count = 0;
-    int index = 0;
-    while ((index = str.indexOf(sub, index)) >= 0) {
-      count++;
-      index += sub.length();
-    }
-    return count;
-  }
-
-  @StarlarkMethod(
-      name = "elems",
-      doc =
-          "Returns an iterable value containing successive 1-element substrings of the string. "
-              + "Equivalent to <code>[s[i] for i in range(len(s))]</code>, except that the "
-              + "returned value might not be a list.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
-  public Sequence<String> elems(String self) throws EvalException {
-    ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
-    for (char c : self.toCharArray()) {
-      builder.add(String.valueOf(c));
-    }
-    return StarlarkList.immutableCopyOf(builder.build());
-  }
-
-  @StarlarkMethod(
-      name = "endswith",
-      doc =
-          "Returns True if the string ends with <code>sub</code>, otherwise False, optionally "
-              + "restricting to <code>[start:end]</code>, <code>start</code> being inclusive "
-              + "and <code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(
-            name = "sub",
-            allowedTypes = {
-              @ParamType(type = String.class),
-              @ParamType(type = Tuple.class, generic1 = String.class),
-            },
-            doc = "The suffix (or tuple of alternative suffixes) to match."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Test beginning at this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "optional position at which to stop comparing.")
-      })
-  public Boolean endsWith(String self, Object sub, Integer start, Object end) throws EvalException {
-    long indices = substringIndices(self, start, end, "'end' operand of 'endswith'");
-    if (sub instanceof String) {
-      return substringEndsWith(self, lo(indices), hi(indices), (String) sub);
-    }
-    for (String s : Sequence.cast(sub, String.class, "sub")) {
-      if (substringEndsWith(self, lo(indices), hi(indices), s)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  // Computes str.substring(start, end).endsWith(suffix) without allocation.
-  private static boolean substringEndsWith(String str, int start, int end, String suffix) {
-    int n = suffix.length();
-    return start + n <= end && str.regionMatches(end - n, suffix, 0, n);
-  }
-
-  // In Python, formatting is very complex.
-  // We handle here the simplest case which provides most of the value of the function.
-  // https://docs.python.org/3/library/string.html#formatstrings
-  @StarlarkMethod(
-      name = "format",
-      doc =
-          "Perform string interpolation. Format strings contain replacement fields "
-              + "surrounded by curly braces <code>{}</code>. Anything that is not contained "
-              + "in braces is considered literal text, which is copied unchanged to the output."
-              + "If you need to include a brace character in the literal text, it can be "
-              + "escaped by doubling: <code>{{</code> and <code>}}</code>"
-              + "A replacement field can be either a name, a number, or empty. Values are "
-              + "converted to strings using the <a href=\"globals.html#str\">str</a> function."
-              + "<pre class=\"language-python\">"
-              + "# Access in order:\n"
-              + "\"{} < {}\".format(4, 5) == \"4 < 5\"\n"
-              + "# Access by position:\n"
-              + "\"{1}, {0}\".format(2, 1) == \"1, 2\"\n"
-              + "# Access by name:\n"
-              + "\"x{key}x\".format(key = 2) == \"x2x\"</pre>\n",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-      },
-      extraPositionals =
-          @Param(
-              name = "args",
-              type = Sequence.class,
-              defaultValue = "()",
-              doc = "List of arguments."),
-      extraKeywords =
-          @Param(
-              name = "kwargs",
-              type = Dict.class,
-              defaultValue = "{}",
-              doc = "Dictionary of arguments."))
-  public String format(String self, Sequence<?> args, Dict<?, ?> kwargs) throws EvalException {
-    @SuppressWarnings("unchecked")
-    List<Object> argObjects = (List<Object>) args.getImmutableList();
-    return new FormatParser()
-        .format(self, argObjects, Dict.cast(kwargs, String.class, Object.class, "kwargs"));
-  }
-
-  @StarlarkMethod(
-      name = "startswith",
-      doc =
-          "Returns True if the string starts with <code>sub</code>, otherwise False, optionally "
-              + "restricting to <code>[start:end]</code>, <code>start</code> being inclusive and "
-              + "<code>end</code> being exclusive.",
-      parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(
-            name = "sub",
-            allowedTypes = {
-              @ParamType(type = String.class),
-              @ParamType(type = Tuple.class, generic1 = String.class),
-            },
-            doc = "The prefix (or tuple of alternative prefixes) to match."),
-        @Param(
-            name = "start",
-            type = Integer.class,
-            defaultValue = "0",
-            doc = "Test beginning at this position."),
-        @Param(
-            name = "end",
-            type = Integer.class,
-            noneable = true,
-            defaultValue = "None",
-            doc = "Stop comparing at this position.")
-      })
-  public Boolean startsWith(String self, Object sub, Integer start, Object end)
-      throws EvalException {
-    long indices = substringIndices(self, start, end, "'end' operand of 'startswith'");
-    if (sub instanceof String) {
-      return substringStartsWith(self, lo(indices), hi(indices), (String) sub);
-    }
-    for (String s : Sequence.cast(sub, String.class, "sub")) {
-      if (substringStartsWith(self, lo(indices), hi(indices), s)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  // Computes str.substring(start, end).startsWith(prefix) without allocation.
-  private static boolean substringStartsWith(String str, int start, int end, String prefix) {
-    return start + prefix.length() <= end && str.startsWith(prefix, start);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxError.java b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxError.java
deleted file mode 100644
index 95ca5d1..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxError.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2019 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.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-
-/**
- * A SyntaxError represents a static error associated with the syntax, such as a scanner or parse
- * error, a structural problem, or a failure of identifier resolution. It records a description of
- * the error and its location in the syntax.
- */
-public final class SyntaxError {
-
-  private final Location location;
-  private final String message;
-
-  public SyntaxError(Location location, String message) {
-    this.location = Preconditions.checkNotNull(location);
-    this.message = Preconditions.checkNotNull(message);
-  }
-
-  /** Returns the location of the error. */
-  public Location location() {
-    return location;
-  }
-
-  /** Returns a description of the error. */
-  public String message() {
-    return message;
-  }
-
-  /** Returns a string of the form {@code "foo.star:1:2: oops"}. */
-  @Override
-  public String toString() {
-    return location + ": " + message;
-  }
-
-  /**
-   * A SyntaxError.Exception is an exception holding one or more syntax errors.
-   *
-   * <p>SyntaxError.Exception is thrown by operations such as {@link Expression#parse}, which are
-   * "all or nothing". By contrast, {@link StarlarkFile#parse} does not throw an exception; instead,
-   * it records the accumulated scanner, parser, and optionally validation errors within the syntax
-   * tree, so that clients may obtain partial information from a damaged file.
-   *
-   * <p>Clients that fail abruptly when encountering parse errors are encouraged to throw
-   * SyntaxError.Exception, as in this example:
-   *
-   * <pre>
-   * StarlarkFile file = StarlarkFile.parse(input);
-   * if (!file.ok()) {
-   *     throw new SyntaxError.Exception(file.errors());
-   * }
-   * </pre>
-   */
-  public static final class Exception extends java.lang.Exception {
-
-    private final ImmutableList<SyntaxError> errors;
-
-    /** Construct a SyntaxError from a non-empty list of errors. */
-    public Exception(List<SyntaxError> errors) {
-      if (errors.isEmpty()) {
-        throw new IllegalArgumentException("no errors");
-      }
-      this.errors = ImmutableList.copyOf(errors);
-    }
-
-    /** Returns an immutable non-empty list of errors. */
-    public ImmutableList<SyntaxError> errors() {
-      return errors;
-    }
-
-    @Override
-    public String getMessage() {
-      String first = errors.get(0).message();
-      if (errors.size() > 1) {
-        // TODO(adonovan): say ("+ n more errors") to avoid ambiguity.
-        return String.format("%s (+ %d more)", first, errors.size() - 1);
-      } else {
-        return first;
-      }
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
deleted file mode 100644
index e6fc450..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
+++ /dev/null
@@ -1,111 +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;
-
-/** A TokenKind represents the kind of a lexical token. */
-public enum TokenKind {
-  AMPERSAND("&"),
-  AMPERSAND_EQUALS("&="),
-  AND("and"),
-  AS("as"),
-  ASSERT("assert"),
-  BREAK("break"),
-  CARET("^"),
-  CARET_EQUALS("^="),
-  CLASS("class"),
-  COLON(":"),
-  COMMA(","),
-  CONTINUE("continue"),
-  DEF("def"),
-  DEL("del"),
-  DOT("."),
-  ELIF("elif"),
-  ELSE("else"),
-  EOF("EOF"),
-  EQUALS("="),
-  EQUALS_EQUALS("=="),
-  EXCEPT("except"),
-  FINALLY("finally"),
-  FOR("for"),
-  FROM("from"),
-  GLOBAL("global"),
-  GREATER(">"),
-  GREATER_EQUALS(">="),
-  GREATER_GREATER(">>"),
-  GREATER_GREATER_EQUALS(">>="),
-  IDENTIFIER("identifier"),
-  IF("if"),
-  ILLEGAL("illegal character"),
-  IMPORT("import"),
-  IN("in"),
-  INDENT("indent"),
-  INT("integer literal"),
-  IS("is"),
-  LAMBDA("lambda"),
-  LBRACE("{"),
-  LBRACKET("["),
-  LESS("<"),
-  LESS_EQUALS("<="),
-  LESS_LESS("<<"),
-  LESS_LESS_EQUALS("<<="),
-  LOAD("load"),
-  LPAREN("("),
-  MINUS("-"),
-  MINUS_EQUALS("-="),
-  NEWLINE("newline"),
-  NONLOCAL("nonlocal"),
-  NOT("not"),
-  NOT_EQUALS("!="),
-  NOT_IN("not in"),
-  OR("or"),
-  OUTDENT("outdent"),
-  PASS("pass"),
-  PERCENT("%"),
-  PERCENT_EQUALS("%="),
-  PIPE("|"),
-  PIPE_EQUALS("|="),
-  PLUS("+"),
-  PLUS_EQUALS("+="),
-  RAISE("raise"),
-  RBRACE("}"),
-  RBRACKET("]"),
-  RETURN("return"),
-  RPAREN(")"),
-  SEMI(";"),
-  SLASH("/"),
-  SLASH_EQUALS("/="),
-  SLASH_SLASH("//"),
-  SLASH_SLASH_EQUALS("//="),
-  STAR("*"),
-  STAR_EQUALS("*="),
-  STAR_STAR("**"),
-  STRING("string literal"),
-  TILDE("~"),
-  TRY("try"),
-  WHILE("while"),
-  WITH("with"),
-  YIELD("yield");
-
-  private final String name;
-
-  private TokenKind(String name) {
-    this.name = name;
-  }
-
-  @Override
-  public String toString() {
-    return name;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Tuple.java b/src/main/java/com/google/devtools/build/lib/syntax/Tuple.java
deleted file mode 100644
index 8b3e9a9..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/Tuple.java
+++ /dev/null
@@ -1,243 +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 com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ObjectArrays;
-import java.util.AbstractCollection;
-import java.util.AbstractList;
-import java.util.Arrays;
-import java.util.Iterator;
-import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.annot.StarlarkDocumentationCategory;
-
-/**
- * A Starlark tuple, i.e. the value represented by {@code (1, 2, 3)}. Tuples are always immutable
- * (regardless of the {@link StarlarkThread} they are created in).
- */
-@StarlarkBuiltin(
-    name = "tuple",
-    category = StarlarkDocumentationCategory.BUILTIN,
-    doc =
-        "The built-in tuple type. Example tuple expressions:<br>"
-            + "<pre class=language-python>x = (1, 2, 3)</pre>"
-            + "Accessing elements is possible using indexing (starts from <code>0</code>):<br>"
-            + "<pre class=language-python>e = x[1]   # e == 2</pre>"
-            + "Lists support the <code>+</code> operator to concatenate two tuples. Example:<br>"
-            + "<pre class=language-python>x = (1, 2) + (3, 4)   # x == (1, 2, 3, 4)\n"
-            + "x = (\"a\", \"b\")\n"
-            + "x += (\"c\",)            # x == (\"a\", \"b\", \"c\")</pre>"
-            + "Similar to lists, tuples support slice operations:"
-            + "<pre class=language-python>('a', 'b', 'c', 'd')[1:3]   # ('b', 'c')\n"
-            + "('a', 'b', 'c', 'd')[::2]  # ('a', 'c')\n"
-            + "('a', 'b', 'c', 'd')[3:0:-1]  # ('d', 'c', 'b')</pre>"
-            + "Tuples are immutable, therefore <code>x[1] = \"a\"</code> is not supported.")
-public final class Tuple<E> extends AbstractList<E> implements Sequence<E> {
-
-  private final Object[] elems;
-
-  private Tuple(Object[] elems) {
-    this.elems = elems;
-  }
-
-  // The shared (sole) empty tuple.
-  private static final Tuple<?> EMPTY = new Tuple<>(new Object[0]);
-
-  /** Returns the empty tuple, cast to have an arbitrary content type. */
-  @SuppressWarnings("unchecked")
-  public static <T> Tuple<T> empty() {
-    return (Tuple<T>) EMPTY; // unchecked
-  }
-
-  /**
-   * Returns a Tuple that wraps the specified array, which must not be subsequently modified. The
-   * caller is additionally trusted to choose an appropriate type T.
-   */
-  static <T> Tuple<T> wrap(Object[] array) {
-    return array.length == 0 ? empty() : new Tuple<T>(array);
-  }
-
-  /** Returns a tuple containing the given elements. */
-  @SuppressWarnings("unchecked")
-  public static <T> Tuple<T> copyOf(Iterable<? extends T> seq) {
-    if (seq instanceof Tuple) {
-      return (Tuple<T>) seq; // unchecked
-    }
-    return wrap(Iterables.toArray(seq, Object.class));
-  }
-
-  /** Returns a tuple containing the given elements. */
-  public static <T> Tuple<T> of(T... elems) {
-    if (elems.length == 0) {
-      return empty();
-    }
-    return new Tuple<T>(Arrays.copyOf(elems, elems.length));
-  }
-
-  /** Returns a two-element tuple. */
-  public static <T> Tuple<T> pair(T a, T b) {
-    // Equivalent to of(a, b) but avoids variadic array allocation.
-    return wrap(new Object[] {a, b});
-  }
-
-  /** Returns a three-element tuple. */
-  public static <T> Tuple<T> triple(T a, T b, T c) {
-    // Equivalent to of(a, b, c) but avoids variadic array allocation.
-    return wrap(new Object[] {a, b, c});
-  }
-
-  /** Returns a tuple that is the concatenation of two tuples. */
-  public static <T> Tuple<T> concat(Tuple<? extends T> x, Tuple<? extends T> y) {
-    // TODO(adonovan): opt: exploit x + () == x; y + () == y.
-    return wrap(ObjectArrays.concat(x.elems, y.elems, Object.class));
-  }
-
-  @Override
-  public boolean isImmutable() {
-    for (Object x : elems) {
-      if (!Starlark.isImmutable(x)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public boolean isHashable() {
-    for (Object x : elems) {
-      if (!EvalUtils.isHashable(x)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return 9857 + 8167 * Arrays.hashCode(elems);
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    // This slightly violates the java.util.List equivalence contract
-    // because it considers the class, not just the elements.
-    return this == that
-        || (that instanceof Tuple && Arrays.equals(this.elems, ((Tuple) that).elems));
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public E get(int i) {
-    return (E) elems[i]; // unchecked
-  }
-
-  @Override
-  public int size() {
-    return elems.length;
-  }
-
-  @Override
-  public Tuple<E> subList(int from, int to) {
-    return wrap(Arrays.copyOfRange(elems, from, to));
-  }
-
-  @Override
-  public Object[] toArray() {
-    return elems.length != 0 ? elems.clone() : elems;
-  }
-
-  @Override
-  public void repr(Printer printer) {
-    printer.append('(');
-    String sep = "";
-    for (Object elem : elems) {
-      printer.append(sep);
-      sep = ", ";
-      printer.repr(elem);
-    }
-    if (elems.length == 1) {
-      printer.append(',');
-    }
-    printer.append(')');
-  }
-
-  // TODO(adonovan): StarlarkValue has 3 String methods yet still we need this fourth. Why?
-  @Override
-  public String toString() {
-    return Starlark.repr(this);
-  }
-
-  @Override
-  public ImmutableList<E> getImmutableList() {
-    // Share the array with this (immutable) Tuple.
-    return wrapImmutable(elems);
-  }
-
-  /**
-   * Returns a new ImmutableList<T> backed by {@code array}, which must not be subsequently
-   * modified.
-   */
-  // TODO(adonovan): move this somewhere more appropriate.
-  static <T> ImmutableList<T> wrapImmutable(Object[] array) {
-    // Construct an ImmutableList that shares the array.
-    // ImmutableList relies on the implementation of Collection.toArray
-    // not subsequently modifying the returned array.
-    return ImmutableList.copyOf(
-        new AbstractCollection<T>() {
-          @Override
-          public Object[] toArray() {
-            return array;
-          }
-
-          @Override
-          public int size() {
-            return array.length;
-          }
-
-          @Override
-          public Iterator<T> iterator() {
-            throw new UnsupportedOperationException();
-          }
-        });
-  }
-
-  @Override
-  public Tuple<E> getSlice(Mutability mu, int start, int stop, int step) {
-    RangeList indices = new RangeList(start, stop, step);
-    int n = indices.size();
-    if (step == 1) { // common case
-      return subList(indices.at(0), indices.at(n));
-    }
-    Object[] res = new Object[n];
-    for (int i = 0; i < n; ++i) {
-      res[i] = elems[indices.at(i)];
-    }
-    return wrap(res);
-  }
-
-  /** Returns a Tuple containing n consecutive repeats of this tuple. */
-  Tuple<E> repeat(int n) {
-    if (n <= 0 || isEmpty()) {
-      return empty();
-    }
-    // TODO(adonovan): reject unreasonably large n.
-    Object[] res = new Object[n * elems.length];
-    for (int i = 0; i < n; i++) {
-      System.arraycopy(elems, 0, res, i * elems.length, elems.length);
-    }
-    return wrap(res);
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java
deleted file mode 100644
index 4b1e9f4..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java
+++ /dev/null
@@ -1,69 +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;
-
-
-/** A UnaryOperatorExpression represents a unary operator expression, 'op x'. */
-public final class UnaryOperatorExpression extends Expression {
-
-  private final TokenKind op; // NOT, TILDE, MINUS or PLUS
-  private final int opOffset;
-  private final Expression x;
-
-  UnaryOperatorExpression(FileLocations locs, TokenKind op, int opOffset, Expression x) {
-    super(locs);
-    this.op = op;
-    this.opOffset = opOffset;
-    this.x = x;
-  }
-
-  /** Returns the operator. */
-  public TokenKind getOperator() {
-    return op;
-  }
-
-  @Override
-  public int getStartOffset() {
-    return opOffset;
-  }
-
-  @Override
-  public int getEndOffset() {
-    return x.getEndOffset();
-  }
-
-  /** Returns the operand. */
-  public Expression getX() {
-    return x;
-  }
-
-  @Override
-  public String toString() {
-    // Note that this omits the parentheses for brevity, but is not correct in general due to
-    // operator precedence rules. For example, "(not False) in mylist" prints as
-    // "not False in mylist", which evaluates to opposite results in the case that mylist is empty.
-    // TODO(adonovan): record parentheses explicitly in syntax tree.
-    return (op == TokenKind.NOT ? "not " : op.toString()) + x;
-  }
-
-  @Override
-  public void accept(NodeVisitor visitor) {
-    visitor.visit(this);
-  }
-
-  @Override
-  public Kind kind() {
-    return Kind.UNARY_OPERATOR;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_posix.cc b/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_posix.cc
deleted file mode 100644
index c64b30d..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_posix.cc
+++ /dev/null
@@ -1,200 +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.
-
-// POSIX support for Starlark CPU profiler.
-
-#include <arpa/inet.h>  // for htonl
-#include <errno.h>
-#include <fcntl.h>
-#include <jni.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/syscall.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-namespace cpu_profiler {
-
-// static native boolean supported();
-extern "C" JNIEXPORT jboolean JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_supported(JNIEnv *env,
-                                                                jclass clazz) {
-  return true;
-}
-
-static int fd;  // the write end of the profile event pipe
-
-pid_t gettid(void) {
-#ifdef __linux__
-  return (pid_t)syscall(SYS_gettid);
-#else  // darwin
-  return (pid_t)syscall(SYS_thread_selfid);
-#endif
-}
-
-// SIGPROF handler.
-// Warning: asynchronous! See signal-safety(7) for the programming discipline.
-void onsigprof(int sig) {
-  int old_errno = errno;
-
-  if (fd == 0) {
-    const char *msg = "startTimer called before createPipe\n";
-    write(2, msg, strlen(msg));
-    abort();
-  }
-
-  // Send an event containing the int32be-encoded OS thread ID.
-  pid_t tid = gettid();
-  uint32_t tid_be = htonl(tid);
-  int r = write(fd, (void *)&tid_be, sizeof tid_be);
-  if (r < 0) {
-    if (errno == EAGAIN || errno == EWOULDBLOCK) {
-      // The Java router thread cannot keep up.
-      //
-      // A busy 12-core machine receives 12 * 100Hz = 1200 signals per second,
-      // and thus writes 4.8KB/s to the pipe. The default pipe buffer
-      // size on Linux is 64KiB, sufficient to buffer ~14s of data.
-      // (It is a quarter of that on Mac OS X.)
-      //
-      // Rather than block in write(2), causing the JVM to deadlock,
-      // we print an error and discard the event.
-      const char *msg =
-          "Starlark profile event router thread cannot keep up; discarding "
-          "events\n";
-      write(2, msg, strlen(msg));
-    } else {
-      // We shouldn't use perror in a signal handler.
-      // Strictly, we shouldn't use strerror either,
-      // but for all errors returned by write it merely
-      // returns a constant.
-      char buf[1024] = "write: ";
-      strncat(buf, strerror(errno), sizeof buf - strlen(buf) - 1);
-      strncat(buf, "\n", sizeof buf - strlen(buf) - 1);
-      write(2, buf, strlen(buf));
-      abort();
-    }
-  }
-
-  errno = old_errno;
-}
-
-// static native jint gettid();
-extern "C" JNIEXPORT jint JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_gettid(JNIEnv *env,
-                                                             jclass clazz) {
-  return gettid();
-}
-
-// makeFD: return new FileDescriptor(fd)
-//
-// This would be easy to do in Java, but for the field being private.
-// Java really does everything it can to make system programming hateful.
-static jobject makeFD(JNIEnv *env, int fd) {
-  jclass fdclass = env->FindClass("java/io/FileDescriptor");
-  if (fdclass == NULL) return NULL;  // exception
-
-  jmethodID init = env->GetMethodID(fdclass, "<init>", "()V");
-  if (init == NULL) return NULL;  // exception
-  jobject fdobj = env->NewObject(fdclass, init);
-
-  jfieldID fd_field = env->GetFieldID(fdclass, "fd", "I");
-  if (fd_field == NULL) return NULL;  // exception
-  env->SetIntField(fdobj, fd_field, fd);
-
-  return fdobj;
-}
-
-// static native FileDescriptor createPipe();
-extern "C" JNIEXPORT jobject JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_createPipe(JNIEnv *env,
-                                                                 jclass clazz) {
-  // Create a pipe for profile events from the handler to Java.
-  // The default pipe size is 64KiB on Linux and 16KiB on Mac OS X.
-  int pipefds[2];
-  if (pipe(pipefds) < 0) {
-    perror("pipe");
-    abort();
-  }
-  fd = pipefds[1];
-
-  // Make the write end non-blocking so that the signal
-  // handler can detect overflow (rather than deadlock).
-  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
-
-  // Return the read end of the event pipe,
-  // wrapped by a java FileDescriptor.
-  return makeFD(env, pipefds[0]);
-}
-
-// static native boolean startTimer(long period_micros);
-extern "C" JNIEXPORT jboolean JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_startTimer(
-    JNIEnv *env, jclass clazz, jlong period_micros) {
-  // Install the signal handler.
-  // Use sigaction(2) not signal(2) so that we can correctly
-  // restore the previous handler if necessary.
-  struct sigaction oldact = {}, act = {};
-  act.sa_handler = onsigprof;
-  act.sa_flags = SA_RESTART;  // the JVM doesn't expect EINTR
-  if (sigaction(SIGPROF, &act, &oldact) < 0) {
-    perror("sigaction");
-    abort();
-  }
-
-  // Is a handler already in effect?
-  // Check for 3-arg and 1-arg forms.
-  typedef void (*sighandler_t)(int);  // don't rely on this GNU extension
-  sighandler_t prev = (oldact.sa_flags & SA_SIGINFO) != 0
-                          ? reinterpret_cast<sighandler_t>(oldact.sa_sigaction)
-                          : oldact.sa_handler;
-  // The initial handler (DFL or IGN) may vary by thread package.
-  if (prev != SIG_DFL && prev != SIG_IGN) {
-    // Someone else is profiling this JVM.
-    // Restore their handler and fail.
-    (void)sigaction(SIGPROF, &oldact, nullptr);
-    return false;
-  }
-
-  // Start the CPU interval timer.
-  struct timeval period = {
-      .tv_sec = 0,
-      .tv_usec = static_cast<suseconds_t>(period_micros),
-  };
-  struct itimerval timer = {.it_interval = period, .it_value = period};
-  if (setitimer(ITIMER_PROF, &timer, nullptr) < 0) {
-    perror("setitimer");
-    abort();
-  }
-
-  return true;
-}
-
-// static native void stopTimer();
-extern "C" JNIEXPORT void JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_stopTimer(JNIEnv *env,
-                                                                jclass clazz) {
-  // Disarm the CPU interval timer.
-  struct itimerval timer = {};
-  if (setitimer(ITIMER_PROF, &timer, nullptr) < 0) {
-    perror("setitimer");
-    abort();
-  }
-
-  // Uninstall signal handler.
-  signal(SIGPROF, SIG_IGN);
-}
-
-}  // namespace cpu_profiler
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc b/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc
deleted file mode 100644
index 103d401..0000000
--- a/src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc
+++ /dev/null
@@ -1,52 +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.
-
-// Starlark CPU profiler stubs for unsupported platforms.
-
-#include <jni.h>
-#include <stdlib.h>
-
-namespace cpu_profiler {
-
-extern "C" JNIEXPORT jboolean JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_supported(JNIEnv *env,
-                                                                jclass clazz) {
-  return false;
-}
-
-extern "C" JNIEXPORT jint JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_gettid(JNIEnv *env,
-                                                             jclass clazz) {
-  abort();
-}
-
-extern "C" JNIEXPORT jobject JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_createPipe(JNIEnv *env,
-                                                                 jclass clazz) {
-  abort();
-}
-
-extern "C" JNIEXPORT jboolean JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_startTimer(
-    JNIEnv *env, jclass clazz, jlong period_micros) {
-  abort();
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_com_google_devtools_build_lib_syntax_CpuProfiler_stopTimer(JNIEnv *env,
-                                                                jclass clazz) {
-  abort();
-}
-
-}  // namespace cpu_profiler
diff --git a/src/main/java/com/google/devtools/build/skydoc/BUILD b/src/main/java/com/google/devtools/build/skydoc/BUILD
index 7aeea4e..3d02297 100644
--- a/src/main/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/BUILD
@@ -57,7 +57,6 @@
     srcs = glob(["*.java"]),
     visibility = ["//src/test:__subpackages__"],
     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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -90,6 +89,8 @@
         "//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/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/tools/starlark/java/com/google/devtools/starlark/common",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/FilesystemFileAccessor.java b/src/main/java/com/google/devtools/build/skydoc/FilesystemFileAccessor.java
index 4015cfd..80d2fbe 100644
--- a/src/main/java/com/google/devtools/build/skydoc/FilesystemFileAccessor.java
+++ b/src/main/java/com/google/devtools/build/skydoc/FilesystemFileAccessor.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.skydoc;
 
-import com.google.devtools.build.lib.syntax.ParserInput;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import net.starlark.java.syntax.ParserInput;
 
 /** Implementation of {@link StarlarkFileAccessor} which uses the real filesystem. */
 public class FilesystemFileAccessor implements StarlarkFileAccessor {
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index eb60115..664a54c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -46,24 +46,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.stubs.ProviderStub;
 import com.google.devtools.build.lib.starlarkbuildapi.stubs.StarlarkAspectStub;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestingBootstrap;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Expression;
-import com.google.devtools.build.lib.syntax.ExpressionStatement;
-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.Program;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFile;
-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.syntax.Statement;
-import com.google.devtools.build.lib.syntax.StringLiteral;
-import com.google.devtools.build.lib.syntax.SyntaxError;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeActionsInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeBuildApiGlobals;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeConfigApi;
@@ -146,6 +128,24 @@
 import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
+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.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Expression;
+import net.starlark.java.syntax.ExpressionStatement;
+import net.starlark.java.syntax.FileOptions;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.Program;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.Statement;
+import net.starlark.java.syntax.StringLiteral;
+import net.starlark.java.syntax.SyntaxError;
 
 /**
  * Main entry point for the Skydoc binary.
diff --git a/src/main/java/com/google/devtools/build/skydoc/StarlarkFileAccessor.java b/src/main/java/com/google/devtools/build/skydoc/StarlarkFileAccessor.java
index 369114d..0542a6c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/StarlarkFileAccessor.java
+++ b/src/main/java/com/google/devtools/build/skydoc/StarlarkFileAccessor.java
@@ -14,8 +14,8 @@
 
 package com.google.devtools.build.skydoc;
 
-import com.google.devtools.build.lib.syntax.ParserInput;
 import java.io.IOException;
+import net.starlark.java.syntax.ParserInput;
 
 /**
  * Helper to handle Skydoc file I/O. This abstraction is useful for tests which don't involve
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/BUILD
index 26e3c2c..802fdbb 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/BUILD
@@ -15,7 +15,6 @@
     name = "fakebuildapi",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -23,6 +22,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/ConfigApiFakes.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/ConfigApiFakes.java
index 0434dd5..919a543 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/ConfigApiFakes.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/ConfigApiFakes.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi.BuildSettingApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi.ExecTransitionFactoryApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** Fakes for callables under the {@link StarlarkConfigApi} module. */
 public class ConfigApiFakes {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeActionsInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeActionsInfoProvider.java
index dc23b95..5399e08 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeActionsInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeActionsInfoProvider.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.ActionsInfoProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link ActionsInfoProviderApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
index 26b5da0..2b3d482 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
@@ -16,8 +16,8 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.LateBoundDefaultApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkBuildApiGlobals;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Fake implementation of {@link StarlarkBuildApiGlobals}. */
 public class FakeBuildApiGlobals implements StarlarkBuildApiGlobals {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeConfigApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeConfigApi.java
index 9007edf..5b2ba52 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeConfigApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeConfigApi.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkConfigApi;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.skydoc.fakebuildapi.ConfigApiFakes.FakeBuildSettingDescriptor;
 import com.google.devtools.build.skydoc.fakebuildapi.ConfigApiFakes.FakeExecTransitionFactory;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link StarlarkConfigApi}. */
 public class FakeConfigApi implements StarlarkConfigApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
index 103d848..02b48d4 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
@@ -18,9 +18,9 @@
 import com.google.devtools.build.lib.starlarkbuildapi.DefaultInfoApi.DefaultInfoApiProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.RunfilesApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Fake implementation of {@link DefaultInfoApiProvider}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDescriptor.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDescriptor.java
index 6d6d25d3..88b8bb2 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDescriptor.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDescriptor.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAttrModuleApi.Descriptor;
-import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeType;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderNameGroup;
 import java.util.List;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link Descriptor}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeExecGroup.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeExecGroup.java
index 214ac42..18ffcd5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeExecGroup.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeExecGroup.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.ExecGroupApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link ExecGroupApi} */
 public class FakeExecGroup implements ExecGroupApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeLateBoundDefaultApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeLateBoundDefaultApi.java
index 6c81f56..9ea8671 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeLateBoundDefaultApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeLateBoundDefaultApi.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.LateBoundDefaultApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link LateBoundDefaultApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
index 7a50a43..dba1beb 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
@@ -15,9 +15,9 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.OutputGroupInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link OutputGroupInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
index e7ce53e..7a5bfb6 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
@@ -15,11 +15,11 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
 
 /** Fake callable implementation of {@link ProviderApi}. */
 public class FakeProviderApi implements StarlarkCallable, ProviderApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSplitTransitionProvider.java
index d84d18b..0cb3ba6 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSplitTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSplitTransitionProvider.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.SplitTransitionProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link SplitTransitionProviderApi}. */
 public class FakeSplitTransitionProvider implements SplitTransitionProviderApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAspect.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAspect.java
index 4a5d1b4..bf4ffb8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAspect.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAspect.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAspectApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkCallable;
 
 /** Fake implementation of {@link StarlarkAspectApi}. */
 public class FakeStarlarkAspect implements StarlarkCallable, StarlarkAspectApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
index 547e0f7..bbe8707 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
@@ -17,17 +17,17 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAttrModuleApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-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.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AttributeType;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Fake implementation of {@link StarlarkAttrModuleApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
index 0f19f49..1b1fd00 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
@@ -17,18 +17,18 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkNativeModuleApi;
-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.Location;
-import com.google.devtools.build.lib.syntax.NoneType;
-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.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 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.NoneType;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Fake implementation of {@link StarlarkNativeModuleApi}. */
 public class FakeStarlarkNativeModuleApi implements StarlarkNativeModuleApi, ClassObject {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
index 9ce5351..1573f18 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
@@ -23,14 +23,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAspectApi;
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleFunctionsApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.skydoc.rendering.AspectInfoWrapper;
 import com.google.devtools.build.skydoc.rendering.ProviderInfoWrapper;
 import com.google.devtools.build.skydoc.rendering.RuleInfoWrapper;
@@ -46,6 +38,14 @@
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * Fake implementation of {@link StarlarkRuleFunctionsApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
index 38fd011..15185b5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
@@ -20,13 +20,13 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Ordering;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
-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.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 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.Printer;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Fake implementation of {@link StructApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/BUILD
index a3e1b8f..1877c02 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/BUILD
@@ -15,7 +15,6 @@
     name = "android",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -24,6 +23,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
index dbb76ca..352629c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidApplicationResourceInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidApplicationResourceInfoApi.AndroidApplicationResourceInfoApiProvider;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDeviceBrokerInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link AndroidDeviceBrokerInfoApi}. */
 public class FakeAndroidApplicationResourceInfo implements AndroidDeviceBrokerInfoApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidAssetsInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidAssetsInfo.java
index 891a0d5..cdcd1be 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidAssetsInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidAssetsInfo.java
@@ -20,8 +20,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidAssetsInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ParsedAndroidAssetsApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidAssetsInfo. */
 public class FakeAndroidAssetsInfo
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidBinaryDataInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidBinaryDataInfo.java
index 1ef416a..67bd31f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidBinaryDataInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidBinaryDataInfo.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidBinaryDataInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of {@link AndroidBinaryDataInfoApi}. */
 public class FakeAndroidBinaryDataInfo implements AndroidBinaryDataInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidCcLinkParamsProvider.java
index 5672953..1d73b3e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidCcLinkParamsProvider.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidCcLinkParamsProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidCcLinkParamsProvider. */
 public class FakeAndroidCcLinkParamsProvider
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
index 949a2f7..a3e7ed3 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDeviceBrokerInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AndroidDeviceBrokerInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidFeatureFlagSetProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidFeatureFlagSetProvider.java
index 46c8e13..de535e7 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidFeatureFlagSetProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidFeatureFlagSetProvider.java
@@ -17,8 +17,8 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidFeatureFlagSetProviderApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of {@link AndroidFeatureFlagSetProviderApi}. */
 public class FakeAndroidFeatureFlagSetProvider implements AndroidFeatureFlagSetProviderApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdeInfoProvider.java
index 1b6736f..d22f44a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdeInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdeInfoProvider.java
@@ -20,10 +20,10 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidIdeInfoProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.OutputJarApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of AndroidIdeInfoProvider. */
 public class FakeAndroidIdeInfoProvider
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdlProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdlProvider.java
index 06aa79e..87a4be9 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdlProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidIdlProvider.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidIdlProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidIdlProvider. */
 public class FakeAndroidIdlProvider implements AndroidIdlProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
index a562d0b..b3a0996 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
@@ -16,8 +16,8 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidInstrumentationInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ApkInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link AndroidInstrumentationInfoApi}. */
 public class FakeAndroidInstrumentationInfo
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryAarInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryAarInfo.java
index 35866fc..154b7a0 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryAarInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryAarInfo.java
@@ -17,8 +17,8 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidLibraryAarInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of {@link AndroidLibraryAarInfoApi}. */
 public class FakeAndroidLibraryAarInfo implements AndroidLibraryAarInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryResourceClassJarProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryResourceClassJarProvider.java
index 19215a6..c3e1393 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryResourceClassJarProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidLibraryResourceClassJarProvider.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidLibraryResourceClassJarProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidLibraryResourceClassJarProvider. */
 public class FakeAndroidLibraryResourceClassJarProvider
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidManifestInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidManifestInfo.java
index 92f97c5..aabe3e0 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidManifestInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidManifestInfo.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidManifestInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidManifestInfo. */
 public class FakeAndroidManifestInfo implements AndroidManifestInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
index 1db41c6..2b12a03 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
@@ -17,8 +17,8 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidNativeLibsInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AndroidNativeLibsInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidPreDexJarProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidPreDexJarProvider.java
index 91dfd6f..cebdac0 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidPreDexJarProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidPreDexJarProvider.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidPreDexJarProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidPreDexJarProvider. */
 public class FakeAndroidPreDexJarProvider implements AndroidPreDexJarProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidProguardInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidProguardInfo.java
index 05cb379..85c985a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidProguardInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidProguardInfo.java
@@ -17,8 +17,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidProguardInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of AndroidProguardInfo. */
 public class FakeAndroidProguardInfo implements AndroidProguardInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
index 77b3a69..88acf4a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
@@ -20,9 +20,9 @@
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidManifestInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidResourcesInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ValidatedAndroidDataApi;
-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 net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of {@link AndroidResourcesInfoApi}. */
 public class FakeAndroidResourcesInfo
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java
index 21b5807..30a091d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FilesToRunProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidSdkProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
-import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of AndroidSdkProvider. */
 public class FakeAndroidSdkProvider
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSplitTransitition.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSplitTransitition.java
index 9373bf2..b7d8b2f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSplitTransitition.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSplitTransitition.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
 import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidSplitTransititionApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AndroidSplitTransititionApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
index 513cfb5..f9d2d30 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
@@ -17,9 +17,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ApkInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link ApkInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeDataBindingV2Provider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeDataBindingV2Provider.java
index a363dae..ef77e17 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeDataBindingV2Provider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeDataBindingV2Provider.java
@@ -18,9 +18,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.DataBindingV2ProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of {@link DataBindingV2Provider}. */
 public class FakeDataBindingV2Provider implements DataBindingV2ProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeProguardMappingProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeProguardMappingProvider.java
index 1ae4386..8c3b697 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeProguardMappingProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeProguardMappingProvider.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.android.ProguardMappingProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of ProguardMappingProvider. */
 public class FakeProguardMappingProvider implements ProguardMappingProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
index 871f01b..4ffa5c3 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/BUILD
@@ -15,7 +15,6 @@
     name = "apple",
     srcs = glob(["*.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/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple",
@@ -23,6 +22,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleCommon.java
index 131bc12..a018487 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleCommon.java
@@ -30,14 +30,14 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeSplitTransitionProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeStarlarkAspect;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeStructApi;
 import com.google.devtools.build.skydoc.fakebuildapi.apple.FakeAppleStaticLibraryInfo.FakeAppleStaticLibraryInfoProvider;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Fake implementation of {@link AppleCommonApi}. */
 public class FakeAppleCommon
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
index 69c3095..7a3420d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleDynamicFrameworkInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ObjcProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link AppleDynamicFrameworkInfoApi}. */
 public class FakeAppleDynamicFrameworkInfo implements AppleDynamicFrameworkInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
index 9680513..4cd651d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
@@ -17,8 +17,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleStaticLibraryInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ObjcProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AppleStaticLibraryInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeDottedVersion.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeDottedVersion.java
index e889bd4..005fa47 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeDottedVersion.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeDottedVersion.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi.apple;
 
 import com.google.devtools.build.lib.starlarkbuildapi.apple.DottedVersionApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link DottedVersionApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
index 5a237c7..1712004 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.ObjcProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationContextApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
 
 /**
  * Fake implementation of {@link ObjcProviderApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/BUILD
index e7214ca..85207b9 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/BUILD
@@ -15,10 +15,11 @@
     name = "config",
     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/starlarkbuildapi/config",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
index 5ec5275..71fefc0 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
@@ -16,10 +16,10 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigGlobalLibraryApi;
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
-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.StarlarkThread;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Fake implementation of {@link ConfigGlobalLibraryApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigurationTransition.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigurationTransition.java
index 31a241e..ee497a4 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigurationTransition.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigurationTransition.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi.config;
 
 import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link ConfigurationTransitionApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
index 271a268..72c92d1 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
@@ -15,7 +15,6 @@
     name = "cpp",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -25,6 +24,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/go",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
index c4a4e26..60b8dba 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcLinkingContextApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link CcInfoApi}. */
 public class FakeCcInfo implements CcInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index 917a80f..b21c1c5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -33,13 +33,13 @@
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LibraryToLinkApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LinkerInputApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkList;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.Tuple;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Tuple;
 
 /** Fake implementation of {@link CcModuleApi}. */
 public class FakeCcModule
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
index 0847720..be32f26 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcToolchainConfigInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link CcToolchainConfigInfoApi}. */
 public class FakeCcToolchainConfigInfo implements CcToolchainConfigInfoApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
index bc5ba85..09cea24 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
@@ -33,8 +33,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoContextInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.go.GoPackageInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Tuple;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Tuple;
 
 /** Fake implementation of {@link GoWrapCcHelperApi}. */
 public class FakeGoWrapCcHelper
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
index 5121f90..fa45d7e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
@@ -17,8 +17,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyCcLinkParamsProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link PyCcLinkParamsProviderApi}. */
 public class FakePyCcLinkParamsProvider implements PyCcLinkParamsProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
index 5d759bc..99bc274 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.WrapCcIncludeProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of {@link PyWrapCcHelperApi}. */
 public class FakePyWrapCcHelper
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
index 91ffee3..3d40dbe 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcHelperApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link PyWrapCcHelperApi}. */
 public class FakePyWrapCcInfo implements PyWrapCcInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
index 3090c0b..89b4c3a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
@@ -15,7 +15,6 @@
     name = "java",
     srcs = glob(["*.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/nestedset",
         "//src/main/java/com/google/devtools/build/lib/events",
@@ -25,6 +24,8 @@
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
index 4145cb4..ee310a5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
@@ -17,8 +17,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCcLinkParamsProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link JavaCcLinkParamsProvider}. */
 public class FakeJavaCcLinkParamsProvider
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
index 871f5511..59cb175 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
@@ -24,10 +24,10 @@
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCommonApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaToolchainStarlarkApiProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Fake implementation of {@link JavaCommonApi}. */
 public class FakeJavaCommon
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
index 7cb4110..3e72f02 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
@@ -20,10 +20,10 @@
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCompilationInfoProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaRuleOutputJarsProviderApi;
-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.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkThread;
 
 /**
  * Fake implementation of {@link JavaInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java
index a002c8b..2eb9a76 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaProtoCommonApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of {@link JavaProtoCommonApi}. */
 public class FakeJavaProtoCommon
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
index 70ec553..51d8c01 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
@@ -16,8 +16,8 @@
 
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaRuntimeInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 final class FakeJavaRuntimeInfoApi implements JavaRuntimeInfoApi {
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainStarlarkApiProviderApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainStarlarkApiProviderApi.java
index 0d7e47e..636188e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainStarlarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainStarlarkApiProviderApi.java
@@ -17,9 +17,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.JavaToolchainStarlarkApiProviderApi;
-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 net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
 
 final class FakeJavaToolchainStarlarkApiProviderApi implements JavaToolchainStarlarkApiProviderApi {
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeProguardSpecProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeProguardSpecProvider.java
index afe551e..c7db396 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeProguardSpecProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeProguardSpecProvider.java
@@ -16,7 +16,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.java.ProguardSpecProviderApi;
-import com.google.devtools.build.lib.syntax.EvalException;
+import net.starlark.java.eval.EvalException;
 
 /** Fake implementation of {@link ProguardSpecProviderApi} */
 public class FakeProguardSpecProvider implements ProguardSpecProviderApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/BUILD
index 470dc21..fff143f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/BUILD
@@ -15,10 +15,11 @@
     name = "proto",
     srcs = glob(["*.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/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/proto",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/FakeProtoInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/FakeProtoInfo.java
index 6b6526a..0da6f16 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/FakeProtoInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto/FakeProtoInfo.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.ProtoInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link ProtoInfoApi}. */
 public class FakeProtoInfo implements ProtoInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/BUILD
index c457e66..e0d840c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/BUILD
@@ -15,11 +15,12 @@
     name = "python",
     srcs = glob(["*.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/events",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
index 059da20..a7245d2 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
@@ -17,9 +17,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Fake implementation of {@link PyInfoApi}. */
 public class FakePyInfo implements PyInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
index debab34..43b8446 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
@@ -17,9 +17,9 @@
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyRuntimeInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Fake implementation of {@link PyRuntimeInfoApi}. */
 public class FakePyRuntimeInfo implements PyRuntimeInfoApi<FileApi> {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyStarlarkTransitions.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyStarlarkTransitions.java
index dedd9eb..313ec68 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyStarlarkTransitions.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyStarlarkTransitions.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.skydoc.fakebuildapi.python;
 
 import com.google.devtools.build.lib.starlarkbuildapi.python.PyStarlarkTransitionsApi;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigurationTransition;
+import net.starlark.java.eval.StarlarkValue;
 
 /** Fake implementation of {@link PyStarlarkTransitionsApi}. */
 public final class FakePyStarlarkTransitions implements PyStarlarkTransitionsApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/BUILD
index 424e2f3..f0b9960 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/BUILD
@@ -15,12 +15,13 @@
     name = "repository",
     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/starlarkbuildapi/repository",
         "//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",
         "//third_party:guava",
         "//third_party:jsr305",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
index ddef972..8f9edc3 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
@@ -17,13 +17,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryModuleApi;
-import com.google.devtools.build.lib.syntax.Dict;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.Sequence;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeDescriptor;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeStarlarkRuleFunctionsApi.AttributeNameComparator;
 import com.google.devtools.build.skydoc.rendering.RuleInfoWrapper;
@@ -32,6 +25,13 @@
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
 import java.util.List;
 import java.util.stream.Collectors;
+import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /**
  * Fake implementation of {@link RepositoryModuleApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/BUILD
index 828e07f..e3b9720 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/BUILD
@@ -15,11 +15,12 @@
     name = "test",
     srcs = glob(["*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisFailureInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisFailureInfoProvider.java
index 83870ad..60d6a8a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisFailureInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisFailureInfoProvider.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi.test;
 
 import com.google.devtools.build.lib.starlarkbuildapi.test.AnalysisFailureInfoApi.AnalysisFailureInfoProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AnalysisFailureInfoProviderApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisTestResultInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisTestResultInfoProvider.java
index 2d97f43..b177efc 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisTestResultInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeAnalysisTestResultInfoProvider.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.starlarkbuildapi.test.AnalysisTestResultInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.AnalysisTestResultInfoApi.AnalysisTestResultInfoProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link AnalysisTestResultInfoProviderApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
index 806c699..cd1ebcc 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
@@ -18,8 +18,8 @@
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.CoverageCommonApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.InstrumentedFilesInfoApi;
-import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.Sequence;
+import net.starlark.java.eval.Printer;
+import net.starlark.java.eval.Sequence;
 
 /** Fake implementation of {@link CoverageCommonApi}. */
 public class FakeCoverageCommon
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
index 55001ce..e424f1c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
@@ -16,8 +16,8 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.starlarkbuildapi.test.ExecutionInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link ExecutionInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeInstrumentedFilesInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeInstrumentedFilesInfoProvider.java
index 7502223..f58193a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeInstrumentedFilesInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeInstrumentedFilesInfoProvider.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.skydoc.fakebuildapi.test;
 
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
-import com.google.devtools.build.lib.syntax.Printer;
+import net.starlark.java.eval.Printer;
 
 /** Fake implementation of {@link InstrumentedFilesInfoProviderApi}. */
 public class FakeInstrumentedFilesInfoProvider implements ProviderApi {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
index 173f0c5..8b9e8a5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
@@ -16,9 +16,9 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestEnvironmentInfoApi;
-import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.Printer;
 import java.util.Map;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Printer;
 
 /**
  * Fake implementation of {@link TestEnvironmentInfoApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingModule.java
index 73be8b4..b14f48c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingModule.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.test.ExecutionInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestEnvironmentInfoApi;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestingModuleApi;
-import com.google.devtools.build.lib.syntax.Dict;
+import net.starlark.java.eval.Dict;
 
 /**
  * Fake implementation of {@link TestingModuleApi}.
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/AspectInfoWrapper.java b/src/main/java/com/google/devtools/build/skydoc/rendering/AspectInfoWrapper.java
index 7a76347..d553e02 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/AspectInfoWrapper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/AspectInfoWrapper.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AspectInfo;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.syntax.Location;
 
 /** Stores information about a Starlark aspect definition. */
 public class AspectInfoWrapper {
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/BUILD b/src/main/java/com/google/devtools/build/skydoc/rendering/BUILD
index 0da7b88..67793e9 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/BUILD
@@ -16,9 +16,10 @@
     srcs = glob(["*.java"]),
     resources = [":template_files"],
     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/skydoc/rendering/proto:stardoc_output_java_proto",
+        "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//src/tools/starlark/java/com/google/devtools/starlark/common",
         "//third_party:apache_velocity",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/DocstringParseException.java b/src/main/java/com/google/devtools/build/skydoc/rendering/DocstringParseException.java
index 2e78dc7..d198e9f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/DocstringParseException.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/DocstringParseException.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
-import com.google.devtools.build.lib.syntax.Location;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.StarlarkFunctionInfo;
 import com.google.devtools.starlark.common.DocstringUtils.DocstringParseError;
 import java.util.List;
+import net.starlark.java.syntax.Location;
 
 /**
  * An exception that may be thrown during construction of {@link StarlarkFunctionInfo} if the
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/FunctionUtil.java b/src/main/java/com/google/devtools/build/skydoc/rendering/FunctionUtil.java
index 874a3f5..c24e13e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/FunctionUtil.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/FunctionUtil.java
@@ -17,8 +17,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.FunctionParamInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.StarlarkFunctionInfo;
 import com.google.devtools.starlark.common.DocstringUtils;
@@ -28,6 +26,8 @@
 import java.util.List;
 import java.util.Map;
 import javax.annotation.Nullable;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkFunction;
 
 /** Contains a number of utility methods for functions and parameters. */
 public final class FunctionUtil {
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java b/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
index 728cf187..4b0e675 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/ProtoRenderer.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
-import com.google.devtools.build.lib.syntax.StarlarkFunction;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.AspectInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ModuleInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
@@ -24,6 +23,7 @@
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
+import net.starlark.java.eval.StarlarkFunction;
 
 /** Produces skydoc output in proto form. */
 public class ProtoRenderer {
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
index 26d0c48..8b569a8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/ProviderInfoWrapper.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderFieldInfo;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.ProviderInfo;
 import java.util.Collection;
+import net.starlark.java.eval.StarlarkCallable;
 
 /**
  * Stores information about a starlark provider definition, comprised of StarlarkCallable identifier
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java b/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
index 94dcd03..45ad633 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/RuleInfoWrapper.java
@@ -14,9 +14,9 @@
 
 package com.google.devtools.build.skydoc.rendering;
 
-import com.google.devtools.build.lib.syntax.Location;
-import com.google.devtools.build.lib.syntax.StarlarkCallable;
 import com.google.devtools.build.skydoc.rendering.proto.StardocOutputProtos.RuleInfo;
+import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.syntax.Location;
 
 /** Stores information about a Starlark rule definition. */
 public class RuleInfoWrapper {
