Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Unified Diff: sdk/lib/_internal/compiler/implementation/scanner/parser.dart

Issue 14211008: Add support for rethrow and start treating throw <expr> as an expression. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Use ?:. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698