Index: pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
index 73cd841f17493a8d41bf5c8e4b788e7bf1e461e7..5e8711a31123b8d5edbd77d0f8edb89f5f9bb513 100644 |
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
@@ -431,7 +431,7 @@ class AstBuilder extends ScopeListener { |
push(ast.symbolLiteral(toAnalyzerToken(hashToken), components)); |
} |
- void endType(Token beginToken, Token endToken) { |
+ void handleType(Token beginToken, Token endToken) { |
debugEvent("Type"); |
TypeArgumentList arguments = pop(); |
Identifier name = pop(); |
@@ -1062,28 +1062,52 @@ class AstBuilder extends ScopeListener { |
// keyword up to an element? |
handleIdentifier(token, IdentifierContext.typeReference); |
handleNoTypeArguments(token); |
- endType(token, token); |
+ handleType(token, token); |
} |
@override |
- void endFunctionTypeAlias(Token typedefKeyword, Token endToken) { |
+ void endFunctionTypeAlias( |
+ Token typedefKeyword, Token equals, Token endToken) { |
debugEvent("FunctionTypeAlias"); |
- FormalParameterList parameters = pop(); |
- TypeParameterList typeParameters = pop(); |
- SimpleIdentifier name = pop(); |
- TypeAnnotation returnType = pop(); |
- List<Annotation> metadata = pop(); |
- // TODO(paulberry): capture doc comments. See dartbug.com/28851. |
- Comment comment = null; |
- push(ast.functionTypeAlias( |
- comment, |
- metadata, |
- toAnalyzerToken(typedefKeyword), |
- returnType, |
- name, |
- typeParameters, |
- parameters, |
- toAnalyzerToken(endToken))); |
+ if (equals == null) { |
+ FormalParameterList parameters = pop(); |
+ TypeParameterList typeParameters = pop(); |
+ SimpleIdentifier name = pop(); |
+ TypeAnnotation returnType = pop(); |
+ List<Annotation> metadata = pop(); |
+ // TODO(paulberry): capture doc comments. See dartbug.com/28851. |
+ Comment comment = null; |
+ push(ast.functionTypeAlias( |
+ comment, |
+ metadata, |
+ toAnalyzerToken(typedefKeyword), |
+ returnType, |
+ name, |
+ typeParameters, |
+ parameters, |
+ toAnalyzerToken(endToken))); |
+ } else { |
+ TypeAnnotation type = pop(); |
+ TypeParameterList templateParameters = pop(); |
+ SimpleIdentifier name = pop(); |
+ List<Annotation> metadata = pop(); |
+ // TODO(paulberry): capture doc comments. See dartbug.com/28851. |
+ Comment comment = null; |
+ if (type is! GenericFunctionType) { |
+ // TODO(paulberry) Generate an error and recover (better than |
+ // this). |
+ type = null; |
+ } |
+ push(ast.genericTypeAlias( |
+ comment, |
+ metadata, |
+ toAnalyzerToken(typedefKeyword), |
+ name, |
+ templateParameters, |
+ toAnalyzerToken(equals), |
+ type, |
+ toAnalyzerToken(endToken))); |
+ } |
} |
@override |