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

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

Issue 1183033004: js_ast: implement rest/spread parsing (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 6 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/precedence.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 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);
}
« no previous file with comments | « lib/src/js/builder.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698