| Index: compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| ===================================================================
|
| --- compiler/java/com/google/dart/compiler/parser/DartParser.java (revision 11473)
|
| +++ compiler/java/com/google/dart/compiler/parser/DartParser.java (working copy)
|
| @@ -1465,7 +1465,7 @@
|
| reportError(position(), ParserErrorCode.ONLY_FACTORIES_CAN_REDIRECT);
|
| }
|
| modifiers = modifiers.makeRedirectedConstructor();
|
| - DartTypeNode redirectedTypeName = parseTypeAnnotation();
|
| + DartTypeNode redirectedTypeName = parseTypeAnnotationPossiblyFollowedByName();
|
| DartIdentifier redirectedConstructorName = null;
|
| if (optional(Token.PERIOD)) {
|
| redirectedConstructorName = parseIdentifier();
|
| @@ -1649,7 +1649,7 @@
|
| reportError(position(), ParserErrorCode.ONLY_FACTORIES_CAN_REDIRECT);
|
| }
|
| modifiers = modifiers.makeRedirectedConstructor();
|
| - redirectedTypeName = parseTypeAnnotation();
|
| + redirectedTypeName = parseTypeAnnotationPossiblyFollowedByName();
|
| if (optional(Token.PERIOD)) {
|
| redirectedConstructorName = parseIdentifier();
|
| }
|
| @@ -4911,6 +4911,32 @@
|
|
|
| /**
|
| * <pre>
|
| + * type
|
| + * : qualified typeArguments? ('.' identifier)?
|
| + * ;
|
| + * </pre>
|
| + */
|
| + private DartTypeNode parseTypeAnnotationPossiblyFollowedByName() {
|
| + beginTypeAnnotation();
|
| + boolean canBeFollowedByPeriod = true;
|
| + if (peek(Token.IDENTIFIER, Token.LT) || peek(Token.IDENTIFIER, Token.PERIOD, Token.IDENTIFIER, Token.LT)) {
|
| + canBeFollowedByPeriod = false;
|
| + }
|
| + return done(new DartTypeNode(parseQualified(canBeFollowedByPeriod), parseTypeArgumentsOpt()));
|
| + }
|
| +
|
| + private boolean peek(Token... tokens) {
|
| + int index = 0;
|
| + for (Token token : tokens) {
|
| + if (peek(index++) != token) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * <pre>
|
| * typeArguments
|
| * : '<' typeList '>'
|
| * ;
|
|
|