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

Unified Diff: compiler/java/com/google/dart/compiler/parser/DartParser.java

Issue 8479041: https://code.google.com/p/dart/issues/detail?id=255 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 1 month 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: compiler/java/com/google/dart/compiler/parser/DartParser.java
===================================================================
--- compiler/java/com/google/dart/compiler/parser/DartParser.java (revision 1268)
+++ compiler/java/com/google/dart/compiler/parser/DartParser.java (working copy)
@@ -1023,44 +1023,70 @@
/**
* <pre>
+ * initializers
+ * : ':' superCallOrFirstFieldInitializer (',' fieldInitializer)*
+ * | THIS ('.' identifier) formalParameterList
+ * ;
+ *
* fieldInitializer
- * : (THIS '.')? identifier '=' conditionalExpression
- * | THIS ('.' identifier)? arguments
- * ;
- * </pre>
+ * : (THIS '.')? identifier '=' conditionalExpression
+ * ;
*
+ * superCallOrFirstFieldInitializer
+ * : SUPER arguments | SUPER '.' identifier arguments
+ * | fieldInitializer
+ * ;
+ *
+ * fieldInitializer
+ * : (THIS '.')? identifier '=' conditionalExpression
+ * | THIS ('.' identifier)? arguments
+ * ;
+ * </pre>
* @return true if initializer is a redirected constructor, false otherwise.
*/
- private boolean parseFieldInitializersOrRedirectedConstructor(List<DartInitializer> inits) {
+ private boolean parseInitializers(List<DartInitializer> initializers) {
+ expect(Token.COLON);
do {
- beginFieldInitializerOrRedirectedConstructor();
- boolean hasThisPrefix = optional(Token.THIS);
- if (hasThisPrefix) {
- if (match(Token.LPAREN)) {
- return parseRedirectedConstructorInvocation(null, inits);
+ beginInitializer();
+ if (match(Token.SUPER)) {
+ beginSuperInitializer();
+ expect(Token.SUPER);
+ DartIdentifier constructor = null;
+ if (optional(Token.PERIOD)) {
+ constructor = parseIdentifier();
}
- expect(Token.PERIOD);
- }
- DartIdentifier name = parseIdentifier();
- if (hasThisPrefix && match(Token.LPAREN)) {
- return parseRedirectedConstructorInvocation(name, inits);
+ DartSuperConstructorInvocation superInvocation =
+ new DartSuperConstructorInvocation(constructor, parseArguments());
+ initializers.add(done(new DartInitializer(null, done(superInvocation))));
} else {
- expect(Token.ASSIGN);
- boolean save = setAllowFunctionExpression(false);
- DartExpression initExpr = parseExpression();
- setAllowFunctionExpression(save);
- inits.add(done(new DartInitializer(name, initExpr)));
+ boolean hasThisPrefix = optional(Token.THIS);
+ if (hasThisPrefix) {
+ if (match(Token.LPAREN)) {
+ return parseRedirectedConstructorInvocation(null, initializers);
mmendez 2011/11/08 15:24:06 Nit: this follows the existing pattern, but it wou
fabiomfv 2011/11/08 15:34:55 +1. we need proper error recovery.
+ }
+ expect(Token.PERIOD);
+ }
+ DartIdentifier name = parseIdentifier();
+ if (hasThisPrefix && match(Token.LPAREN)) {
+ return parseRedirectedConstructorInvocation(name, initializers);
+ } else {
+ expect(Token.ASSIGN);
+ boolean save = setAllowFunctionExpression(false);
+ DartExpression initExpr = parseExpression();
+ setAllowFunctionExpression(save);
+ initializers.add(done(new DartInitializer(name, initExpr)));
+ }
}
} while (optional(Token.COMMA));
return false;
}
private boolean parseRedirectedConstructorInvocation(DartIdentifier name,
- List<DartInitializer> inits) {
- if (inits.isEmpty()) {
- DartInvocation call =
- doneWithoutConsuming(new DartRedirectConstructorInvocation(name, parseArguments()));
- inits.add(done(new DartInitializer(null, call)));
+ List<DartInitializer> initializers) {
+ if (initializers.isEmpty()) {
+ DartRedirectConstructorInvocation redirConstructor =
+ new DartRedirectConstructorInvocation(name, parseArguments());
+ initializers.add(done(new DartInitializer(null, doneWithoutConsuming(redirConstructor))));
return true;
} else {
reportUnexpectedToken(position(), Token.ASSIGN, Token.LPAREN);
@@ -1070,42 +1096,6 @@
/**
* <pre>
- * initializers : ':' superCallOrFirstFieldInitializer (',' fieldInitializer)*
- * | THIS ('.' identifier) formalParameterList ;
- *
- * fieldInitializer : (THIS '.')? identifier '=' conditionalExpression ;
- *
- * superCallOrFirstFieldInitializer : SUPER arguments | SUPER '.' identifier
- * arguments | fieldInitializer ;
- * <pre>
- *
- * @return true if initializer is a redirect constructor, false otherwise.
- */
- private boolean parseInitializers(List<DartInitializer> initializers) {
- expect(Token.COLON);
- boolean callSuper = false;
- if (match(Token.SUPER)) {
- beginInitializer();
- beginSuperInitializer();
- expect(Token.SUPER);
- callSuper = true;
- DartIdentifier constructor = null;
- if (optional(Token.PERIOD)) {
- // Calling a super named constructor.
- constructor = parseIdentifier();
- }
- DartSuperConstructorInvocation call =
- done(new DartSuperConstructorInvocation(constructor, parseArguments()));
- initializers.add(done(new DartInitializer(null, call)));
- }
- if (!callSuper || optional(Token.COMMA)) {
- return parseFieldInitializersOrRedirectedConstructor(initializers);
- }
- return false;
- }
-
- /**
- * <pre>
* variableDeclaration
* : constVarOrType identifierList
* ;

Powered by Google App Engine
This is Rietveld 408576698