Index: pkg/compiler/lib/src/parser/node_listener.dart |
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart |
index f717c7d100e1437c298d6fc449600ea5a52d1d17..1d0fcb0be06aae2c3ff894c81ee307d89e858687 100644 |
--- a/pkg/compiler/lib/src/parser/node_listener.dart |
+++ b/pkg/compiler/lib/src/parser/node_listener.dart |
@@ -125,13 +125,58 @@ class NodeListener extends ElementListener { |
} |
@override |
- void endFunctionTypeAlias(Token typedefKeyword, Token endToken) { |
+ void endTypedef(Token typedefKeyword, Token equals, Token endToken) { |
+ bool isGeneralizedTypeAlias; |
+ NodeList templateParameters; |
+ TypeAnnotation returnType; |
+ Identifier name; |
+ NodeList typeParameters; |
+ NodeList formals; |
+ if (equals == null) { |
+ isGeneralizedTypeAlias = false; |
+ formals = popNode(); |
+ templateParameters = popNode(); |
+ name = popNode(); |
+ returnType = popNode(); |
+ } else { |
+ // TODO(floitsch): keep using the `FunctionTypeAnnotation' node. |
+ isGeneralizedTypeAlias = true; |
+ Node type = popNode(); |
+ if (type.asFunctionTypeAnnotation() == null) { |
+ // TODO(floitsch): The parser should diagnose this problem, not |
+ // this listener. |
+ // However, this problem goes away, when we allow aliases for |
+ // non-function types too. |
+ reportFatalError(type, 'Expected a function type.'); |
+ } |
+ FunctionTypeAnnotation functionType = type; |
+ templateParameters = popNode(); |
+ name = popNode(); |
+ returnType = functionType.returnType; |
+ typeParameters = functionType.typeParameters; |
+ formals = functionType.formals; |
+ } |
+ pushNode(new Typedef( |
+ isGeneralizedTypeAlias, |
+ templateParameters, |
+ returnType, |
+ name, |
+ typeParameters, |
+ formals, |
+ typedefKeyword, |
+ endToken)); |
+ } |
+ |
+ void handleNoName(Token token) { |
+ pushNode(null); |
+ } |
+ |
+ void endFunctionType(Token functionToken, Token endToken) { |
NodeList formals = popNode(); |
NodeList typeParameters = popNode(); |
- Identifier name = popNode(); |
TypeAnnotation returnType = popNode(); |
- pushNode(new Typedef( |
- returnType, name, typeParameters, formals, typedefKeyword, endToken)); |
+ pushNode(new FunctionTypeAnnotation( |
+ returnType, functionToken, typeParameters, formals)); |
} |
@override |
@@ -227,7 +272,7 @@ class NodeListener extends ElementListener { |
NodeList typeArguments = popNode(); |
Node classReference = popNode(); |
if (typeArguments != null) { |
- classReference = new TypeAnnotation(classReference, typeArguments); |
+ classReference = new NominalTypeAnnotation(classReference, typeArguments); |
} else { |
Identifier identifier = classReference.asIdentifier(); |
Send send = classReference.asSend(); |
@@ -865,7 +910,7 @@ class NodeListener extends ElementListener { |
NodeList typeArguments = popNode(); |
Node receiver = popNode(); |
if (typeArguments != null) { |
- receiver = new TypeAnnotation(receiver, typeArguments); |
+ receiver = new NominalTypeAnnotation(receiver, typeArguments); |
recoverableError(typeArguments, 'Type arguments are not allowed here.'); |
} else { |
Identifier identifier = receiver.asIdentifier(); |