| 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..fc740d63b88ae41d6628033c40f44dccb560728a 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);
|
| } else if (identical(value, 'void')) {
|
| return parseExpressionStatementOrDeclaration(token);
|
| } else if (identical(value, 'while')) {
|
| @@ -1351,11 +1354,15 @@ class Parser {
|
| }
|
|
|
| Token parseExpression(Token token) {
|
| - return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true);
|
| + return optional('throw', token)
|
| + ? parseThrowExpression(token, true)
|
| + : parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true);
|
| }
|
|
|
| Token parseExpressionWithoutCascade(Token token) {
|
| - return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false);
|
| + return optional('throw', token)
|
| + ? parseThrowExpression(token, false)
|
| + : parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false);
|
| }
|
|
|
| Token parseConditionalExpressionRest(Token token) {
|
| @@ -2035,18 +2042,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) {
|
|
|