aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-03-17 19:29:13 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-03-18 13:45:21 +0000
commit5f6744550a98506ed680b389cfdc872fe07daed5 (patch)
tree4310f649a03a24da973e1f0090b7cf392589d731
parent6683d645ff3a1f3aedc4b7d559b9fbe4d7bcafc4 (diff)
Parser: allow multiple statements on the same line as the colon
e.g. def foo(x, y): print(x); print(y) Bug found when adding the pass statement. -- MOS_MIGRATED_REVID=88852710
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java8
2 files changed, 10 insertions, 3 deletions
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 56a32e937d..6a856f65e8 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
@@ -1210,6 +1210,7 @@ class Parser {
return ImmutableList.copyOf(arguments);
}
+ // suite is typically what follows a colon (e.g. after def or for).
// suite ::= simple_stmt
// | NEWLINE INDENT stmt+ OUTDENT
private List<Statement> parseSuite() {
@@ -1227,9 +1228,7 @@ class Parser {
}
expect(TokenKind.OUTDENT);
} else {
- Statement stmt = parseSmallStatement();
- list.add(stmt);
- expect(TokenKind.NEWLINE);
+ parseSimpleStatement(list);
}
return list;
}
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 51da72ce45..b6741c4c78 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
@@ -756,6 +756,14 @@ public class ParserTest extends AbstractParserTestCase {
}
@Test
+ public void testDefSingleLine() throws Exception {
+ List<Statement> statements = parseFileForSkylark(
+ "def foo(): x = 1; y = 2\n");
+ FunctionDefStatement stmt = (FunctionDefStatement) statements.get(0);
+ assertThat(stmt.getStatements()).hasSize(2);
+ }
+
+ @Test
public void testSkipIfBlock() throws Exception {
// Skip over 'if' blocks, when parsePython is set
List<Statement> stmts = parseFile(