Fix NullPointerException in parser. Location was not set. -- MOS_MIGRATED_REVID=96096088
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 393f540..08dccd9 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
@@ -1416,10 +1416,14 @@ // flow_stmt ::= break_stmt | continue_stmt private FlowStatement parseFlowStatement(TokenKind kind) { + int start = token.left; expect(kind); - return (kind == TokenKind.BREAK) ? FlowStatement.BREAK : FlowStatement.CONTINUE; + return setLocation( + kind == TokenKind.BREAK ? FlowStatement.BREAK : FlowStatement.CONTINUE, + start, + token.right); } - + // return_stmt ::= RETURN expr private ReturnStatement parseReturnStatement() { int start = token.left;
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 fd8478d..3658679 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
@@ -453,6 +453,27 @@ } @Test + public void testForBreakContinue() throws Exception { + List<Statement> file = parseFileForSkylark( + "def foo():", + " for i in [1, 2]:", + " break", + " continue"); + assertThat(file).hasSize(1); + List<Statement> body = ((FunctionDefStatement) file.get(0)).getStatements(); + assertThat(body).hasSize(1); + + List<Statement> loop = ((ForStatement) body.get(0)).block(); + assertThat(loop).hasSize(2); + + assertThat(loop.get(0)).isEqualTo(FlowStatement.BREAK); + assertLocation(34, 40, loop.get(0).getLocation()); + + assertThat(loop.get(1)).isEqualTo(FlowStatement.CONTINUE); + assertLocation(44, 52, loop.get(1).getLocation()); + } + + @Test public void testListLiterals1() throws Exception { ListLiteral list = (ListLiteral) parseExpression("[0,1,2]"); assertFalse(list.isTuple());