Fix bug in the parser when a block was silently skipped.
Some cosmetic changes with EnumSets.
--
MOS_MIGRATED_REVID=102742596
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 1075e15..9efd28e 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
@@ -91,26 +91,41 @@
EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE, TokenKind.SEMI);
private static final EnumSet<TokenKind> LIST_TERMINATOR_SET =
- EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI);
+ EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI);
private static final EnumSet<TokenKind> DICT_TERMINATOR_SET =
- EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.SEMI);
+ EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.SEMI);
private static final EnumSet<TokenKind> EXPR_LIST_TERMINATOR_SET =
- EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.RBRACKET,
- TokenKind.RPAREN, TokenKind.NEWLINE, TokenKind.SEMI);
+ EnumSet.of(
+ TokenKind.EOF,
+ TokenKind.NEWLINE,
+ TokenKind.RBRACE,
+ TokenKind.RBRACKET,
+ TokenKind.RPAREN,
+ TokenKind.SEMI);
- private static final EnumSet<TokenKind> EXPR_TERMINATOR_SET = EnumSet.of(
- TokenKind.EOF,
- TokenKind.COMMA,
- TokenKind.COLON,
- TokenKind.FOR,
- TokenKind.PLUS,
- TokenKind.MINUS,
- TokenKind.PERCENT,
- TokenKind.SLASH,
- TokenKind.RPAREN,
- TokenKind.RBRACKET);
+ private static final EnumSet<TokenKind> BLOCK_STARTING_SET =
+ EnumSet.of(
+ TokenKind.CLASS,
+ TokenKind.DEF,
+ TokenKind.ELSE,
+ TokenKind.FOR,
+ TokenKind.IF,
+ TokenKind.TRY);
+
+ private static final EnumSet<TokenKind> EXPR_TERMINATOR_SET =
+ EnumSet.of(
+ TokenKind.COLON,
+ TokenKind.COMMA,
+ TokenKind.EOF,
+ TokenKind.FOR,
+ TokenKind.MINUS,
+ TokenKind.PERCENT,
+ TokenKind.PLUS,
+ TokenKind.RBRACKET,
+ TokenKind.RPAREN,
+ TokenKind.SLASH);
private Token token; // current lookahead token
private Token pushedToken = null; // used to implement LL(2)
@@ -1476,12 +1491,7 @@
"for loops are not allowed on top-level. Put it into a function");
}
parseForStatement(list);
- } else if (token.kind == TokenKind.IF
- || token.kind == TokenKind.ELSE
- || token.kind == TokenKind.FOR
- || token.kind == TokenKind.CLASS
- || token.kind == TokenKind.DEF
- || token.kind == TokenKind.TRY) {
+ } else if (BLOCK_STARTING_SET.contains(token.kind)) {
skipBlock();
} else {
parseSimpleStatement(list);
@@ -1520,7 +1530,7 @@
int start = token.left;
Token blockToken = token;
syncTo(EnumSet.of(TokenKind.COLON, TokenKind.EOF)); // skip over expression or name
- if (parsingMode == BUILD) {
+ if (parsingMode != PYTHON) {
reportError(
lexer.createLocation(start, token.right),
"syntax error at '"