diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index e88bf80..dd9dd13 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -28,8 +28,8 @@
 import com.google.devtools.build.lib.packages.PackageFactory.GlobPatternExtractor;
 import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus;
 import com.google.devtools.build.lib.packages.util.PackageFactoryTestBase;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.ParserInput;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -1207,7 +1207,7 @@
   public void testGlobPatternExtractor() {
     GlobPatternExtractor globPatternExtractor = new GlobPatternExtractor();
     globPatternExtractor.visit(
-        BuildFileAST.parse(
+        StarlarkFile.parse(
             ParserInput.fromLines(
                 "pattern = '*'",
                 "some_variable = glob([",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 1792021..9ce4643 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -30,8 +30,8 @@
 import com.google.devtools.build.lib.packages.PackageFactory.LegacyGlobber;
 import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.packages.StarlarkSemanticsOptions;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 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.syntax.StarlarkThread.Extension;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -134,18 +134,16 @@
     return createPackage(packageIdentifier, buildFile, reporter, null);
   }
 
-  /**
-   * Parses the {@code buildFile} into a {@link BuildFileAST}.
-   */
-  public BuildFileAST ast(Path buildFile) throws IOException {
+  /** Parses the {@code buildFile} into a {@link StarlarkFile}. */
+  public StarlarkFile ast(Path buildFile) throws IOException {
     byte[] bytes = FileSystemUtils.readWithKnownFileSize(buildFile, buildFile.getFileSize());
     ParserInput input = ParserInput.create(bytes, buildFile.asFragment());
-    return BuildFileAST.parse(input, eventHandler);
+    return StarlarkFile.parse(input, eventHandler);
   }
 
   /** Evaluates the {@code buildFileAST} into a {@link Package}. */
   public Pair<Package, GlobCache> evalAndReturnGlobCache(
-      String packageName, RootedPath buildFile, BuildFileAST buildFileAST)
+      String packageName, RootedPath buildFile, StarlarkFile buildFileAST)
       throws InterruptedException, NoSuchPackageException {
     PackageIdentifier packageId = PackageIdentifier.createInMainRepo(packageName);
     GlobCache globCache =
@@ -191,7 +189,7 @@
     return Pair.of(result, globCache);
   }
 
-  public Package eval(String packageName, RootedPath buildFile, BuildFileAST buildFileAST)
+  public Package eval(String packageName, RootedPath buildFile, StarlarkFile buildFileAST)
       throws InterruptedException, NoSuchPackageException {
     return evalAndReturnGlobCache(packageName, buildFile, buildFileAST).first;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index 71ba585..23d6663 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.TestConstants;
@@ -214,7 +214,7 @@
   public void testASTIsNotRetained() throws Exception {
     createPkg1();
     Package pkg1 = getPackage("pkg1");
-    MoreAsserts.assertInstanceOfNotReachable(pkg1, BuildFileAST.class);
+    MoreAsserts.assertInstanceOfNotReachable(pkg1, StarlarkFile.class);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
index 8442317..3ef2e18 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
@@ -22,8 +22,8 @@
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.LoadStatement;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.vfs.FileStatus;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -153,7 +153,7 @@
     assertThat(loads).containsExactly(":ext2.bzl");
   }
 
-  private static List<String> getLoads(BuildFileAST file) {
+  private static List<String> getLoads(StarlarkFile file) {
     List<String> loads = Lists.newArrayList();
     for (Statement stmt : file.getStatements()) {
       if (stmt instanceof LoadStatement) {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
index c1bc87e..b6ea916 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunctionTest.FakeFileValue;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunctionTest.SkyKeyMatchers;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -77,7 +77,7 @@
     return env;
   }
 
-  private List<BuildFileAST> getASTs(String... lines)
+  private List<StarlarkFile> getASTs(String... lines)
       throws IOException, SkyFunctionException, InterruptedException {
     RootedPath workspacePath = createWorkspaceFile(lines);
 
@@ -88,7 +88,7 @@
 
   @Test
   public void testSplitASTNoLoad() throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts = getASTs("foo_bar = 1");
+    List<StarlarkFile> asts = getASTs("foo_bar = 1");
     assertThat(asts).hasSize(1);
     assertThat(asts.get(0).getStatements()).hasSize(1);
   }
@@ -96,14 +96,14 @@
   @Test
   public void testSplitASTOneLoadAtTop()
       throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts = getASTs("load('//:foo.bzl', 'bar')", "foo_bar = 1");
+    List<StarlarkFile> asts = getASTs("load('//:foo.bzl', 'bar')", "foo_bar = 1");
     assertThat(asts).hasSize(1);
     assertThat(asts.get(0).getStatements()).hasSize(2);
   }
 
   @Test
   public void testSplitASTOneLoad() throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts = getASTs("foo_bar = 1", "load('//:foo.bzl', 'bar')");
+    List<StarlarkFile> asts = getASTs("foo_bar = 1", "load('//:foo.bzl', 'bar')");
     assertThat(asts).hasSize(2);
     assertThat(asts.get(0).getStatements()).hasSize(1);
     assertThat(asts.get(1).getStatements()).hasSize(1);
@@ -112,7 +112,7 @@
   @Test
   public void testSplitASTTwoSuccessiveLoads()
       throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts =
+    List<StarlarkFile> asts =
         getASTs("foo_bar = 1", "load('//:foo.bzl', 'bar')", "load('//:bar.bzl', 'foo')");
     assertThat(asts).hasSize(2);
     assertThat(asts.get(0).getStatements()).hasSize(1);
@@ -122,7 +122,7 @@
   @Test
   public void testSplitASTTwoSucessiveLoadsWithNonLoadStatement()
       throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts =
+    List<StarlarkFile> asts =
         getASTs(
             "foo_bar = 1",
             "load('//:foo.bzl', 'bar')",
@@ -136,7 +136,7 @@
   @Test
   public void testSplitASTThreeLoadsThreeSegments()
       throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts =
+    List<StarlarkFile> asts =
         getASTs(
             "foo_bar = 1",
             "load('//:foo.bzl', 'bar')",
@@ -152,7 +152,7 @@
   @Test
   public void testSplitASTThreeLoadsThreeSegmentsWithContent()
       throws IOException, SkyFunctionException, InterruptedException {
-    List<BuildFileAST> asts =
+    List<StarlarkFile> asts =
         getASTs(
             "foo_bar = 1",
             "load('//:foo.bzl', 'bar')",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 21e4578..7baff22 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -48,7 +48,6 @@
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.skyframe.SkylarkImportLookupFunction;
 import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.ClassObject;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.EvalUtils;
@@ -57,6 +56,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+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.testutil.MoreAsserts;
@@ -704,7 +704,7 @@
 
   protected void evalAndExport(String... lines) throws Exception {
     ParserInput input = ParserInput.fromLines(lines);
-    BuildFileAST file = BuildFileAST.parseAndValidateSkylark(input, ev.getStarlarkThread());
+    StarlarkFile file = StarlarkFile.parseAndValidateSkylark(input, ev.getStarlarkThread());
     SkylarkImportLookupFunction.execAndExport(
         file, FAKE_LABEL, ev.getEventHandler(), ev.getStarlarkThread());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkdebug/server/SkylarkDebugServerTest.java b/src/test/java/com/google/devtools/build/lib/skylarkdebug/server/SkylarkDebugServerTest.java
index 93b8128..a614466 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkdebug/server/SkylarkDebugServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkdebug/server/SkylarkDebugServerTest.java
@@ -37,12 +37,12 @@
 import com.google.devtools.build.lib.skylarkdebugging.SkylarkDebuggingProtos.StartDebuggingResponse;
 import com.google.devtools.build.lib.skylarkdebugging.SkylarkDebuggingProtos.Stepping;
 import com.google.devtools.build.lib.skylarkdebugging.SkylarkDebuggingProtos.Value;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.ParserInput;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -136,7 +136,7 @@
 
   @Test
   public void testPausedUntilStartDebuggingRequestReceived() throws Exception {
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]");
     StarlarkThread thread = newStarlarkThread();
 
     Thread evaluationThread = execInWorkerThread(buildFile, thread);
@@ -167,7 +167,7 @@
   @Test
   public void testResumeAllThreads() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
 
     Location breakpoint =
         Location.newBuilder().setLineNumber(2).setPath("/a/build/file/BUILD").build();
@@ -202,7 +202,7 @@
   @Test
   public void testPauseAtBreakpoint() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -230,7 +230,7 @@
   @Test
   public void testDoNotPauseAtUnsatisfiedConditionalBreakpoint() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile =
+    StarlarkFile buildFile =
         parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]", "z = 1");
     StarlarkThread thread = newStarlarkThread();
 
@@ -266,7 +266,7 @@
   @Test
   public void testPauseAtSatisfiedConditionalBreakpoint() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location location =
@@ -296,7 +296,7 @@
   @Test
   public void testPauseAtInvalidConditionBreakpointWithError() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location location =
@@ -341,7 +341,7 @@
   @Test
   public void testSimpleListFramesRequest() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -372,7 +372,7 @@
   @Test
   public void testGetChildrenRequest() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -402,7 +402,7 @@
   @Test
   public void testListFramesShadowedBinding() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST bzlFile =
+    StarlarkFile bzlFile =
         parseSkylarkFile(
             "/a/build/file/test.bzl",
             "a = 1",
@@ -465,7 +465,7 @@
   @Test
   public void testEvaluateRequestWithExpression() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -492,7 +492,7 @@
   @Test
   public void testEvaluateRequestWithAssignmentStatement() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -526,7 +526,7 @@
   @Test
   public void testEvaluateRequestWithExpressionStatementMutatingState() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -560,7 +560,7 @@
   @Test
   public void testEvaluateRequestThrowingException() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
+    StarlarkFile buildFile = parseBuildFile("/a/build/file/BUILD", "x = [1,2,3]", "y = [2,3,4]");
     StarlarkThread thread = newStarlarkThread();
 
     Location breakpoint =
@@ -587,7 +587,7 @@
   @Test
   public void testStepIntoFunction() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST bzlFile =
+    StarlarkFile bzlFile =
         parseSkylarkFile(
             "/a/build/file/test.bzl",
             "def fn():",
@@ -635,7 +635,7 @@
   @Test
   public void testStepOverFunction() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST bzlFile =
+    StarlarkFile bzlFile =
         parseSkylarkFile(
             "/a/build/file/test.bzl",
             "def fn():",
@@ -678,7 +678,7 @@
   @Test
   public void testStepOutOfFunction() throws Exception {
     sendStartDebuggingRequest();
-    BuildFileAST bzlFile =
+    StarlarkFile bzlFile =
         parseSkylarkFile(
             "/a/build/file/test.bzl",
             "def fn():",
@@ -763,22 +763,22 @@
     return StarlarkThread.builder(mutability).useDefaultSemantics().build();
   }
 
-  private BuildFileAST parseBuildFile(String path, String... lines) throws IOException {
+  private StarlarkFile parseBuildFile(String path, String... lines) throws IOException {
     Path file = scratch.file(path, lines);
     byte[] bytes = FileSystemUtils.readWithKnownFileSize(file, file.getFileSize());
     ParserInput inputSource = ParserInput.create(bytes, file.asFragment());
-    return BuildFileAST.parse(inputSource, events.reporter());
+    return StarlarkFile.parse(inputSource, events.reporter());
   }
 
-  private BuildFileAST parseSkylarkFile(String path, String... lines) throws IOException {
+  private StarlarkFile parseSkylarkFile(String path, String... lines) throws IOException {
     return parseBuildFile(path, lines); // TODO(adonovan): combine these functions
   }
 
   /**
-   * Creates and starts a worker thread executing the given {@link BuildFileAST} in the given
+   * Creates and starts a worker thread executing the given {@link StarlarkFile} in the given
    * environment.
    */
-  private Thread execInWorkerThread(BuildFileAST ast, StarlarkThread thread) {
+  private Thread execInWorkerThread(StarlarkFile ast, StarlarkThread thread) {
     Thread javaThread =
         new Thread(
             () -> {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ASTPrettyPrintTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ASTPrettyPrintTest.java
index 5078938..12ca90a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ASTPrettyPrintTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ASTPrettyPrintTest.java
@@ -389,15 +389,13 @@
 
   @Test
   public void buildFileAST() {
-    Node node = parseBuildFileASTWithoutValidation("print(x)\nprint(y)");
+    Node node = parseStarlarkFileWithoutValidation("print(x)\nprint(y)");
     assertIndentedPrettyMatches(
         node,
         join("  print(x)",
              "  print(y)",
              ""));
-    assertTostringMatches(
-        node,
-        "<BuildFileAST with 2 statements>");
+    assertTostringMatches(node, "<StarlarkFile with 2 statements>");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
index e7ac035..0b651fc 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
@@ -52,7 +52,7 @@
 
   private static void assertBoundNames(String assignment, String... expectedBoundNames) {
     ParserInput input = ParserInput.fromLines(assignment);
-    BuildFileAST file = BuildFileAST.parse(input, StarlarkThread.FAIL_FAST_HANDLER);
+    StarlarkFile file = StarlarkFile.parse(input, StarlarkThread.FAIL_FAST_HANDLER);
     Expression lhs = ((AssignmentStatement) file.getStatements().get(0)).getLHS();
     Set<String> boundNames =
         Identifier.boundIdentifiers(lhs).stream()
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
index 0cb7d87..6be69bf 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
@@ -26,9 +26,9 @@
 @RunWith(JUnit4.class)
 public final class NodeVisitorTest {
 
-  private BuildFileAST parse(String... lines) throws IOException {
+  private StarlarkFile parse(String... lines) throws IOException {
     ParserInput input = ParserInput.fromLines(lines);
-    return BuildFileAST.parse(input, StarlarkThread.FAIL_FAST_HANDLER);
+    return StarlarkFile.parse(input, StarlarkThread.FAIL_FAST_HANDLER);
   }
 
   @Test
@@ -48,7 +48,7 @@
       }
     }
 
-    BuildFileAST file =
+    StarlarkFile file =
         parse(
             "a = b", //
             "def c(p1, p2=4, **p3):",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index b136f3a..45c8655 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -58,9 +58,9 @@
   }
 
   // Joins the lines, parses, and returns a file.
-  private BuildFileAST parseFile(String... lines) {
+  private StarlarkFile parseFile(String... lines) {
     ParserInput input = ParserInput.fromLines(lines);
-    return BuildFileAST.parse(input, events.reporter());
+    return StarlarkFile.parse(input, events.reporter());
   }
 
   // Joins the lines, parses, and returns the sole statement.
@@ -991,7 +991,7 @@
 
   @Test
   public void testParseBuildFileWithComments() throws Exception {
-    BuildFileAST result =
+    StarlarkFile result =
         parseFile(
             "# Test BUILD file", //
             "# with multi-line comment",
@@ -1007,7 +1007,7 @@
 
   @Test
   public void testParseBuildFileWithManyComments() throws Exception {
-    BuildFileAST result =
+    StarlarkFile result =
         parseFile(
             "# 1", //
             "# 2",
@@ -1386,7 +1386,7 @@
 
   @Test
   public void testStringsAreDeduped() throws Exception {
-    BuildFileAST file = parseFile("L1 = ['cat', 'dog', 'fish']", "L2 = ['dog', 'fish', 'cat']");
+    StarlarkFile file = parseFile("L1 = ['cat', 'dog', 'fish']", "L2 = ['dog', 'fish', 'cat']");
     Set<String> uniqueStringInstances = Sets.newIdentityHashSet();
     NodeVisitor collectAllStringsInStringLiteralsVisitor =
         new NodeVisitor() {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
similarity index 78%
rename from src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
rename to src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
index 4132b35..24a7fa0 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
@@ -27,11 +27,9 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Unit tests for BuildFileAST.
- */
+/** Unit tests for StarlarkFile. */
 @RunWith(JUnit4.class)
-public class BuildFileASTTest extends EvaluationTestCase {
+public class StarlarkFileTest extends EvaluationTestCase {
 
   private Scratch scratch = new Scratch();
 
@@ -41,22 +39,23 @@
   }
 
   /**
-   * Parses the contents of the specified string (using DUMMY_PATH as the fake
-   * filename) and returns the AST. Resets the error handler beforehand.
+   * Parses the contents of the specified string (using DUMMY_PATH as the fake filename) and returns
+   * the AST. Resets the error handler beforehand.
    */
-  private BuildFileAST parseBuildFile(String... lines) throws IOException {
+  private StarlarkFile parseBuildFile(String... lines) throws IOException {
     Path file = scratch.file("/a/build/file/BUILD", lines);
     byte[] bytes = FileSystemUtils.readWithKnownFileSize(file, file.getFileSize());
     ParserInput input = ParserInput.create(bytes, file.asFragment());
-    return BuildFileAST.parse(input, getEventHandler());
+    return StarlarkFile.parse(input, getEventHandler());
   }
 
   @Test
   public void testParseBuildFileOK() throws Exception {
-    BuildFileAST buildfile = parseBuildFile(
-        "# a file in the build language",
-        "",
-        "x = [1,2,'foo',4] + [1,2, \"%s%d\" % ('foo', 1)]");
+    StarlarkFile buildfile =
+        parseBuildFile(
+            "# a file in the build language",
+            "",
+            "x = [1,2,'foo',4] + [1,2, \"%s%d\" % ('foo', 1)]");
 
     assertThat(buildfile.exec(thread, getEventHandler())).isTrue();
 
@@ -71,11 +70,7 @@
   @Test
   public void testEvalException() throws Exception {
     setFailFast(false);
-    BuildFileAST buildfile = parseBuildFile(
-        "x = 1",
-        "y = [2,3]",
-        "",
-        "z = x + y");
+    StarlarkFile buildfile = parseBuildFile("x = 1", "y = [2,3]", "", "z = x + y");
 
     assertThat(buildfile.exec(thread, getEventHandler())).isFalse();
     Event e = assertContainsError("unsupported operand type(s) for +: 'int' and 'list'");
@@ -84,7 +79,7 @@
 
   @Test
   public void testParsesFineWithNewlines() throws Exception {
-    BuildFileAST buildFileAST = parseBuildFile("foo()", "bar()", "something = baz()", "bar()");
+    StarlarkFile buildFileAST = parseBuildFile("foo()", "bar()", "something = baz()", "bar()");
     assertThat(buildFileAST.getStatements()).hasSize(4);
   }
 
@@ -92,8 +87,7 @@
   public void testFailsIfNewlinesAreMissing() throws Exception {
     setFailFast(false);
 
-    BuildFileAST buildFileAST =
-      parseBuildFile("foo() bar() something = baz() bar()");
+    StarlarkFile buildFileAST = parseBuildFile("foo() bar() something = baz() bar()");
 
     Event event = assertContainsError("syntax error at \'bar\': expected newline");
     assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
@@ -104,7 +98,7 @@
   @Test
   public void testImplicitStringConcatenationFails() throws Exception {
     setFailFast(false);
-    BuildFileAST buildFileAST = parseBuildFile("a = 'foo' 'bar'");
+    StarlarkFile buildFileAST = parseBuildFile("a = 'foo' 'bar'");
     Event event = assertContainsError(
         "Implicit string concatenation is forbidden, use the + operator");
     assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
@@ -116,7 +110,7 @@
   @Test
   public void testImplicitStringConcatenationAcrossLinesIsIllegal() throws Exception {
     setFailFast(false);
-    BuildFileAST buildFileAST = parseBuildFile("a = 'foo'\n  'bar'");
+    StarlarkFile buildFileAST = parseBuildFile("a = 'foo'\n  'bar'");
 
     Event event = assertContainsError("indentation error");
     assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
@@ -128,14 +122,15 @@
   @Test
   public void testWithSyntaxErrorsDoesNotPrintDollarError() throws Exception {
     setFailFast(false);
-    BuildFileAST buildFile = parseBuildFile(
-        "abi = '$(ABI)-glibc-' + glibc_version + '-' + $(TARGET_CPU) + '-linux'",
-        "libs = [abi + opt_level + '/lib/libcc.a']",
-        "shlibs = [abi + opt_level + '/lib/libcc.so']",
-        "+* shlibs", // syntax error at '+'
-        "cc_library(name = 'cc',",
-        "           srcs = libs,",
-        "           includes = [ abi + opt_level + '/include' ])");
+    StarlarkFile buildFile =
+        parseBuildFile(
+            "abi = '$(ABI)-glibc-' + glibc_version + '-' + $(TARGET_CPU) + '-linux'",
+            "libs = [abi + opt_level + '/lib/libcc.a']",
+            "shlibs = [abi + opt_level + '/lib/libcc.so']",
+            "+* shlibs", // syntax error at '+'
+            "cc_library(name = 'cc',",
+            "           srcs = libs,",
+            "           includes = [ abi + opt_level + '/include' ])");
     assertThat(buildFile.containsErrors()).isTrue();
     assertContainsError("syntax error at '*': expected expression");
     assertThat(buildFile.exec(thread, getEventHandler())).isFalse();
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
index 8784cbb..a3746ee 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
@@ -190,7 +190,7 @@
   @Test
   public void testBuiltinsCanBeShadowed() throws Exception {
     StarlarkThread thread = newStarlarkThreadWithSkylarkOptions().setup("special_var", 42);
-    BuildFileAST.eval(ParserInput.fromLines("special_var = 41"), thread);
+    StarlarkFile.eval(ParserInput.fromLines("special_var = 41"), thread);
     assertThat(thread.moduleLookup("special_var")).isEqualTo(41);
   }
 
@@ -198,7 +198,7 @@
   public void testVariableIsReferencedBeforeAssignment() throws Exception {
     StarlarkThread thread = newStarlarkThread().update("global_var", 666);
     try {
-      BuildFileAST.eval(
+      StarlarkFile.eval(
           ParserInput.fromLines("def foo(x): x += global_var; global_var = 36; return x", "foo(1)"),
           thread);
       throw new AssertionError("failed to fail");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index 456c56b..35425cc 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -27,13 +27,13 @@
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.SymbolGenerator;
-import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Expression;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.ParserInput;
 import com.google.devtools.build.lib.syntax.SkylarkUtils;
 import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
+import com.google.devtools.build.lib.syntax.StarlarkFile;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkThread.FailFastException;
 import com.google.devtools.build.lib.syntax.Statement;
@@ -150,13 +150,13 @@
     return thread;
   }
 
-  protected final BuildFileAST parseBuildFileASTWithoutValidation(String... lines) {
+  protected final StarlarkFile parseStarlarkFileWithoutValidation(String... lines) {
     ParserInput input = ParserInput.fromLines(lines);
-    return BuildFileAST.parse(input, getEventHandler());
+    return StarlarkFile.parse(input, getEventHandler());
   }
 
-  private BuildFileAST parseBuildFileAST(String... lines) {
-    BuildFileAST ast = parseBuildFileASTWithoutValidation(lines);
+  private StarlarkFile parseStarlarkFile(String... lines) {
+    StarlarkFile ast = parseStarlarkFileWithoutValidation(lines);
     return ast.validate(thread, /*isBuildFile=*/ false, getEventHandler());
   }
 
@@ -165,12 +165,12 @@
   // Separate all the tests clearly into tests of the scanner, parser, resolver,
   // and evaluation.
   protected List<Statement> parseFile(String... lines) {
-    return parseBuildFileAST(lines).getStatements();
+    return parseStarlarkFile(lines).getStatements();
   }
 
   /** Parses a statement, without validation. */
   protected final Statement parseStatement(String... lines) {
-    return parseBuildFileASTWithoutValidation(lines).getStatements().get(0);
+    return parseStarlarkFileWithoutValidation(lines).getStatements().get(0);
   }
 
   /** Parses an expression. */
@@ -191,9 +191,9 @@
     ParserInput input = ParserInput.fromLines(lines);
     if (testMode == TestMode.SKYLARK) {
       // TODO(adonovan): inline this call and factor with 'else' case.
-      return BuildFileAST.eval(input, thread);
+      return StarlarkFile.eval(input, thread);
     } else {
-      BuildFileAST file = BuildFileAST.parse(input, thread.getEventHandler());
+      StarlarkFile file = StarlarkFile.parse(input, thread.getEventHandler());
       if (ValidationEnvironment.validateFile(
           file, thread, /*isBuildFile=*/ true, thread.getEventHandler())) {
         PackageFactory.checkBuildSyntax(file, thread.getEventHandler());
