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

Unified Diff: pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart

Issue 2715203003: Support for function typed formal parameters. (Closed)
Patch Set: Created 3 years, 10 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: 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 bca4373845db2931039337658f115f97763a8619..5bc81a3c02460fde8f3e767654b1760b4cb3d686 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -505,34 +505,42 @@ class AstBuilder extends ScopeListener {
Token covariantKeyword, Token thisKeyword, FormalParameterType kind) {
debugEvent("FormalParameter");
_ParameterDefaultValue defaultValue = pop();
- SimpleIdentifier name = pop();
- TypeName type = pop();
- Token keyword = _popOptionalSingleModifier();
- pop(); // TODO(paulberry): Metadata.
+
+ AstNode nameOrFunctionTypedParameter = pop();
FormalParameter node;
- if (thisKeyword == null) {
- node = ast.simpleFormalParameter2(
- covariantKeyword: toAnalyzerToken(covariantKeyword),
- keyword: toAnalyzerToken(keyword),
- type: type,
- identifier: name);
+ SimpleIdentifier name;
+ if (nameOrFunctionTypedParameter is FunctionTypedFormalParameter) {
+ node = nameOrFunctionTypedParameter;
+ name = nameOrFunctionTypedParameter.identifier;
} else {
- // TODO(scheglov): Ideally the period token should be passed in.
- Token period = identical('.', thisKeyword.next?.stringValue)
- ? thisKeyword.next
- : null;
- TypeParameterList typeParameters; // TODO(scheglov)
- FormalParameterList formalParameters; // TODO(scheglov)
- node = ast.fieldFormalParameter2(
- covariantKeyword: toAnalyzerToken(covariantKeyword),
- keyword: toAnalyzerToken(keyword),
- type: type,
- thisKeyword: toAnalyzerToken(thisKeyword),
- period: toAnalyzerToken(period),
- identifier: name,
- typeParameters: typeParameters,
- parameters: formalParameters);
+ name = nameOrFunctionTypedParameter;
+ TypeName type = pop();
+ Token keyword = _popOptionalSingleModifier();
+ pop(); // TODO(paulberry): Metadata.
+ if (thisKeyword == null) {
+ node = ast.simpleFormalParameter2(
+ covariantKeyword: toAnalyzerToken(covariantKeyword),
+ keyword: toAnalyzerToken(keyword),
+ type: type,
+ identifier: name);
+ } else {
+ // TODO(scheglov): Ideally the period token should be passed in.
+ Token period = identical('.', thisKeyword.next?.stringValue)
+ ? thisKeyword.next
+ : null;
+ TypeParameterList typeParameters; // TODO(scheglov)
+ FormalParameterList formalParameters; // TODO(scheglov)
+ node = ast.fieldFormalParameter2(
+ covariantKeyword: toAnalyzerToken(covariantKeyword),
+ keyword: toAnalyzerToken(keyword),
+ type: type,
+ thisKeyword: toAnalyzerToken(thisKeyword),
+ period: toAnalyzerToken(period),
+ identifier: name,
+ typeParameters: typeParameters,
+ parameters: formalParameters);
+ }
}
if (defaultValue != null) {
@@ -544,6 +552,36 @@ class AstBuilder extends ScopeListener {
push(node);
}
+ @override
+ void endFunctionTypedFormalParameter(Token token) {
+ debugEvent("FunctionTypedFormalParameter");
+
+ FormalParameterList formalParameters = pop();
+ TypeParameterList typeParameters = pop();
+ SimpleIdentifier name = pop();
+ TypeName returnType = pop();
+
+ {
+ List<Token> modifiers = pop();
+ if (modifiers.isNotEmpty) {
+ // TODO(scheglov): Report error.
+ internalError('Unexpected modifier. Report an error.');
+ }
+ }
+
+ pop(); // TODO(paulberry): Metadata.
+
+ FormalParameter node;
+ node = ast.functionTypedFormalParameter2(
+ returnType: returnType,
+ identifier: name,
+ typeParameters: typeParameters,
+ parameters: formalParameters);
+
+ scope[name.name] = name.staticElement = new AnalyzerParameterElement(node);
+ push(node);
+ }
+
void endFormalParameters(int count, Token beginToken, Token endToken) {
debugEvent("FormalParameters");
List rawParameters = popList(count) ?? const <Object>[];
« no previous file with comments | « pkg/analyzer/test/generated/parser_fasta_test.dart ('k') | pkg/front_end/lib/src/fasta/parser/listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698