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