Fix location for Break and Continue AST nodes.

--
MOS_MIGRATED_REVID=106291132
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
index afdcdd7..29a62bb 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
@@ -17,11 +17,18 @@
  * A class for flow statements (e.g. break and continue)
  */
 public final class FlowStatement extends Statement {
+  public enum Kind {
+    BREAK("break"),
+    CONTINUE("continue");
 
-  public static final FlowStatement BREAK = new FlowStatement("break", true);
-  public static final FlowStatement CONTINUE = new FlowStatement("continue", false);
+    private String name;
 
-  private final String name;
+    private Kind(String name) {
+      this.name = name;
+    }
+  };
+
+  private final Kind kind;
   private final FlowException ex;
 
   /**
@@ -30,9 +37,13 @@
    * @param terminateLoop Determines whether the enclosing loop should be terminated completely
    *        (break)
    */
-  protected FlowStatement(String name, boolean terminateLoop) {
-    this.name = name;
-    this.ex = new FlowException(terminateLoop);
+  public FlowStatement(Kind kind) {
+    this.kind = kind;
+    this.ex = new FlowException(kind);
+  }
+
+  Kind getKind() {
+    return kind;
   }
 
   @Override
@@ -43,13 +54,13 @@
   @Override
   void validate(ValidationEnvironment env) throws EvalException {
     if (!env.isInsideLoop()) {
-      throw new EvalException(getLocation(), name + " statement must be inside a for loop");
+      throw new EvalException(getLocation(), kind.name + " statement must be inside a for loop");
     }
   }
 
   @Override
   public String toString() {
-    return name;
+    return kind.name;
   }
 
   @Override
@@ -61,17 +72,16 @@
    * An exception that signals changes in the control flow (e.g. break or continue)
    */
   class FlowException extends EvalException {
-    private final boolean terminateLoop;
+    private final Kind kind;
 
     /**
      *
      * @param terminateLoop Determines whether the enclosing loop should be terminated completely
      *        (break)
      */
-    public FlowException(boolean terminateLoop) {
-      super(FlowStatement.this.getLocation(), "FlowException with terminateLoop = "
-          + terminateLoop);
-      this.terminateLoop = terminateLoop;
+    public FlowException(Kind kind) {
+      super(FlowStatement.this.getLocation(), "FlowException with kind = " + kind.name);
+      this.kind = kind;
     }
 
     /**
@@ -80,7 +90,7 @@
      * @return {@code True} for 'break', {@code false} for 'continue'
      */
     public boolean mustTerminateLoop() {
-      return terminateLoop;
+      return kind == Kind.BREAK;
     }
 
     @Override
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 36c6b95..802157d 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
@@ -1418,10 +1418,9 @@
   private FlowStatement parseFlowStatement(TokenKind kind) {
     int start = token.left;
     expect(kind);
-    return setLocation(
-        kind == TokenKind.BREAK ? FlowStatement.BREAK : FlowStatement.CONTINUE,
-        start,
-        token.right);
+    FlowStatement.Kind flowKind =
+        kind == TokenKind.BREAK ? FlowStatement.Kind.BREAK : FlowStatement.Kind.CONTINUE;
+    return setLocation(new FlowStatement(flowKind), start, token.right);
   }
 
   // return_stmt ::= RETURN [expr]