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>[]; |