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); |
+} |