Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: lib/src/js/nodes.dart

Issue 1686953005: Split Parameter and TypeParameter out of Identifier Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/js/builder.dart ('k') | lib/src/js/printer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « lib/src/js/builder.dart ('k') | lib/src/js/printer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698