aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-08-10 12:01:34 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2015-08-11 07:50:40 +0000
commitcc0d9954c86a0ba07d4de2bde939d2debf7fea38 (patch)
treee864c8ae87479c7e7dc88307afcf17de59ca667a /src/main/java/com/google
parentbac37ad709f99c1963a805f767dadea08878d43b (diff)
Allow return without expression, AST-equivalent to return None.
-- MOS_MIGRATED_REVID=100268427
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java15
1 files changed, 12 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 21eb2a5a80..8f590472dc 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
@@ -84,7 +84,7 @@ class Parser {
}
private static final EnumSet<TokenKind> STATEMENT_TERMINATOR_SET =
- EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE);
+ EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE, TokenKind.SEMI);
private static final EnumSet<TokenKind> LIST_TERMINATOR_SET =
EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI);
@@ -1483,11 +1483,20 @@ class Parser {
token.right);
}
- // return_stmt ::= RETURN expr
+ // return_stmt ::= RETURN [expr]
private ReturnStatement parseReturnStatement() {
int start = token.left;
+ int end = token.right;
expect(TokenKind.RETURN);
- Expression expression = parseExpression();
+
+ Expression expression;
+ if (STATEMENT_TERMINATOR_SET.contains(token.kind)) {
+ // this None makes the AST not correspond to the source exactly anymore
+ expression = new Identifier("None");
+ setLocation(expression, start, end);
+ } else {
+ expression = parseExpression();
+ }
return setLocation(new ReturnStatement(expression), start, expression);
}