diff options
Diffstat (limited to 'src')
5 files changed, 44 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java index b49fb1ec52..7531b84ae3 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java @@ -456,6 +456,7 @@ public final class Lexer { keywordMap.put("in", TokenKind.IN); keywordMap.put("not", TokenKind.NOT); keywordMap.put("or", TokenKind.OR); + keywordMap.put("pass", TokenKind.PASS); keywordMap.put("return", TokenKind.RETURN); keywordMap.put("try", TokenKind.TRY); } 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 6a856f65e8..9805e45a9f 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 @@ -1016,16 +1016,27 @@ class Parser { parseStatement(list, true); } + // small_stmt | 'pass' + private void parseSmallStatementOrPass(List<Statement> list) { + if (token.kind == TokenKind.PASS) { + // Skip the token, don't add it to the list. + // It has no existence in the AST. + expect(TokenKind.PASS); + } else { + list.add(parseSmallStatement()); + } + } + // simple_stmt ::= small_stmt (';' small_stmt)* ';'? NEWLINE private void parseSimpleStatement(List<Statement> list) { - list.add(parseSmallStatement()); + parseSmallStatementOrPass(list); while (token.kind == TokenKind.SEMI) { nextToken(); if (token.kind == TokenKind.NEWLINE) { break; } - list.add(parseSmallStatement()); + parseSmallStatementOrPass(list); } expect(TokenKind.NEWLINE); // This is a safe place to recover: There is a new line at top-level diff --git a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java index 889fa6690f..e7e92b4260 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java @@ -56,6 +56,7 @@ public enum TokenKind { NOT_EQUALS("!="), OR("or"), OUTDENT("outdent"), + PASS("pass"), PERCENT("%"), PLUS("+"), PLUS_EQUALS("+="), 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 b6741c4c78..f97282e5e1 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 @@ -778,6 +778,23 @@ public class ParserTest extends AbstractParserTestCase { } @Test + public void testPass() throws Exception { + List<Statement> statements = parseFileForSkylark("pass\n"); + assertThat(statements).isEmpty(); + } + + @Test + public void testForPass() throws Exception { + List<Statement> statements = parseFileForSkylark( + "def foo():\n" + + " pass\n"); + + assertThat(statements).hasSize(1); + FunctionDefStatement stmt = (FunctionDefStatement) statements.get(0); + assertThat(stmt.getStatements()).isEmpty(); + } + + @Test public void testSkipIfBlockFail() throws Exception { // Do not parse 'if' blocks, when parsePython is not set syntaxEvents.setFailFast(false); diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java index 65996d878b..0b48c68713 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java @@ -174,6 +174,18 @@ public class SkylarkEvaluationTest extends EvaluationTest { } @Test + public void testIfPass() throws Exception { + exec(parseFileForSkylark( + "def foo():\n" + + " a = 1\n" + + " x = True\n" + + " if x: pass\n" + + " return a\n" + + "a = foo()"), env); + assertEquals(1, env.lookup("a")); + } + + @Test public void testNestedIf() throws Exception { executeNestedIf(0, 0, env); assertEquals(0, env.lookup("x")); |