| 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 8f0e85666c0f69773ef1daf68001d334d27bb93c..ed91773ef1aadac8ce238a4c89f7138e44e7e123 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| @@ -446,7 +446,7 @@ class FunctionExpression extends Expression {
|
| }
|
| }
|
|
|
| -/// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
|
| +/// A [LabeledStatement] or [WhileTrue] or [For].
|
| abstract class JumpTarget extends Statement {
|
| Label get label;
|
| Statement get body;
|
| @@ -472,7 +472,7 @@ class LabeledStatement extends JumpTarget {
|
| }
|
| }
|
|
|
| -/// A [WhileTrue] or [WhileCondition] loop.
|
| +/// A [WhileTrue] or [For] loop.
|
| abstract class Loop extends JumpTarget {
|
| }
|
|
|
| @@ -496,30 +496,36 @@ class WhileTrue extends Loop {
|
| }
|
|
|
| /**
|
| - * A while loop with a condition. If the condition is false, control resumes
|
| - * at the [next] statement.
|
| + * A loop with a condition and update expressions. If there are any update
|
| + * expressions, this generates a for loop, otherwise a while loop.
|
| + *
|
| + * When the condition is false, control resumes at the [next] statement.
|
| *
|
| * It is NOT valid to target this statement with a [Break].
|
| * The only way to reach [next] is for the condition to evaluate to false.
|
| *
|
| - * [WhileCondition] statements are introduced in the [LoopRewriter] and is
|
| + * [For] statements are introduced in the [LoopRewriter] and are
|
| * assumed not to occur before then.
|
| */
|
| -class WhileCondition extends Loop {
|
| +class For extends Loop {
|
| final Label label;
|
| Expression condition;
|
| + List<Expression> updates;
|
| Statement body;
|
| Statement next;
|
|
|
| - WhileCondition(this.label, this.condition, this.body,
|
| - this.next) {
|
| + For(this.label,
|
| + this.condition,
|
| + this.updates,
|
| + this.body,
|
| + this.next) {
|
| assert(label.binding == null);
|
| label.binding = this;
|
| }
|
|
|
| - accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
|
| + accept(StatementVisitor visitor) => visitor.visitFor(this);
|
| accept1(StatementVisitor1 visitor, arg) {
|
| - return visitor.visitWhileCondition(this, arg);
|
| + return visitor.visitFor(this, arg);
|
| }
|
| }
|
|
|
| @@ -547,7 +553,7 @@ class Break extends Jump {
|
| }
|
|
|
| /**
|
| - * A continue to an enclosing [WhileTrue] or [WhileCondition] loop.
|
| + * A continue to an enclosing [WhileTrue] or [For] loop.
|
| * The continue targets the loop's body.
|
| */
|
| class Continue extends Jump {
|
| @@ -1013,7 +1019,7 @@ abstract class StatementVisitor<S> {
|
| S visitContinue(Continue node);
|
| S visitIf(If node);
|
| S visitWhileTrue(WhileTrue node);
|
| - S visitWhileCondition(WhileCondition node);
|
| + S visitFor(For node);
|
| S visitExpressionStatement(ExpressionStatement node);
|
| S visitTry(Try node);
|
| S visitUnreachable(Unreachable node);
|
| @@ -1030,7 +1036,7 @@ abstract class StatementVisitor1<S, A> {
|
| S visitContinue(Continue node, A arg);
|
| S visitIf(If node, A arg);
|
| S visitWhileTrue(WhileTrue node, A arg);
|
| - S visitWhileCondition(WhileCondition node, A arg);
|
| + S visitFor(For node, A arg);
|
| S visitExpressionStatement(ExpressionStatement node, A arg);
|
| S visitTry(Try node, A arg);
|
| S visitUnreachable(Unreachable node, A arg);
|
| @@ -1140,8 +1146,9 @@ abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor {
|
| visitStatement(node.body);
|
| }
|
|
|
| - visitWhileCondition(WhileCondition node) {
|
| + visitFor(For node) {
|
| visitExpression(node.condition);
|
| + node.updates.forEach(visitExpression);
|
| visitStatement(node.body);
|
| visitStatement(node.next);
|
| }
|
| @@ -1371,8 +1378,9 @@ class RecursiveTransformer extends Transformer {
|
| return node;
|
| }
|
|
|
| - visitWhileCondition(WhileCondition node) {
|
| + visitFor(For node) {
|
| node.condition = visitExpression(node.condition);
|
| + _replaceExpressions(node.updates);
|
| node.body = visitStatement(node.body);
|
| node.next = visitStatement(node.next);
|
| return node;
|
|
|