| Index: sdk/lib/_internal/compiler/implementation/js/nodes.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
|
| index 46d421b916f328cb9da10ac9bb06126449ad9b6f..b48c4aeb4ebebc023b14aa3a59a0d2041ab7d0d8 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
|
| @@ -64,6 +64,7 @@ abstract class NodeVisitor<T> {
|
| T visitComment(Comment node);
|
|
|
| T visitInterpolatedExpression(InterpolatedExpression node);
|
| + T visitInterpolatedStatement(InterpolatedStatement node);
|
| T visitJSExpression(JSExpression node);
|
| }
|
|
|
| @@ -151,6 +152,8 @@ class BaseVisitor<T> implements NodeVisitor<T> {
|
|
|
| T visitInterpolatedExpression(InterpolatedExpression node)
|
| => visitExpression(node);
|
| + T visitInterpolatedStatement(InterpolatedStatement node)
|
| + => visitStatement(node);
|
| T visitJSExpression(JSExpression node) => visitExpression(node);
|
|
|
| // Ignore comments by default.
|
| @@ -949,11 +952,18 @@ class Property extends Node {
|
| }
|
| }
|
|
|
| -class InterpolatedExpression extends Expression {
|
| +/// Tag class for all interpolated positions.
|
| +abstract class InterpolatedNode implements Node {}
|
| +
|
| +class InterpolatedExpression extends Expression implements InterpolatedNode {
|
| Expression value;
|
|
|
| InterpolatedExpression(this.value);
|
|
|
| + void assign(Expression newValue) {
|
| + value = newValue;
|
| + }
|
| +
|
| accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
|
|
|
| void visitChildren(NodeVisitor visitor) {
|
| @@ -963,24 +973,45 @@ class InterpolatedExpression extends Expression {
|
| int get precedenceLevel => value.precedenceLevel;
|
| }
|
|
|
| +class InterpolatedStatement extends Statement implements InterpolatedNode {
|
| + Statement value;
|
| +
|
| + InterpolatedStatement(this.value);
|
| +
|
| + void assign(Node newValue) {
|
| + if (newValue is Expression)
|
| + value = new ExpressionStatement(newValue);
|
| + else
|
| + value = newValue;
|
| + }
|
| +
|
| + accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this);
|
| +
|
| + void visitChildren(NodeVisitor visitor) {
|
| + if (value != null) value.accept(visitor);
|
| + }
|
| +}
|
| +
|
| class JSExpression extends Expression {
|
| Expression value;
|
| - List<InterpolatedExpression> interpolatedExpressions;
|
| + List<InterpolatedNode> interpolatedNodes;
|
|
|
| - JSExpression(this.value, this.interpolatedExpressions);
|
| + JSExpression(this.value, this.interpolatedNodes);
|
|
|
| accept(NodeVisitor visitor) => visitor.visitJSExpression(this);
|
|
|
| void visitChildren(NodeVisitor visitor) {
|
| value.accept(visitor);
|
| - for (InterpolatedExpression expression in interpolatedExpressions) {
|
| - expression.accept(visitor);
|
| + for (InterpolatedNode node in interpolatedNodes) {
|
| + node.accept(visitor);
|
| }
|
| }
|
|
|
| int get precedenceLevel => value.precedenceLevel;
|
| }
|
|
|
| +// TODO(sra): JSStatement like JSExpression.
|
| +
|
| /**
|
| * [RegExpLiteral]s, despite being called "Literal", do not inherit from
|
| * [Literal]. Indeed, regular expressions in JavaScript have a side-effect and
|
|
|