Cleanup in ValidationEnvironment, provide static methods, reduce visibility.

Call sites were creating a ValidationEnvironment object with no other purpose
than calling validateAst(). Simplify the code so that callers don't have to
worry about it.

RELNOTES: None.
PiperOrigin-RevId: 158705853
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
index b66e0d6..f06c15f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
@@ -47,10 +47,8 @@
   // branches of if-else statements.
   private final Stack<Set<String>> futureReadOnlyVariables = new Stack<>();
 
-  /**
-   * Create a ValidationEnvironment for a given global Environment.
-   */
-  public ValidationEnvironment(Environment env) {
+  /** Create a ValidationEnvironment for a given global Environment. */
+  ValidationEnvironment(Environment env) {
     Preconditions.checkArgument(env.isGlobal());
     parent = null;
     Set<String> builtinVariables = env.getVariableNames();
@@ -59,27 +57,20 @@
     semantics = env.getSemantics();
   }
 
-  /**
-   * Creates a local ValidationEnvironment to validate user defined function bodies.
-   */
-  public ValidationEnvironment(ValidationEnvironment parent) {
+  /** Creates a local ValidationEnvironment to validate user defined function bodies. */
+  ValidationEnvironment(ValidationEnvironment parent) {
     // Don't copy readOnlyVariables: Variables may shadow global values.
     this.parent = parent;
     semantics = parent.semantics;
   }
 
-  /**
-   * Returns true if this ValidationEnvironment is top level i.e. has no parent.
-   */
-  public boolean isTopLevel() {
+  /** Returns true if this ValidationEnvironment is top level i.e. has no parent. */
+  boolean isTopLevel() {
     return parent == null;
   }
 
-  /**
-   * Declare a variable and add it to the environment.
-   */
-  public void declare(String varname, Location location)
-      throws EvalException {
+  /** Declare a variable and add it to the environment. */
+  void declare(String varname, Location location) throws EvalException {
     checkReadonly(varname, location);
     if (parent == null) {  // top-level values are immutable
       readOnlyVariables.add(varname);
@@ -101,16 +92,14 @@
     }
   }
 
-  /**
-   * Returns true if the symbol exists in the validation environment.
-   */
-  public boolean hasSymbolInEnvironment(String varname) {
+  /** Returns true if the symbol exists in the validation environment. */
+  boolean hasSymbolInEnvironment(String varname) {
     return variables.contains(varname)
         || (parent != null && topLevel().variables.contains(varname));
   }
 
   /** Returns the set of all accessible symbols (both local and global) */
-  public Set<String> getAllSymbols() {
+  Set<String> getAllSymbols() {
     Set<String> all = new HashSet<>();
     all.addAll(variables);
     if (parent != null) {
@@ -128,14 +117,12 @@
    * This is useful to validate control flows like if-else when we know that certain parts of the
    * code cannot both be executed.
    */
-  public void startTemporarilyDisableReadonlyCheckSession() {
+  void startTemporarilyDisableReadonlyCheckSession() {
     futureReadOnlyVariables.add(new HashSet<String>());
   }
 
-  /**
-   * Finishes the session with temporarily disabled readonly checking.
-   */
-  public void finishTemporarilyDisableReadonlyCheckSession() {
+  /** Finishes the session with temporarily disabled readonly checking. */
+  void finishTemporarilyDisableReadonlyCheckSession() {
     Set<String> variables = futureReadOnlyVariables.pop();
     readOnlyVariables.addAll(variables);
     if (!futureReadOnlyVariables.isEmpty()) {
@@ -143,15 +130,13 @@
     }
   }
 
-  /**
-   * Finishes a branch of temporarily disabled readonly checking.
-   */
-  public void finishTemporarilyDisableReadonlyCheckBranch() {
+  /** Finishes a branch of temporarily disabled readonly checking. */
+  void finishTemporarilyDisableReadonlyCheckBranch() {
     readOnlyVariables.removeAll(futureReadOnlyVariables.peek());
   }
 
   /** Throws EvalException if a load() appears after another kind of statement. */
-  private void checkLoadAfterStatement(List<Statement> statements) throws EvalException {
+  private static void checkLoadAfterStatement(List<Statement> statements) throws EvalException {
     Location firstStatement = null;
 
     for (Statement statement : statements) {
@@ -181,7 +166,7 @@
   }
 
   /** Throws EvalException if a `if` statement appears at the top level. */
-  private void checkToplevelIfStatement(List<Statement> statements) throws EvalException {
+  private static void checkToplevelIfStatement(List<Statement> statements) throws EvalException {
     for (Statement statement : statements) {
       if (statement instanceof IfStatement) {
         throw new EvalException(
@@ -194,10 +179,8 @@
     }
   }
 
-  /**
-   * Validates the AST and runs static checks.
-   */
-  public void validateAst(List<Statement> statements) throws EvalException {
+  /** Validates the AST and runs static checks. */
+  void validateAst(List<Statement> statements) throws EvalException {
     // Check that load() statements are on top.
     if (semantics.incompatibleBzlDisallowLoadAfterStatement) {
       checkLoadAfterStatement(statements);
@@ -223,9 +206,14 @@
     }
   }
 
-  public boolean validateAst(List<Statement> statements, EventHandler eventHandler) {
+  public static void validateAst(Environment env, List<Statement> statements) throws EvalException {
+    new ValidationEnvironment(env).validateAst(statements);
+  }
+
+  public static boolean validateAst(
+      Environment env, List<Statement> statements, EventHandler eventHandler) {
     try {
-      validateAst(statements);
+      validateAst(env, statements);
       return true;
     } catch (EvalException e) {
       if (!e.isDueToIncompleteAST()) {