Refactor AST APIs

Added public visibility to some constructors/accessors, and made child LValue nodes explicitly constructed by the caller rather than hidden inside constructors. This makes it easier to treat nodes as uniform dumb values. Also added some helpers.

RELNOTES: None
PiperOrigin-RevId: 158761415
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 1cb224d..763b233 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
@@ -212,26 +212,17 @@
   }
 
   /**
-   * Entry-point to parser that parses a build file with comments. All errors encountered during
-   * parsing are reported via "reporter".
+   * Entry-point for parsing a file with comments.
+   *
+   * @param input the input to parse
+   * @param eventHandler a reporter for parsing errors
+   * @param parsingMode if set to {@link ParsingMode#BUILD}, restricts the parser to just the
+   *     features present in the Build language
    */
-  public static ParseResult parseFile(ParserInputSource input, EventHandler eventHandler) {
+  public static ParseResult parseFile(
+      ParserInputSource input, EventHandler eventHandler, ParsingMode parsingMode) {
     Lexer lexer = new Lexer(input, eventHandler);
-    Parser parser = new Parser(lexer, eventHandler, BUILD);
-    List<Statement> statements = parser.parseFileInput();
-    return new ParseResult(statements, parser.comments, locationFromStatements(lexer, statements),
-        parser.errorsCount > 0 || lexer.containsErrors());
-  }
-
-  /**
-   * Entry-point to parser that parses a build file with comments. All errors encountered during
-   * parsing are reported via "reporter". Enable Skylark extensions that are not part of the core
-   * BUILD language.
-   */
-  public static ParseResult parseFileForSkylark(
-      ParserInputSource input, EventHandler eventHandler) {
-    Lexer lexer = new Lexer(input, eventHandler);
-    Parser parser = new Parser(lexer, eventHandler, SKYLARK);
+    Parser parser = new Parser(lexer, eventHandler, parsingMode);
     List<Statement> statements = parser.parseFileInput();
     return new ParseResult(
         statements,
@@ -240,15 +231,30 @@
         parser.errorsCount > 0 || lexer.containsErrors());
   }
 
+  /** Convenience method for {@code parseFile} with the Build language. */
+  public static ParseResult parseFile(ParserInputSource input, EventHandler eventHandler) {
+    return parseFile(input, eventHandler, BUILD);
+  }
+
+  /** Convenience method for {@code parseFile} with Skylark. */
+  public static ParseResult parseFileForSkylark(
+      ParserInputSource input, EventHandler eventHandler) {
+    return parseFile(input, eventHandler, SKYLARK);
+  }
+
   /**
-   * Entry-point to parser that parses an expression.  All errors encountered
-   * during parsing are reported via "reporter".  The expression may be followed
-   * by newline tokens.
+   * Entry-point for parsing an expression. The expression may be followed by newline tokens.
+   *
+   * @param input the input to parse
+   * @param eventHandler a reporter for parsing errors
+   * @param parsingMode if set to {@link ParsingMode#BUILD}, restricts the parser to just the
+   *     features present in the Build language
    */
   @VisibleForTesting
-  public static Expression parseExpression(ParserInputSource input, EventHandler eventHandler) {
+  public static Expression parseExpression(
+      ParserInputSource input, EventHandler eventHandler, ParsingMode parsingMode) {
     Lexer lexer = new Lexer(input, eventHandler);
-    Parser parser = new Parser(lexer, eventHandler, null);
+    Parser parser = new Parser(lexer, eventHandler, parsingMode);
     Expression result = parser.parseExpression();
     while (parser.token.kind == TokenKind.NEWLINE) {
       parser.nextToken();
@@ -257,6 +263,19 @@
     return result;
   }
 
+  /** Convenience method for {@code parseExpression} with the Build language. */
+  @VisibleForTesting
+  public static Expression parseExpression(ParserInputSource input, EventHandler eventHandler) {
+    return parseExpression(input, eventHandler, BUILD);
+  }
+
+  /** Convenience method for {@code parseExpression} with Skylark. */
+  @VisibleForTesting
+  public static Expression parseExpressionForSkylark(
+      ParserInputSource input, EventHandler eventHandler) {
+    return parseExpression(input, eventHandler, SKYLARK);
+  }
+
   private void reportError(Location location, String message) {
     errorsCount++;
     // Limit the number of reported errors to avoid spamming output.
@@ -1200,14 +1219,16 @@
       nextToken();
       Expression rvalue = parseExpression();
       return setLocation(
-          new AssignmentStatement(/*lvalue=*/ expression, /*expression=*/ rvalue), start, rvalue);
+          new AssignmentStatement(new LValue(expression), rvalue),
+          start, rvalue);
     } else if (augmentedAssignmentMethods.containsKey(token.kind)) {
       Operator operator = augmentedAssignmentMethods.get(token.kind);
       nextToken();
       Expression operand = parseExpression();
       int end = operand.getLocation().getEndOffset();
       return setLocation(
-          new AugmentedAssignmentStatement(operator, expression, operand), start, end);
+          new AugmentedAssignmentStatement(operator, new LValue(expression), operand),
+          start, end);
     } else {
       return setLocation(new ExpressionStatement(expression), start, expression);
     }
@@ -1254,7 +1275,7 @@
     enterLoop();
     try {
       List<Statement> block = parseSuite();
-      Statement stmt = new ForStatement(loopVar, collection, block);
+      Statement stmt = new ForStatement(new LValue(loopVar), collection, block);
       list.add(setLocation(stmt, start, token.right));
     } finally {
       exitLoop();