Renamed Ident to Identifier, added some helper methods and refactored two methods.

--
MOS_MIGRATED_REVID=98922811
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 210c68b..76f0bc0 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
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.FunctionSignature;
 import com.google.devtools.build.lib.syntax.GlobList;
-import com.google.devtools.build.lib.syntax.Ident;
+import com.google.devtools.build.lib.syntax.Identifier;
 import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
 import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
@@ -1340,10 +1340,10 @@
     for (Statement stmt : ast.getStatements()) {
       if (stmt instanceof AssignmentStatement) {
         Expression lvalue = ((AssignmentStatement) stmt).getLValue().getExpression();
-        if (!(lvalue instanceof Ident)) {
+        if (!(lvalue instanceof Identifier)) {
           continue;
         }
-        String target = ((Ident) lvalue).getName();
+        String target = ((Identifier) lvalue).getName();
         if (pkgEnv.lookup(target, null) != null) {
           eventHandler.handle(Event.error(stmt.getLocation(), "Reassignment of builtin build "
               + "function '" + target + "' not permitted"));
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
index e5b06a9..bb0e8ed 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -27,9 +27,9 @@
 
   private final Expression obj;
 
-  private final Ident field;
+  private final Identifier field;
 
-  public DotExpression(Expression obj, Ident field) {
+  public DotExpression(Expression obj, Identifier field) {
     this.obj = obj;
     this.field = field;
   }
@@ -38,7 +38,7 @@
     return obj;
   }
 
-  public Ident getField() {
+  public Identifier getField() {
     return field;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 21df356..a448325 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -169,7 +169,7 @@
 
   private final Expression obj;
 
-  private final Ident func;
+  private final Identifier func;
 
   private final List<Argument.Passed> args;
 
@@ -182,7 +182,7 @@
    * arbitrary expressions. In any case, the "func" expression is always
    * evaluated, so functions and variables share a common namespace.
    */
-  public FuncallExpression(Expression obj, Ident func,
+  public FuncallExpression(Expression obj, Identifier func,
                            List<Argument.Passed> args) {
     this.obj = obj;
     this.func = func;
@@ -197,7 +197,7 @@
    * arbitrary expressions. In any case, the "func" expression is always
    * evaluated, so functions and variables share a common namespace.
    */
-  public FuncallExpression(Ident func, List<Argument.Passed> args) {
+  public FuncallExpression(Identifier func, List<Argument.Passed> args) {
     this(null, func, args);
   }
 
@@ -217,7 +217,7 @@
   /**
    * Returns the function expression.
    */
-  public Ident getFunction() {
+  public Identifier getFunction() {
     return func;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index dce9e9c..f9e26ed 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -24,11 +24,11 @@
  */
 public class FunctionDefStatement extends Statement {
 
-  private final Ident ident;
+  private final Identifier ident;
   private final FunctionSignature.WithValues<Expression, Expression> args;
   private final ImmutableList<Statement> statements;
 
-  public FunctionDefStatement(Ident ident,
+  public FunctionDefStatement(Identifier ident,
       FunctionSignature.WithValues<Expression, Expression> args,
       Collection<Statement> statements) {
     this.ident = ident;
@@ -59,7 +59,7 @@
     return "def " + ident + "(" + args + "):\n";
   }
 
-  public Ident getIdent() {
+  public Identifier getIdent() {
     return ident;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
similarity index 61%
rename from src/main/java/com/google/devtools/build/lib/syntax/Ident.java
rename to src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
index 9bc58b1..26c5f15 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
@@ -14,30 +14,36 @@
 
 package com.google.devtools.build.lib.syntax;
 
+import javax.annotation.Nullable;
+
 // TODO(bazel-team): for extra performance:
 // (1) intern the strings, so we can use == to compare, and have .equals use the assumption.
-// Then have Argument and Parameter use Ident again instead of String as keys.
-// (2) Use Ident, not String, as keys in the Environment, which will be cleaner.
+// Then have Argument and Parameter use Identifier again instead of String as keys.
+// (2) Use Identifier, not String, as keys in the Environment, which will be cleaner.
 // (3) For performance, avoid doing HashMap lookups at runtime, and compile local variable access
 // into array reference with a constant index. Variable lookups are currently a speed bottleneck,
 // as previously measured in an experiment.
 /**
  *  Syntax node for an identifier.
  */
-public final class Ident extends Expression {
+public final class Identifier extends Expression {
 
   private final String name;
 
-  public Ident(String name) {
+  public Identifier(String name) {
     this.name = name;
   }
 
   /**
-   *  Returns the name of the Ident.
+   *  Returns the name of the Identifier.
    */
   public String getName() {
     return name;
   }
+  
+  public boolean isPrivate() {
+    return name.startsWith("_");
+  }
 
   @Override
   public String toString() {
@@ -49,15 +55,25 @@
     try {
       return env.lookup(name);
     } catch (Environment.NoSuchVariableException e) {
-      if (name.equals("$error$")) {
-        throw new EvalException(getLocation(), "contains syntax error(s)", true);
-      } else {
-        throw new EvalException(getLocation(), "name '" + name + "' is not defined");
-      }
+      throw createInvalidIdentifierException();
     }
   }
 
   @Override
+  public boolean equals(@Nullable Object object) {
+    if (object instanceof Identifier) {
+      Identifier that = (Identifier) object;
+      return this.name.equals(that.name);
+    }
+    return false;
+  }
+  
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
   public void accept(SyntaxTreeVisitor visitor) {
     visitor.visit(this);
   }
@@ -65,11 +81,13 @@
   @Override
   void validate(ValidationEnvironment env) throws EvalException {
     if (!env.hasSymbolInEnvironment(name)) {
-      if (name.equals("$error$")) {
-        throw new EvalException(getLocation(), "contains syntax error(s)", true);
-      } else {
-        throw new EvalException(getLocation(), "name '" + name + "' is not defined");
-      }
+      throw createInvalidIdentifierException();
     }
   }
+
+  private EvalException createInvalidIdentifierException() {
+    return name.equals("$error$")
+        ? new EvalException(getLocation(), "contains syntax error(s)", true)
+        : new EvalException(getLocation(), "name '" + name + "' is not defined");
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
index 2e9bf26..095a803 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
@@ -49,8 +49,8 @@
 
   private static void assign(Environment env, Location loc, Expression lvalue, Object result)
       throws EvalException, InterruptedException {
-    if (lvalue instanceof Ident) {
-      assign(env, loc, (Ident) lvalue, result);
+    if (lvalue instanceof Identifier) {
+      assign(env, loc, (Identifier) lvalue, result);
       return;
     }
 
@@ -77,7 +77,7 @@
   /**
    * Assign value to a single variable.
    */
-  private static void assign(Environment env, Location loc, Ident ident, Object result)
+  private static void assign(Environment env, Location loc, Identifier ident, Object result)
       throws EvalException, InterruptedException {
     Preconditions.checkNotNull(result, "trying to assign null to %s", ident);
 
@@ -103,8 +103,8 @@
 
   private static void validate(ValidationEnvironment env, Location loc, Expression expr)
       throws EvalException {
-    if (expr instanceof Ident) {
-      Ident ident = (Ident) expr;
+    if (expr instanceof Identifier) {
+      Identifier ident = (Identifier) expr;
       env.declare(ident.getName(), loc);
       return;
     }
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
index 106b348..0eae19b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
@@ -26,20 +26,20 @@
 
   public static final String PATH_ERROR_MSG = "Path '%s' is not valid. "
       + "It should either start with a slash or refer to a file in the current directory.";
-  private final ImmutableList<Ident> symbols;
+  private final ImmutableList<Identifier> symbols;
   private final PathFragment importPath;
   private final String pathString;
 
   /**
    * Constructs an import statement.
    */
-  LoadStatement(String path, List<Ident> symbols) {
+  LoadStatement(String path, List<Identifier> symbols) {
     this.symbols = ImmutableList.copyOf(symbols);
     this.importPath = new PathFragment(path + ".bzl");
     this.pathString = path;
   }
 
-  public ImmutableList<Ident> getSymbols() {
+  public ImmutableList<Identifier> getSymbols() {
     return symbols;
   }
 
@@ -54,9 +54,9 @@
 
   @Override
   void exec(Environment env) throws EvalException, InterruptedException {
-    for (Ident i : symbols) {
+    for (Identifier i : symbols) {
       try {
-        if (i.getName().startsWith("_")) {
+        if (i.isPrivate()) {
           throw new EvalException(getLocation(), "symbol '" + i + "' is private and cannot "
               + "be imported");
         }
@@ -79,7 +79,7 @@
     if (!importPath.isAbsolute() && importPath.segmentCount() > 1) {
       throw new EvalException(getLocation(), String.format(PATH_ERROR_MSG, importPath));
     }
-    for (Ident symbol : symbols) {
+    for (Identifier symbol : symbols) {
       env.declare(symbol.getName(), getLocation());
     }
   }
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 efd40b4..46e7ca7 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
@@ -388,8 +388,8 @@
   }
 
   // create an error expression
-  private Ident makeErrorExpression(int start, int end) {
-    return setLocation(new Ident("$error$"), start, end);
+  private Identifier makeErrorExpression(int start, int end) {
+    return setLocation(new Identifier("$error$"), start, end);
   }
 
   // Convenience wrapper around ASTNode.setLocation that returns the node.
@@ -410,7 +410,7 @@
   }
 
   // create a funcall expression
-  private Expression makeFuncallExpression(Expression receiver, Ident function,
+  private Expression makeFuncallExpression(Expression receiver, Identifier function,
                                            List<Argument.Passed> args,
                                            int start, int end) {
     if (function.getLocation() == null) {
@@ -474,21 +474,21 @@
     int start = token.left;
     if (token.kind == TokenKind.STAR_STAR) { // kwarg
       nextToken();
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       return setLocation(new Parameter.StarStar<Expression, Expression>(
           ident.getName()), start, ident);
     } else if (token.kind == TokenKind.STAR) { // stararg
       int end = token.right;
       nextToken();
       if (token.kind == TokenKind.IDENTIFIER) {
-        Ident ident = parseIdent();
+        Identifier ident = parseIdent();
         return setLocation(new Parameter.Star<Expression, Expression>(ident.getName()),
             start, ident);
       } else {
         return setLocation(new Parameter.Star<Expression, Expression>(null), start, end);
       }
     } else {
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       if (token.kind == TokenKind.EQUALS) { // there's a default value
         nextToken();
         Expression expr = parseNonTupleExpression();
@@ -502,7 +502,7 @@
   }
 
   // funcall_suffix ::= '(' arg_list? ')'
-  private Expression parseFuncallSuffix(int start, Expression receiver, Ident function) {
+  private Expression parseFuncallSuffix(int start, Expression receiver, Identifier function) {
     List<Argument.Passed> args = Collections.emptyList();
     expect(TokenKind.LPAREN);
     int end;
@@ -522,7 +522,7 @@
   private Expression parseSelectorSuffix(int start, Expression receiver) {
     expect(TokenKind.DOT);
     if (token.kind == TokenKind.IDENTIFIER) {
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       if (token.kind == TokenKind.LPAREN) {
         return parseFuncallSuffix(start, receiver, ident);
       } else {
@@ -599,7 +599,7 @@
         new StringLiteral(labelName, '"')), location));
     args.add(setLocation(new Argument.Positional(
         new StringLiteral(file, '"')), location));
-    Ident mockIdent = setLocation(new Ident("mocksubinclude"), location);
+    Identifier mockIdent = setLocation(new Identifier("mocksubinclude"), location);
     Expression funCall = new FuncallExpression(null, mockIdent, args);
     return setLocation(new ExpressionStatement(funCall), location);
   }
@@ -680,7 +680,7 @@
         return literal;
       }
       case IDENTIFIER: {
-        Ident ident = parseIdent();
+        Identifier ident = parseIdent();
         if (token.kind == TokenKind.LPAREN) { // it's a function application
           return parseFuncallSuffix(start, null, ident);
         } else {
@@ -720,7 +720,7 @@
         List<Argument.Passed> args = new ArrayList<>();
         Expression expr = parsePrimaryWithSuffix();
         args.add(setLocation(new Argument.Positional(expr), start, expr));
-        return makeFuncallExpression(null, new Ident("-"), args,
+        return makeFuncallExpression(null, new Identifier("-"), args,
                                      start, token.right);
       }
       default: {
@@ -765,7 +765,7 @@
     // This is a dictionary access
     if (token.kind == TokenKind.RBRACKET) {
       expect(TokenKind.RBRACKET);
-      return makeFuncallExpression(receiver, new Ident("$index"), args,
+      return makeFuncallExpression(receiver, new Identifier("$index"), args,
                                    start, token.right);
     }
     // This is a slice (or substring)
@@ -779,7 +779,7 @@
     expect(TokenKind.RBRACKET);
 
     args.add(setLocation(new Argument.Positional(endExpr), loc2, endExpr));
-    return makeFuncallExpression(receiver, new Ident("$slice"), args,
+    return makeFuncallExpression(receiver, new Identifier("$slice"), args,
                                  start, token.right);
   }
 
@@ -933,12 +933,12 @@
     return makeErrorExpression(start, end);
   }
 
-  private Ident parseIdent() {
+  private Identifier parseIdent() {
     if (token.kind != TokenKind.IDENTIFIER) {
       expect(TokenKind.IDENTIFIER);
       return makeErrorExpression(token.left, token.right);
     }
-    Ident ident = new Ident(((String) token.value));
+    Identifier ident = new Identifier(((String) token.value));
     setLocation(ident, token.left, token.right);
     nextToken();
     return ident;
@@ -1083,9 +1083,9 @@
     nextToken();
     expect(TokenKind.COMMA);
 
-    List<Ident> symbols = new ArrayList<>();
+    List<Identifier> symbols = new ArrayList<>();
     if (token.kind == TokenKind.STRING) {
-      symbols.add(new Ident((String) token.value));
+      symbols.add(new Identifier((String) token.value));
     }
     expect(TokenKind.STRING);
     while (token.kind != TokenKind.RPAREN && token.kind != TokenKind.EOF) {
@@ -1094,7 +1094,7 @@
         break;
       }
       if (token.kind == TokenKind.STRING) {
-        symbols.add(new Ident((String) token.value));
+        symbols.add(new Identifier((String) token.value));
       }
       expect(TokenKind.STRING);
     }
@@ -1122,7 +1122,7 @@
     // Check if there is an include
     if (token.kind == TokenKind.IDENTIFIER) {
       Token identToken = token;
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
 
       if (ident.getName().equals("include")
           && token.kind == TokenKind.LPAREN
@@ -1200,7 +1200,8 @@
       Expression rvalue = parseExpression();
       if (expression instanceof FuncallExpression) {
         FuncallExpression func = (FuncallExpression) expression;
-        if (func.getFunction().getName().equals("$index") && func.getObject() instanceof Ident) {
+        if (func.getFunction().getName().equals("$index")
+            && func.getObject() instanceof Identifier) {
           // Special casing to translate 'ident[key] = value' to 'ident = ident + {key: value}'
           // Note that the locations of these extra expressions are fake.
           Preconditions.checkArgument(func.getArguments().size() == 1);
@@ -1274,7 +1275,7 @@
   private void parseFunctionDefStatement(List<Statement> list) {
     int start = token.left;
     expect(TokenKind.DEF);
-    Ident ident = parseIdent();
+    Identifier ident = parseIdent();
     expect(TokenKind.LPAREN);
     FunctionSignature.WithValues<Expression, Expression> args = parseFunctionSignature();
     expect(TokenKind.RPAREN);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
index 3d699ff..6769061 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
@@ -55,7 +55,7 @@
     visitAll(node.getArguments());
   }
 
-  public void visit(Ident node) {
+  public void visit(Identifier node) {
   }
 
   public void visit(ListComprehension node) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
index 5bb9019..4a5968c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
@@ -25,7 +25,7 @@
   private final ImmutableList<Statement> statements;
   private final SkylarkEnvironment definitionEnv;
 
-  protected UserDefinedFunction(Ident function,
+  protected UserDefinedFunction(Identifier function,
       FunctionSignature.WithValues<Object, SkylarkType> signature,
       ImmutableList<Statement> statements, SkylarkEnvironment definitionEnv) {
     super(function.getName(), signature, function.getLocation());
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 de59d2a..dad2d46 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
@@ -145,7 +145,7 @@
   public void testFuncallExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpression("foo(1, 2, bar=wiz)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -159,7 +159,7 @@
 
     Argument.Passed arg2 = e.getArguments().get(2);
     assertEquals("bar", arg2.getName());
-    Ident arg2val = (Ident) arg2.getValue();
+    Identifier arg2val = (Identifier) arg2.getValue();
     assertEquals("wiz", arg2val.getName());
   }
 
@@ -168,7 +168,7 @@
     FuncallExpression e =
       (FuncallExpression) parseExpression("foo.foo(1, 2, bar=wiz)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -182,7 +182,7 @@
 
     Argument.Passed arg2 = e.getArguments().get(2);
     assertEquals("bar", arg2.getName());
-    Ident arg2val = (Ident) arg2.getValue();
+    Identifier arg2val = (Identifier) arg2.getValue();
     assertEquals("wiz", arg2val.getName());
   }
 
@@ -191,7 +191,7 @@
     FuncallExpression e =
       (FuncallExpression) parseExpression("foo.replace().split(1)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("split", ident.getName());
 
     assertThat(e.getArguments()).hasSize(1);
@@ -205,7 +205,7 @@
   public void testPropRefExpr() throws Exception {
     DotExpression e = (DotExpression) parseExpression("foo.foo");
 
-    Ident ident = e.getField();
+    Identifier ident = e.getField();
     assertEquals("foo", ident.getName());
   }
 
@@ -213,7 +213,7 @@
   public void testStringMethExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpression("'foo'.foo()");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).isEmpty();
@@ -280,7 +280,7 @@
 
     // Test that the actual parameters are: (1, $error$, 3):
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("f", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -290,7 +290,7 @@
     assertEquals(1, (int) arg0.getValue());
 
     Argument.Passed arg1 = e.getArguments().get(1);
-    Ident arg1val = ((Ident) arg1.getValue());
+    Identifier arg1val = ((Identifier) arg1.getValue());
     assertEquals("$error$", arg1val.getName());
 
     assertLocation(5, 29, arg1val.getLocation());
@@ -658,7 +658,7 @@
     assertThat(clauses.get(0).getLValue().getExpression().toString()).isEqualTo("x");
     assertThat(clauses.get(0).getExpression()).isInstanceOf(ListLiteral.class);
     assertThat(clauses.get(1).getLValue().getExpression().toString()).isEqualTo("y");
-    assertThat(clauses.get(1).getExpression()).isInstanceOf(Ident.class);
+    assertThat(clauses.get(1).getExpression()).isInstanceOf(Identifier.class);
   }
 
   @Test