Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
| index c2469c35e487892541b29c5390a7c37da93f9b34..2c6c862dc5ae3c3560c3f5721f4d6af4ec66b241 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart |
| @@ -1197,8 +1197,11 @@ class Parser { |
| return parseIfStatement(token); |
| } else if (identical(value, 'for')) { |
| return parseForStatement(token); |
| - } else if (identical(value, 'throw')) { |
| - return parseThrowStatement(token); |
| + } else if (identical(value, 'rethrow')) { |
| + return parseRethrowStatement(token); |
| + } else if (identical(value, 'throw') && optional(';', token.next)) { |
| + // TODO(kasperl): Stop dealing with throw here. |
| + return parseRethrowStatement(token); |
|
ahe
2013/04/23 09:37:25
I think this should report a deprecated feature. I
kasperl
2013/04/23 11:26:12
Done in the listener.
|
| } else if (identical(value, 'void')) { |
| return parseExpressionStatementOrDeclaration(token); |
| } else if (identical(value, 'while')) { |
| @@ -1351,11 +1354,19 @@ class Parser { |
| } |
| Token parseExpression(Token token) { |
| - return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true); |
| + if (optional('throw', token)) { |
| + return parseThrowExpression(token, true); |
|
ahe
2013/04/23 09:37:25
I don't think this will handle situations like "1
kasperl
2013/04/23 11:26:12
I think that is true, but the grammar in the speci
|
| + } else { |
| + return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true); |
| + } |
| } |
| Token parseExpressionWithoutCascade(Token token) { |
| - return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false); |
| + if (optional('throw', token)) { |
| + return parseThrowExpression(token, false); |
| + } else { |
| + return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false); |
| + } |
| } |
| Token parseConditionalExpressionRest(Token token) { |
| @@ -2035,18 +2046,28 @@ class Parser { |
| return expect('}', token); |
| } |
| - Token parseThrowStatement(Token token) { |
| + Token parseThrowExpression(Token token, bool allowCascades) { |
| Token throwToken = token; |
| - listener.beginThrowStatement(throwToken); |
| + listener.beginThrowExpression(throwToken); |
| token = expect('throw', token); |
| - if (optional(';', token)) { |
| - listener.endRethrowStatement(throwToken, token); |
| - return token.next; |
| + token = allowCascades |
| + ? parseExpression(token) |
| + : parseExpressionWithoutCascade(token); |
| + listener.endThrowExpression(throwToken, token); |
| + return token; |
| + } |
| + |
| + Token parseRethrowStatement(Token token) { |
| + Token throwToken = token; |
| + listener.beginRethrowStatement(throwToken); |
| + // TODO(kasperl): Disallow throw here. |
| + if (identical(throwToken.stringValue, 'throw')) { |
| + token = expect('throw', token); |
| } else { |
| - token = parseExpression(token); |
| - listener.endThrowStatement(throwToken, token); |
| - return expectSemicolon(token); |
| + token = expect('rethrow', token); |
| } |
| + listener.endRethrowStatement(throwToken, token); |
| + return expectSemicolon(token); |
| } |
| Token parseTryStatement(Token token) { |