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

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

Issue 2747583003: Parse factory constructors with Fasta. (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « pkg/compiler/lib/src/parser/node_listener.dart ('k') | pkg/front_end/lib/src/fasta/parser/listener.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 cc0f2303c817423d35c5e0d7b403930ddeb5f27c..e98969bb72a7c44b949b24a194e4c98b6ab90395 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -571,6 +571,16 @@ class AstBuilder extends ScopeListener {
}
@override
+ void endRedirectingFactoryBody(Token equalToken, Token endToken) {
+ debugEvent("RedirectingFactoryBody");
+ ConstructorName constructorName = pop();
+ Token starToken = pop();
+ Token asyncToken = pop();
+ push(new _RedirectingFactoryBody(
+ asyncToken, starToken, equalToken, constructorName));
+ }
+
+ @override
void endRethrowStatement(Token rethrowToken, Token endToken) {
debugEvent("RethrowStatement");
RethrowExpression expression =
@@ -1173,6 +1183,46 @@ class AstBuilder extends ScopeListener {
push(ast.variableDeclaration(name, null, null));
}
+ @override
+ void endFactoryMethod(
+ Token beginToken, Token factoryKeyword, Token semicolon) {
+ debugEvent("FactoryMethod");
+
+ FunctionBody body;
+ Token separator;
+ ConstructorName redirectedConstructor;
+ Object bodyObject = pop();
+ if (bodyObject is FunctionBody) {
+ body = bodyObject;
+ } else if (bodyObject is _RedirectingFactoryBody) {
+ separator = bodyObject.equalToken;
+ redirectedConstructor = bodyObject.constructorName;
+ body = ast.emptyFunctionBody(toAnalyzerToken(semicolon));
+ } else {
+ internalError('Unexpected body object: ${bodyObject.runtimeType}');
+ }
+
+ FormalParameterList parameters = pop();
+ ConstructorName constructorName = pop();
+ _Modifiers modifiers = pop();
+ List<Annotation> metadata = pop();
+ Comment comment = pop();
+ push(ast.constructorDeclaration(
+ comment,
+ metadata,
+ toAnalyzerToken(modifiers?.externalKeyword),
+ toAnalyzerToken(modifiers?.finalConstOrVarKeyword),
+ toAnalyzerToken(factoryKeyword),
+ constructorName.type.name,
+ constructorName.period,
+ constructorName.name,
+ parameters,
+ toAnalyzerToken(separator),
+ null,
+ redirectedConstructor,
+ body));
+ }
+
void endFieldInitializer(Token assignment) {
debugEvent("FieldInitializer");
Expression initializer = pop();
@@ -1470,6 +1520,17 @@ class _ParameterDefaultValue {
_ParameterDefaultValue(this.separator, this.value);
}
+/// Data structure placed on stack to represent the redirected constructor.
+class _RedirectingFactoryBody {
+ final Token asyncKeyword;
+ final Token starKeyword;
+ final Token equalToken;
+ final ConstructorName constructorName;
+
+ _RedirectingFactoryBody(this.asyncKeyword, this.starKeyword, this.equalToken,
+ this.constructorName);
+}
+
/// Data structure placed on the stack as a container for optional parameters.
class _OptionalFormalParameters {
final List<FormalParameter> parameters;
« no previous file with comments | « pkg/compiler/lib/src/parser/node_listener.dart ('k') | pkg/front_end/lib/src/fasta/parser/listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698