Chromium Code Reviews| 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 a63af7f9ac69314a36f08e0b54e96eb0793914d4..2cc7c099aadd40636a0a3fd8b9e94d43e27957bb 100644 |
| --- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
| +++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart |
| @@ -9,6 +9,8 @@ import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; |
| import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; |
| import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; |
| import 'package:analyzer/dart/element/element.dart' show Element; |
| +import 'package:front_end/src/fasta/parser/parser.dart' |
| + show FormalParameterType; |
| import 'package:front_end/src/fasta/scanner/token.dart' |
| show BeginGroupToken, Token; |
| import 'package:kernel/ast.dart' show AsyncMarker; |
| @@ -491,17 +493,44 @@ class AstBuilder extends ScopeListener { |
| push(ast.throwExpression(toAnalyzerToken(throwToken), pop())); |
| } |
| - void endFormalParameter(Token thisKeyword) { |
| + @override |
| + void endOptionalFormalParameters( |
| + int count, Token beginToken, Token endToken) { |
| + debugEvent("OptionalFormalParameters"); |
| + } |
| + |
| + void handleValuedFormalParameter(Token equals, Token token) { |
| + debugEvent("ValuedFormalParameter"); |
| + Expression value = pop(); |
| + push(new _ParameterDefaultValue(equals, value)); |
| + } |
| + |
| + void handleFormalParameterWithoutValue(Token token) { |
| + debugEvent("FormalParameterWithoutValue"); |
| + push(_ParameterDefaultValue.nullValue); |
|
Paul Berry
2017/02/22 20:50:04
Personally I would prefer to use the enum NullValu
ahe
2017/02/23 14:54:49
I agree. Don't hesitate to add values to that enum
scheglov
2017/02/23 17:55:10
Done.
|
| + } |
| + |
| + void endFormalParameter(Token thisKeyword, FormalParameterType kind) { |
| debugEvent("FormalParameter"); |
| if (thisKeyword != null) { |
| internalError("'this' can't be used here."); |
| } |
| + _ParameterDefaultValue defaultValue = pop(); |
| SimpleIdentifier name = pop(); |
| TypeName type = pop(); |
| Token keyword = _popOptionalSingleModifier(); |
| pop(); // Metadata. |
| - SimpleFormalParameter node = ast.simpleFormalParameter( |
| + FormalParameter node = ast.simpleFormalParameter( |
| null, null, toAnalyzerToken(keyword), type, name); |
| + |
| + if (defaultValue.separator != null) { |
| + node = ast.defaultFormalParameter( |
| + node, |
| + _toAnalyzerParameterKind(kind), |
| + toAnalyzerToken(defaultValue.separator), |
| + defaultValue.value); |
| + } |
| + |
| scope[name.name] = name.staticElement = new AnalyzerParameterElement(node); |
| push(node); |
| } |
| @@ -1138,6 +1167,17 @@ class AstBuilder extends ScopeListener { |
| return null; |
| } |
| } |
| + |
| + ParameterKind _toAnalyzerParameterKind(FormalParameterType type) { |
| + if (type == FormalParameterType.POSITIONAL) { |
| + return ParameterKind.POSITIONAL; |
| + } else |
|
Paul Berry
2017/02/22 20:50:05
Nit: run dartfmt
|
| + if (type == FormalParameterType.NAMED) { |
| + return ParameterKind.NAMED; |
| + } else { |
| + return ParameterKind.REQUIRED; |
| + } |
| + } |
| } |
| /// Data structure placed on the stack to represent a class body. |
| @@ -1170,3 +1210,14 @@ class _MixinApplication { |
| _MixinApplication(this.supertype, this.withKeyword, this.mixinTypes); |
| } |
| + |
| +/// Data structure placed on the stack to represent the default parameter |
| +/// value with the separator token. |
| +class _ParameterDefaultValue { |
| + static final nullValue = new _ParameterDefaultValue(null, null); |
|
Paul Berry
2017/02/22 20:50:05
Nit: make this const.
(Or delete it if you take m
|
| + |
| + final Token separator; |
| + final Expression value; |
| + |
| + _ParameterDefaultValue(this.separator, this.value); |
| +} |