Index: lib/src/js/nodes.dart |
diff --git a/lib/src/js/nodes.dart b/lib/src/js/nodes.dart |
index cd0e807a9542a3cf4c5cb13da93722b2f49473a4..52181fb9ef45ec673ffc2a7047aa34c4ee1bfec5 100644 |
--- a/lib/src/js/nodes.dart |
+++ b/lib/src/js/nodes.dart |
@@ -47,7 +47,6 @@ abstract class NodeVisitor<T> implements TypeRefVisitor<T> { |
T visitThis(This node); |
T visitSuper(Super node); |
T visitAccess(PropertyAccess node); |
- T visitRestParameter(RestParameter node); |
T visitNamedFunction(NamedFunction node); |
T visitFun(Fun node); |
@@ -89,6 +88,9 @@ abstract class NodeVisitor<T> implements TypeRefVisitor<T> { |
T visitInterpolatedMethod(InterpolatedMethod node); |
T visitInterpolatedIdentifier(InterpolatedIdentifier node); |
+ T visitParameter(Parameter node); |
+ T visitTypeParameter(TypeParameter node); |
+ |
T visitArrayBindingPattern(ArrayBindingPattern node); |
T visitObjectBindingPattern(ObjectBindingPattern node); |
T visitDestructuredVariable(DestructuredVariable node); |
@@ -171,8 +173,6 @@ class BaseVisitor<T> implements NodeVisitor<T> { |
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); |
@@ -228,6 +228,9 @@ class BaseVisitor<T> implements NodeVisitor<T> { |
T visitAwait(Await node) => visitExpression(node); |
T visitDartYield(DartYield node) => visitStatement(node); |
+ T visitParameter(Parameter node) => visitNode(node); |
+ T visitTypeParameter(TypeParameter node) => visitNode(node); |
+ |
T visitBindingPattern(BindingPattern node) => visitNode(node); |
T visitArrayBindingPattern(ArrayBindingPattern node) |
=> visitBindingPattern(node); |
@@ -688,7 +691,7 @@ class DartYield extends Statement { |
DartYield _clone() => new DartYield(expression, hasStar); |
} |
-abstract class Expression extends Node { |
+abstract class Expression extends Node implements LValue { |
Expression(); |
factory Expression.binary(List<Expression> exprs, String op) { |
@@ -761,8 +764,10 @@ class VariableDeclarationList extends Expression { |
int get precedenceLevel => EXPRESSION; |
} |
+abstract class LValue implements Node {} |
+ |
class Assignment extends Expression { |
- final Expression leftHandSide; |
+ final LValue leftHandSide; |
final String op; // Null, if the assignment is not compound. |
final Expression value; // May be null, for [VariableInitialization]s. |
@@ -786,8 +791,9 @@ class Assignment extends Expression { |
} |
class VariableInitialization extends Assignment { |
+ final TypeRef type; |
/** [value] may be null. */ |
- VariableInitialization(VariableBinding declaration, Expression value) |
+ VariableInitialization(VariableBinding declaration, Expression value, {this.type}) |
: super(declaration, value); |
VariableBinding get declaration => leftHandSide; |
@@ -798,16 +804,15 @@ class VariableInitialization extends Assignment { |
new VariableInitialization(declaration, value); |
} |
-abstract class VariableBinding extends Expression { |
-} |
+abstract class VariableBinding implements LValue {} |
-class DestructuredVariable extends Expression implements Parameter { |
+class DestructuredVariable extends Node implements VariableBinding { |
/// [LiteralString] or [Identifier]. |
final Expression name; |
final BindingPattern structure; |
final Expression defaultValue; |
final TypeRef type; |
- DestructuredVariable({this.name, this.structure, this.defaultValue, this.type}) { |
+ DestructuredVariable({this.name, this.structure, this.type, this.defaultValue}) { |
assert(name != null || structure != null); |
} |
@@ -815,11 +820,10 @@ class DestructuredVariable extends Expression implements Parameter { |
void visitChildren(NodeVisitor visitor) { |
name?.accept(visitor); |
structure?.accept(visitor); |
+ type?.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); |
@@ -1060,16 +1064,40 @@ class Postfix extends Expression { |
int get precedenceLevel => UNARY; |
} |
-abstract class Parameter implements Expression, VariableBinding { |
- TypeRef get type; |
+class Parameter extends Node implements VariableBinding { |
+ final VariableBinding binding; |
+ final TypeRef type; |
+ final Expression defaultValue; |
+ final bool isRest; |
+ Parameter(this.binding, {this.type, this.defaultValue, this.isRest: false}); |
+ |
+ accept(NodeVisitor visitor) => visitor.visitParameter(this); |
+ void visitChildren(NodeVisitor visitor) { |
+ binding?.accept(visitor); |
+ defaultValue?.accept(visitor); |
+ type?.accept(visitor); |
+ } |
+ Parameter _clone() => new Parameter(binding, type: type, isRest: isRest); |
} |
-class Identifier extends Expression implements Parameter, VariableBinding { |
+class TypeParameter extends Node { |
+ final Identifier name; |
+ final TypeRef bound; |
+ TypeParameter(this.name, {this.bound}); |
+ |
+ accept(NodeVisitor visitor) => visitor.visitTypeParameter(this); |
+ void visitChildren(NodeVisitor visitor) { |
+ name?.accept(visitor); |
+ bound?.accept(visitor); |
+ } |
+ TypeParameter _clone() => new TypeParameter(name, bound: bound); |
+} |
+ |
+class Identifier extends Expression implements VariableBinding { |
final String name; |
final bool allowRename; |
- final TypeRef type; |
- Identifier(this.name, {this.allowRename: true, this.type}) { |
+ Identifier(this.name, {this.allowRename: true}) { |
if (!_identifierRE.hasMatch(name)) { |
throw new ArgumentError.value(name, "name", "not a valid identifier"); |
} |
@@ -1083,21 +1111,6 @@ class Identifier extends Expression implements Parameter, VariableBinding { |
void visitChildren(NodeVisitor visitor) {} |
} |
-// This is an expression for convenience in the AST. |
-class RestParameter extends Expression implements Parameter { |
- final Identifier parameter; |
- TypeRef get type => null; |
- |
- RestParameter(this.parameter); |
- |
- RestParameter _clone() => new RestParameter(parameter); |
- accept(NodeVisitor visitor) => visitor.visitRestParameter(this); |
- void visitChildren(NodeVisitor visitor) { |
- parameter.accept(visitor); |
- } |
- int get precedenceLevel => PRIMARY; |
-} |
- |
class This extends Expression { |
accept(NodeVisitor visitor) => visitor.visitThis(this); |
This _clone() => new This(); |
@@ -1155,7 +1168,7 @@ abstract class FunctionExpression extends Expression { |
get body; // Expression or block |
/// Type parameters passed to this generic function, if any. `null` otherwise. |
// TODO(ochafik): Support type bounds. |
- List<Identifier> get typeParams; |
+ List<TypeParameter> get typeParams; |
/// Return type of this function, if any. `null` otherwise. |
TypeRef get returnType; |
} |
@@ -1163,7 +1176,7 @@ abstract class FunctionExpression extends Expression { |
class Fun extends FunctionExpression { |
final List<Parameter> params; |
final Block body; |
- @override final List<Identifier> typeParams; |
+ @override final List<TypeParameter> typeParams; |
@override final TypeRef returnType; |
/** Whether this is a JS generator (`function*`) that may contain `yield`. */ |
final bool isGenerator; |
@@ -1190,7 +1203,7 @@ class Fun extends FunctionExpression { |
class ArrowFun extends FunctionExpression { |
final List<Parameter> params; |
final body; // Expression or Block |
- @override final List<Identifier> typeParams; |
+ @override final List<TypeParameter> typeParams; |
@override final TypeRef returnType; |
ArrowFun(this.params, this.body, {this.typeParams, this.returnType}); |
@@ -1482,7 +1495,7 @@ class ClassExpression extends Expression { |
final List<Method> methods; |
/// Type parameters of this class, if any. `null` otherwise. |
// TODO(ochafik): Support type bounds. |
- final List<Identifier> typeParams; |
+ final List<TypeParameter> typeParams; |
/// Field declarations of this class (TypeScript / ES6_TYPED). |
final List<VariableDeclarationList> fields; |
@@ -1571,18 +1584,21 @@ class InterpolatedLiteral extends Literal with InterpolatedNode { |
} |
class InterpolatedParameter extends Expression with InterpolatedNode |
- implements Identifier { |
+ implements Parameter { |
final nameOrPosition; |
+ final bool isRest; |
TypeRef get type => null; |
- String get name { throw "InterpolatedParameter.name must not be invoked"; } |
+ Identifier get binding { throw "InterpolatedParameter.binding must not be invoked"; } |
+ Expression get defaultValue { throw "InterpolatedParameter.defaultValue must not be invoked"; } |
bool get allowRename => false; |
- InterpolatedParameter(this.nameOrPosition); |
+ InterpolatedParameter(this.nameOrPosition, {this.isRest: false}); |
accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this); |
void visitChildren(NodeVisitor visitor) {} |
- InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition); |
+ InterpolatedParameter _clone() => |
+ new InterpolatedParameter(nameOrPosition, isRest: isRest); |
int get precedenceLevel => PRIMARY; |
} |
@@ -1633,7 +1649,6 @@ class InterpolatedMethod extends Expression with InterpolatedNode |
class InterpolatedIdentifier extends Expression with InterpolatedNode |
implements Identifier { |
final nameOrPosition; |
- TypeRef get type => null; |
InterpolatedIdentifier(this.nameOrPosition); |