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

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

Issue 2709783003: Parse optional and named parameters. (Closed)
Patch Set: Add 'FormalParameterType kind' to endFormalParameter() and add handleFormalParameterWithoutValue(). 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 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);
+}

Powered by Google App Engine
This is Rietveld 408576698