| Index: lib/src/js/nodes.dart
|
| diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart
|
| index 6c44d55748b406ed24c3e868842e7375de3b53f0..cb3f0b0240696a3228626358585b30206094529b 100644
|
| --- a/lib/src/js/nodes.dart
|
| +++ b/lib/src/js/nodes.dart
|
| @@ -40,11 +40,13 @@ abstract class NodeVisitor<T> {
|
| T visitBinary(Binary node);
|
| T visitPrefix(Prefix node);
|
| T visitPostfix(Postfix node);
|
| + T visitSpread(Spread node);
|
|
|
| T visitIdentifier(Identifier node);
|
| T visitThis(This node);
|
| T visitSuper(Super node);
|
| T visitAccess(PropertyAccess node);
|
| + T visitRestParameter(RestParameter node);
|
|
|
| T visitNamedFunction(NamedFunction node);
|
| T visitFun(Fun node);
|
| @@ -137,12 +139,15 @@ class BaseVisitor<T> implements NodeVisitor<T> {
|
| T visitBinary(Binary node) => visitExpression(node);
|
| T visitPrefix(Prefix node) => visitExpression(node);
|
| T visitPostfix(Postfix node) => visitExpression(node);
|
| + T visitSpread(Spread node) => visitPrefix(node);
|
| T visitAccess(PropertyAccess node) => visitExpression(node);
|
|
|
| T visitIdentifier(Identifier node) => visitExpression(node);
|
| T visitThis(This node) => visitExpression(node);
|
| T visitSuper(Super node) => visitExpression(node);
|
|
|
| + T visitRestParameter(RestParameter node) => visitNode(node);
|
| +
|
| T visitNamedFunction(NamedFunction node) => visitExpression(node);
|
| T visitFunctionExpression(FunctionExpression node) => visitExpression(node);
|
| T visitFun(Fun node) => visitFunctionExpression(node);
|
| @@ -864,6 +869,17 @@ class Prefix extends Expression {
|
| int get precedenceLevel => UNARY;
|
| }
|
|
|
| +// SpreadElement isn't really a prefix expression, as it can only appear in
|
| +// certain places such as ArgumentList and destructuring, but we pretend
|
| +// it is for simplicity's sake.
|
| +class Spread extends Prefix {
|
| + Spread(Expression operand) : super('...', operand);
|
| + int get precedenceLevel => SPREAD;
|
| +
|
| + accept(NodeVisitor visitor) => visitor.visitSpread(this);
|
| + Spread _clone() => new Spread(argument);
|
| +}
|
| +
|
| class Postfix extends Expression {
|
| final String op;
|
| final Expression argument;
|
| @@ -881,7 +897,9 @@ class Postfix extends Expression {
|
| int get precedenceLevel => UNARY;
|
| }
|
|
|
| -class Identifier extends Expression {
|
| +abstract class Parameter implements Expression {}
|
| +
|
| +class Identifier extends Expression implements Parameter {
|
| final String name;
|
| final bool allowRename;
|
|
|
| @@ -897,6 +915,20 @@ class Identifier extends Expression {
|
| void visitChildren(NodeVisitor visitor) {}
|
| }
|
|
|
| +// This is an expression for convenience in the AST.
|
| +class RestParameter extends Expression implements Parameter {
|
| + final Identifier parameter;
|
| +
|
| + RestParameter(this.parameter);
|
| +
|
| + RestParameter _clone() => new RestParameter(parameter);
|
| + accept(NodeVisitor visitor) => visitor.visitRestParameter(this);
|
| + void visitChildren(NodeVisitor visitor) {
|
| + parameter.accept(visitor);
|
| + }
|
| + int get precedenceLevel => SPREAD;
|
| +}
|
| +
|
| class This extends Expression {
|
| accept(NodeVisitor visitor) => visitor.visitThis(this);
|
| This _clone() => new This();
|
| @@ -931,12 +963,12 @@ class NamedFunction extends Expression {
|
| }
|
|
|
| abstract class FunctionExpression extends Expression {
|
| - List<Identifier> get params;
|
| + List<Parameter> get params;
|
| get body; // Expression or block
|
| }
|
|
|
| class Fun extends FunctionExpression {
|
| - final List<Identifier> params;
|
| + final List<Parameter> params;
|
| final Block body;
|
| final AsyncModifier asyncModifier;
|
|
|
| @@ -945,7 +977,7 @@ class Fun extends FunctionExpression {
|
| accept(NodeVisitor visitor) => visitor.visitFun(this);
|
|
|
| void visitChildren(NodeVisitor visitor) {
|
| - for (Identifier param in params) param.accept(visitor);
|
| + for (Parameter param in params) param.accept(visitor);
|
| body.accept(visitor);
|
| }
|
|
|
| @@ -955,7 +987,7 @@ class Fun extends FunctionExpression {
|
| }
|
|
|
| class ArrowFun extends FunctionExpression {
|
| - final List<Identifier> params;
|
| + final List<Parameter> params;
|
| final body; // Expression or Block
|
|
|
| ArrowFun(this.params, this.body);
|
| @@ -963,7 +995,7 @@ class ArrowFun extends FunctionExpression {
|
| accept(NodeVisitor visitor) => visitor.visitArrowFun(this);
|
|
|
| void visitChildren(NodeVisitor visitor) {
|
| - for (Identifier param in params) param.accept(visitor);
|
| + for (Parameter param in params) param.accept(visitor);
|
| body.accept(visitor);
|
| }
|
|
|
|
|