aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Lexer.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java1
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java12
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"));