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]