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

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

Issue 10872087: Syntactic support for redirecting factory constructors (issue 3968) (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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: compiler/java/com/google/dart/compiler/parser/DartParser.java
===================================================================
--- compiler/java/com/google/dart/compiler/parser/DartParser.java (revision 11396)
+++ compiler/java/com/google/dart/compiler/parser/DartParser.java (working copy)
@@ -1457,6 +1457,25 @@
}
done(name);
List<DartParameter> formals = parseFormalParameterList();
+
+ // Parse redirecting factory
+ if (match(Token.ASSIGN)) {
+ next();
+ if (!modifiers.isFactory()) {
+ reportError(position(), ParserErrorCode.ONLY_FACTORIES_CAN_REDIRECT);
+ }
+ modifiers = modifiers.makeRedirectedConstructor();
+ DartTypeNode redirectedTypeName = parseTypeAnnotation();
+ DartIdentifier redirectedConstructorName = null;
+ if (optional(Token.PERIOD)) {
+ redirectedConstructorName = parseIdentifier();
+ }
+ expect(Token.SEMICOLON);
+ DartFunction function = doneWithoutConsuming(new DartFunction(formals, null, null));
+ return DartMethodDefinition.create(name, function, modifiers, redirectedTypeName,
+ redirectedConstructorName);
+ }
+
DartFunction function;
if (peekPseudoKeyword(0, NATIVE_KEYWORD)) {
modifiers = modifiers.makeNative();
@@ -1621,6 +1640,25 @@
}
}
+ // Parse redirecting factory
+ DartTypeNode redirectedTypeName = null;
+ DartIdentifier redirectedConstructorName = null;
+ if (match(Token.ASSIGN)) {
+ next();
+ if (!modifiers.isFactory()) {
+ reportError(position(), ParserErrorCode.ONLY_FACTORIES_CAN_REDIRECT);
+ }
+ modifiers = modifiers.makeRedirectedConstructor();
+ redirectedTypeName = parseTypeAnnotation();
+ if (optional(Token.PERIOD)) {
+ redirectedConstructorName = parseIdentifier();
+ }
+ expect(Token.SEMICOLON);
+ DartFunction function = doneWithoutConsuming(new DartFunction(parameters, null, returnType));
+ return DartMethodDefinition.create(name, function, modifiers, redirectedTypeName,
+ redirectedConstructorName);
+ }
+
// Parse initializer expressions for constructors.
List<DartInitializer> initializers = new ArrayList<DartInitializer>();
if (match(Token.COLON) && !(isParsingInterface || modifiers.isFactory())) {

Powered by Google App Engine
This is Rietveld 408576698