Chromium Code Reviews

Unified Diff: pkg/compiler/lib/src/parser/element_listener.dart

Issue 2567133002: Add support for the new function-type syntax. (Closed)
Patch Set: Adjust fasta-analyzer. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: pkg/compiler/lib/src/parser/element_listener.dart
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index fba08ae848334263451c1c95191b7e5109e108d8..48f3b8a17a9a98465b66a82831df3e81721f2b39 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -287,10 +287,18 @@ class ElementListener extends Listener {
}
@override
- void endFunctionTypeAlias(Token typedefKeyword, Token endToken) {
- popNode(); // TODO(karlklose): do not throw away typeVariables.
- Identifier name = popNode();
- popNode(); // returnType
+ void endFunctionTypeAlias(
+ Token typedefKeyword, Token equals, Token endToken) {
+ Identifier name;
+ if (equals == null) {
+ popNode(); // TODO(karlklose): do not throw away typeVariables.
+ name = popNode();
+ popNode(); // returnType
+ } else {
+ popNode(); // Function type.
+ popNode(); // TODO(karlklose): do not throw away typeVariables.
+ name = popNode();
+ }
pushElement(new PartialTypedefElement(
name.source, compilationUnitElement, typedefKeyword, endToken));
rejectBuiltInIdentifier(name);
@@ -324,13 +332,13 @@ class ElementListener extends Listener {
@override
void endMixinApplication() {
NodeList mixins = popNode();
- TypeAnnotation superclass = popNode();
+ NominalTypeAnnotation superclass = popNode();
pushNode(new MixinApplication(superclass, mixins));
}
@override
void handleVoidKeyword(Token token) {
- pushNode(new TypeAnnotation(new Identifier(token), null));
+ pushNode(new NominalTypeAnnotation(new Identifier(token), null));
}
@override
@@ -403,7 +411,7 @@ class ElementListener extends Listener {
@override
void endTypeVariable(Token token, Token extendsOrSuper) {
- TypeAnnotation bound = popNode();
+ NominalTypeAnnotation bound = popNode();
Identifier name = popNode();
pushNode(new TypeVariable(name, extendsOrSuper, bound));
rejectBuiltInIdentifier(name);
@@ -430,10 +438,21 @@ class ElementListener extends Listener {
}
@override
- void endType(Token beginToken, Token endToken) {
+ void handleType(Token beginToken, Token endToken) {
NodeList typeArguments = popNode();
Expression typeName = popNode();
- pushNode(new TypeAnnotation(typeName, typeArguments));
+ pushNode(new NominalTypeAnnotation(typeName, typeArguments));
+ }
+
+ void handleNoName(Token token) {
+ pushNode(null);
+ }
+
+ @override
+ void handleFunctionType(Token functionToken, Token endToken) {
+ popNode(); // Type parameters.
+ popNode(); // Return type.
+ pushNode(null);
}
@override
@@ -632,6 +651,10 @@ class ElementListener extends Listener {
errorCode = MessageKind.BAD_INPUT_CHARACTER;
break;
+ case ErrorKind.InvalidInlineFunctionType:
+ errorCode = MessageKind.INVALID_INLINE_FUNCTION_TYPE;
+ break;
+
case ErrorKind.InvalidSyncModifier:
errorCode = MessageKind.INVALID_SYNC_MODIFIER;
break;

Powered by Google App Engine