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

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 787603003: Generative constructors in the new dart backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased Created 6 years 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/compiler/lib/src/tree_ir/tree_ir_nodes.dart
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index 6dc960f1dddabbc44e3c5977c2bdec76332f1b7f..86becb4698063115faa800db05d10a30c633c9b8 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -513,6 +513,8 @@ class Assign extends Statement {
class Return extends Statement {
/// Should not be null. Use [Constant] with [NullConstantValue] for void
/// returns.
+ /// Even in constructors this holds true. Take special care when translating
+ /// back to dart, where `return null;` in a constructor is an error.
Expression value;
Statement get next => null;
@@ -605,6 +607,50 @@ class FunctionDefinition extends Node implements ExecutableDefinition {
applyPass(Pass pass) => pass.rewriteFunctionDefinition(this);
}
+abstract class Initializer implements Expression {}
+
+class FieldInitializer extends Initializer {
+ final FieldElement element;
+ Statement body;
+ bool processed = false;
+
+ FieldInitializer(this.element, this.body);
+
+ accept(ExpressionVisitor visitor) => visitor.visitFieldInitializer(this);
+ accept1(ExpressionVisitor1 visitor, arg) {
+ return visitor.visitFieldInitializer(this, arg);
+ }
+}
+
+class SuperInitializer extends Initializer {
+ final ConstructorElement target;
+ final Selector selector;
+ final List<Statement> arguments;
+ bool processed = false;
+
+ SuperInitializer(this.target, this.selector, this.arguments);
+ accept(ExpressionVisitor visitor) => visitor.visitSuperInitializer(this);
+ accept1(ExpressionVisitor1 visitor, arg) {
+ return visitor.visitSuperInitializer(this, arg);
+ }
+}
+
+class ConstructorDefinition extends FunctionDefinition {
+ final List<Initializer> initializers;
+ final bool isConst;
+ ConstructorDefinition(ConstructorElement element,
+ List<Variable> parameters,
+ Statement body,
+ this.initializers,
+ List<ConstDeclaration> localConstants,
+ List<ConstantExpression> defaultParameterValues,
+ this.isConst)
+ : super(element, parameters, body, localConstants,
+ defaultParameterValues);
+
+ applyPass(Pass pass) => pass.rewriteConstructorDefinition(this);
+}
+
abstract class ExpressionVisitor<E> {
E visitExpression(Expression e) => e.accept(this);
E visitVariable(Variable node);
@@ -623,6 +669,8 @@ abstract class ExpressionVisitor<E> {
E visitLiteralMap(LiteralMap node);
E visitTypeOperator(TypeOperator node);
E visitFunctionExpression(FunctionExpression node);
+ E visitFieldInitializer(FieldInitializer node);
+ E visitSuperInitializer(SuperInitializer node);
}
abstract class ExpressionVisitor1<E, A> {
@@ -643,6 +691,8 @@ abstract class ExpressionVisitor1<E, A> {
E visitLiteralMap(LiteralMap node, A arg);
E visitTypeOperator(TypeOperator node, A arg);
E visitFunctionExpression(FunctionExpression node, A arg);
+ E visitFieldInitializer(FieldInitializer node, A arg);
+ E visitSuperInitializer(SuperInitializer node, A arg);
}
abstract class StatementVisitor<S> {
@@ -797,4 +847,12 @@ class RecursiveVisitor extends Visitor {
visitExpression(node.expression);
visitStatement(node.next);
}
+
+ visitFieldInitializer(FieldInitializer node) {
+ visitStatement(node.body);
+ }
+
+ visitSuperInitializer(SuperInitializer node) {
+ node.arguments.forEach(visitStatement);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698