| Index: lib/src/js/nodes.dart
|
| diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart
|
| index 879f9fa0634e74358f388b25d6936890cf8ec8c9..af0fc120c6717ec0d0d75ec84a3b48f702075534 100644
|
| --- a/lib/src/js/nodes.dart
|
| +++ b/lib/src/js/nodes.dart
|
| @@ -88,6 +88,10 @@ abstract class NodeVisitor<T> {
|
| T visitInterpolatedStatement(InterpolatedStatement node);
|
| T visitInterpolatedMethod(InterpolatedMethod node);
|
| T visitInterpolatedIdentifier(InterpolatedIdentifier node);
|
| +
|
| + T visitArrayBindingPattern(ArrayBindingPattern node);
|
| + T visitObjectBindingPattern(ObjectBindingPattern node);
|
| + T visitDestructuredVariable(DestructuredVariable node);
|
| }
|
|
|
| class BaseVisitor<T> implements NodeVisitor<T> {
|
| @@ -210,6 +214,13 @@ class BaseVisitor<T> implements NodeVisitor<T> {
|
|
|
| T visitAwait(Await node) => visitExpression(node);
|
| T visitDartYield(DartYield node) => visitStatement(node);
|
| +
|
| + T visitBindingPattern(BindingPattern node) => visitNode(node);
|
| + T visitArrayBindingPattern(ArrayBindingPattern node)
|
| + => visitBindingPattern(node);
|
| + T visitObjectBindingPattern(ObjectBindingPattern node)
|
| + => visitBindingPattern(node);
|
| + T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
|
| }
|
|
|
| abstract class Node {
|
| @@ -230,7 +241,7 @@ abstract class Node {
|
|
|
| withClosureAnnotation(ClosureAnnotation closureAnnotation) {
|
| if (this.closureAnnotation == closureAnnotation) return this;
|
| -
|
| +
|
| return _clone()
|
| ..sourceInformation = sourceInformation
|
| .._closureAnnotation = closureAnnotation;
|
| @@ -751,10 +762,10 @@ class Assignment extends Expression {
|
|
|
| class VariableInitialization extends Assignment {
|
| /** [value] may be null. */
|
| - VariableInitialization(Identifier declaration, Expression value)
|
| + VariableInitialization(VariableBinding declaration, Expression value)
|
| : super(declaration, value);
|
|
|
| - Identifier get declaration => leftHandSide;
|
| + VariableBinding get declaration => leftHandSide;
|
|
|
| accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this);
|
|
|
| @@ -762,6 +773,60 @@ class VariableInitialization extends Assignment {
|
| new VariableInitialization(declaration, value);
|
| }
|
|
|
| +abstract class VariableBinding extends Expression {
|
| +}
|
| +
|
| +class DestructuredVariable extends Expression implements Parameter {
|
| + final Identifier name;
|
| + final BindingPattern structure;
|
| + final Expression defaultValue;
|
| + DestructuredVariable({this.name, this.structure, this.defaultValue}) {
|
| + assert(name != null || structure != null);
|
| + }
|
| +
|
| + accept(NodeVisitor visitor) => visitor.visitDestructuredVariable(this);
|
| + void visitChildren(NodeVisitor visitor) {
|
| + name?.accept(visitor);
|
| + structure?.accept(visitor);
|
| + defaultValue?.accept(visitor);
|
| + }
|
| +
|
| + /// Avoid parenthesis when pretty-printing.
|
| + @override int get precedenceLevel => PRIMARY;
|
| + @override Node _clone() =>
|
| + new DestructuredVariable(
|
| + name: name, structure: structure, defaultValue: defaultValue);
|
| +}
|
| +
|
| +abstract class BindingPattern extends Expression implements VariableBinding {
|
| + final List<DestructuredVariable> variables;
|
| + BindingPattern(this.variables);
|
| +
|
| + void visitChildren(NodeVisitor visitor) {
|
| + for (DestructuredVariable v in variables) v.accept(visitor);
|
| + }
|
| +}
|
| +
|
| +class ObjectBindingPattern extends BindingPattern {
|
| + ObjectBindingPattern(List<DestructuredVariable> variables)
|
| + : super(variables);
|
| + accept(NodeVisitor visitor) => visitor.visitObjectBindingPattern(this);
|
| +
|
| + /// Avoid parenthesis when pretty-printing.
|
| + @override int get precedenceLevel => PRIMARY;
|
| + @override Node _clone() => new ObjectBindingPattern(variables);
|
| +}
|
| +
|
| +class ArrayBindingPattern extends BindingPattern {
|
| + ArrayBindingPattern(List<DestructuredVariable> variables)
|
| + : super(variables);
|
| + accept(NodeVisitor visitor) => visitor.visitArrayBindingPattern(this);
|
| +
|
| + /// Avoid parenthesis when pretty-printing.
|
| + @override int get precedenceLevel => PRIMARY;
|
| + @override Node _clone() => new ObjectBindingPattern(variables);
|
| +}
|
| +
|
| class Conditional extends Expression {
|
| final Expression condition;
|
| final Expression then;
|
| @@ -930,7 +995,7 @@ class Prefix extends Expression {
|
| }
|
|
|
| // SpreadElement isn't really a prefix expression, as it can only appear in
|
| -// certain places such as ArgumentList and destructuring, but we pretend
|
| +// certain places such as ArgumentList and BindingPattern, but we pretend
|
| // it is for simplicity's sake.
|
| class Spread extends Prefix {
|
| Spread(Expression operand) : super('...', operand);
|
| @@ -957,9 +1022,9 @@ class Postfix extends Expression {
|
| int get precedenceLevel => UNARY;
|
| }
|
|
|
| -abstract class Parameter implements Expression {}
|
| +abstract class Parameter implements Expression, VariableBinding {}
|
|
|
| -class Identifier extends Expression implements Parameter {
|
| +class Identifier extends Expression implements Parameter, VariableBinding {
|
| final String name;
|
| final bool allowRename;
|
|
|
|
|