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