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

Unified Diff: frog/parser.dart

Issue 8774039: Fix for Issue 622 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: frogsh Created 9 years 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
« no previous file with comments | « frog/gen.dart ('k') | tests/language/language.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/parser.dart
diff --git a/frog/parser.dart b/frog/parser.dart
index 924118da0c9d65d28192e518f82f93d814998f30..baa5ee7545630f48d708af45626f757f5076e69b 100644
--- a/frog/parser.dart
+++ b/frog/parser.dart
@@ -34,8 +34,11 @@ class Parser {
*/
bool get enableAwait() => experimentalAwaitPhase != null;
- /** To prevent conflicts in initializers */
- bool _inInitializers;
+ /**
+ * To resolve ambiguity in initializers between constructor body and lambda
+ * expression.
+ */
+ bool _inhibitLambda;
Token _previousToken;
Token _peekToken;
@@ -54,7 +57,7 @@ class Parser {
tokenizer = new Tokenizer(source, true, startOffset);
_peekToken = tokenizer.next();
_previousToken = null;
- _inInitializers = false;
+ _inhibitLambda = false;
_afterParens = <Token>[];
}
@@ -284,12 +287,12 @@ class Parser {
}
initializers() {
- _inInitializers = true;
+ _inhibitLambda = true;
var ret = [];
do {
ret.add(expression());
} while (_maybeEat(TokenKind.COMMA));
- _inInitializers = false;
+ _inhibitLambda = false;
return ret;
}
@@ -929,12 +932,15 @@ class Parser {
arguments() {
var args = [];
_eatLeftParen();
+ var saved = _inhibitLambda;
+ _inhibitLambda = false;
if (!_maybeEat(TokenKind.RPAREN)) {
do {
args.add(argument());
} while (_maybeEat(TokenKind.COMMA));
_eat(TokenKind.RPAREN);
}
+ _inhibitLambda = saved;
return args;
}
@@ -1179,21 +1185,18 @@ class Parser {
null, body, _makeSpan(start));
return new LambdaExpression(func, func.span);
} else {
- var saved = _inInitializers;
- _inInitializers = false;
- var args = arguments();
- _inInitializers = saved;
- if (args.length == 1) {
- return new ParenExpression(args[0].value, _makeSpan(start));
- } else {
- _error('unexpected comma expression');
- return args[0].value;
- }
+ _eatLeftParen();
+ var saved = _inhibitLambda;
+ _inhibitLambda = false;
+ var expr = expression();
+ _eat(TokenKind.RPAREN);
+ _inhibitLambda = saved;
+ return new ParenExpression(expr, _makeSpan(start));
}
}
bool _atClosureParameters() {
- if (_inInitializers) return false;
+ if (_inhibitLambda) return false;
Token after = _peekAfterCloseParen();
return after.kind == TokenKind.ARROW || after.kind == TokenKind.LBRACE;
}
« no previous file with comments | « frog/gen.dart ('k') | tests/language/language.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698