diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
index 2ba51d7..2f8b36b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
@@ -13,10 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
-import static com.google.devtools.build.lib.syntax.Parser.Dialect.BUILD;
-import static com.google.devtools.build.lib.syntax.Parser.Dialect.SKYLARK;
-
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -124,8 +120,7 @@
    * Collects all load statements. Returns a pair with a boolean saying if there were errors and the
    * imports that could be resolved.
    */
-  @VisibleForTesting
-  static Pair<Boolean, ImmutableList<SkylarkImport>> fetchLoads(
+  private static Pair<Boolean, ImmutableList<SkylarkImport>> fetchLoads(
       List<Statement> statements, EventHandler eventHandler) {
     ImmutableList.Builder<SkylarkImport> imports = ImmutableList.builder();
     boolean error = false;
@@ -272,13 +267,15 @@
   public static BuildFileAST parseBuildFile(ParserInputSource input,
                                             List<Statement> preludeStatements,
                                             EventHandler eventHandler) {
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, BUILD);
-    return create(preludeStatements, result, /*contentHashCode=*/ null, eventHandler);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
+    return create(preludeStatements, result, /*contentHashCode=*/ null, eventHandler)
+        .validateBuildFile(eventHandler);
   }
 
   public static BuildFileAST parseBuildFile(ParserInputSource input, EventHandler eventHandler) {
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, BUILD);
-    return create(ImmutableList.<Statement>of(), result, /*contentHashCode=*/ null, eventHandler);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
+    return create(ImmutableList.<Statement>of(), result, /*contentHashCode=*/ null, eventHandler)
+        .validateBuildFile(eventHandler);
   }
 
   /**
@@ -295,14 +292,14 @@
   public static BuildFileAST parseSkylarkFile(Path file, long fileSize, EventHandler eventHandler)
       throws IOException {
     ParserInputSource input = ParserInputSource.create(file, fileSize);
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, SKYLARK);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
     return create(
         ImmutableList.of(), result,
         HashCode.fromBytes(file.getDigest()).toString(), eventHandler);
   }
 
   public static BuildFileAST parseSkylarkFile(ParserInputSource input, EventHandler eventHandler) {
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, SKYLARK);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
     return create(ImmutableList.<Statement>of(), result, /*contentHashCode=*/ null, eventHandler);
   }
 
@@ -315,7 +312,7 @@
    */
   public static BuildFileAST parseSkylarkFileWithoutImports(
       ParserInputSource input, EventHandler eventHandler) {
-    ParseResult result = Parser.parseFile(input, eventHandler, SKYLARK);
+    ParseResult result = Parser.parseFile(input, eventHandler);
     return new BuildFileAST(
         ImmutableList.<Statement>builder()
             .addAll(ImmutableList.<Statement>of())
@@ -341,20 +338,28 @@
     return new BuildFileAST(statements, true, contentHashCode, getLocation(), comments, imports);
   }
 
-  private static BuildFileAST parseString(
-      Parser.Dialect dialect, EventHandler eventHandler, String... content) {
+  /**
+   * Run static checks for a BUILD file.
+   *
+   * @return a new AST (or the same), with the containsErrors flag updated.
+   */
+  public BuildFileAST validateBuildFile(EventHandler eventHandler) {
+    boolean valid = ValidationEnvironment.checkBuildSyntax(statements, eventHandler);
+    if (valid || containsErrors) {
+      return this;
+    }
+    return new BuildFileAST(statements, true, contentHashCode, getLocation(), comments, imports);
+  }
+
+  public static BuildFileAST parseString(EventHandler eventHandler, String... content) {
     String str = Joiner.on("\n").join(content);
     ParserInputSource input = ParserInputSource.create(str, PathFragment.EMPTY_FRAGMENT);
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, dialect);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
     return create(ImmutableList.of(), result, null, eventHandler);
   }
 
   public static BuildFileAST parseBuildString(EventHandler eventHandler, String... content) {
-    return parseString(BUILD, eventHandler, content);
-  }
-
-  public static BuildFileAST parseSkylarkString(EventHandler eventHandler, String... content) {
-    return parseString(SKYLARK, eventHandler, content);
+    return parseString(eventHandler, content).validateBuildFile(eventHandler);
   }
 
   /**
@@ -363,7 +368,7 @@
    * @return true if the input file is syntactically valid
    */
   public static boolean checkSyntax(ParserInputSource input, EventHandler eventHandler) {
-    Parser.ParseResult result = Parser.parseFile(input, eventHandler, BUILD);
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler);
     return !result.containsErrors;
   }
 
@@ -402,7 +407,7 @@
    */
   public static BuildFileAST parseAndValidateSkylarkString(Environment env, String[] input)
       throws EvalException {
-    BuildFileAST ast = parseSkylarkString(env.getEventHandler(), input);
+    BuildFileAST ast = parseString(env.getEventHandler(), input);
     ValidationEnvironment.validateAst(env, ast.getStatements());
     return ast;
   }
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
index e948b84..6edf737 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -201,20 +201,14 @@
    *
    * @param input the input to parse
    * @param eventHandler a reporter for parsing errors
-   * @param dialect may restrict the parser to Build-language features
    * @see BuildFileAST#parseBuildString
    * @see BuildFileAST#parseSkylarkString
    */
-  public static ParseResult parseFile(
-      ParserInputSource input, EventHandler eventHandler, Dialect dialect) {
+  public static ParseResult parseFile(ParserInputSource input, EventHandler eventHandler) {
     Lexer lexer = new Lexer(input, eventHandler);
     Parser parser = new Parser(lexer, eventHandler);
     List<Statement> statements = parser.parseFileInput();
     boolean errors = parser.errorsCount > 0 || lexer.containsErrors();
-    // TODO(laurentlb): Remove dialect argument.
-    if (dialect == Dialect.BUILD) {
-      errors |= !ValidationEnvironment.checkBuildSyntax(statements, eventHandler);
-    }
     return new ParseResult(
         statements, parser.comments, locationFromStatements(lexer, statements), errors);
   }
