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

Side by Side Diff: lib/src/js/nodes.dart

Issue 1207313002: initial sync*, part of #221 (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 5 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 unified diff | Download patch
« no previous file with comments | « lib/src/codegen/js_metalet.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of js_ast; 5 part of js_ast;
6 6
7 abstract class NodeVisitor<T> { 7 abstract class NodeVisitor<T> {
8 T visitProgram(Program node); 8 T visitProgram(Program node);
9 9
10 T visitBlock(Block node); 10 T visitBlock(Block node);
(...skipping 23 matching lines...) Expand all
34 T visitVariableDeclarationList(VariableDeclarationList node); 34 T visitVariableDeclarationList(VariableDeclarationList node);
35 T visitAssignment(Assignment node); 35 T visitAssignment(Assignment node);
36 T visitVariableInitialization(VariableInitialization node); 36 T visitVariableInitialization(VariableInitialization node);
37 T visitConditional(Conditional cond); 37 T visitConditional(Conditional cond);
38 T visitNew(New node); 38 T visitNew(New node);
39 T visitCall(Call node); 39 T visitCall(Call node);
40 T visitBinary(Binary node); 40 T visitBinary(Binary node);
41 T visitPrefix(Prefix node); 41 T visitPrefix(Prefix node);
42 T visitPostfix(Postfix node); 42 T visitPostfix(Postfix node);
43 T visitSpread(Spread node); 43 T visitSpread(Spread node);
44 T visitYield(Yield node);
44 45
45 T visitIdentifier(Identifier node); 46 T visitIdentifier(Identifier node);
46 T visitThis(This node); 47 T visitThis(This node);
47 T visitSuper(Super node); 48 T visitSuper(Super node);
48 T visitAccess(PropertyAccess node); 49 T visitAccess(PropertyAccess node);
49 T visitRestParameter(RestParameter node); 50 T visitRestParameter(RestParameter node);
50 51
51 T visitNamedFunction(NamedFunction node); 52 T visitNamedFunction(NamedFunction node);
52 T visitFun(Fun node); 53 T visitFun(Fun node);
53 T visitArrowFun(ArrowFun node); 54 T visitArrowFun(ArrowFun node);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 return visitExpression(node); 134 return visitExpression(node);
134 } 135 }
135 } 136 }
136 T visitConditional(Conditional node) => visitExpression(node); 137 T visitConditional(Conditional node) => visitExpression(node);
137 T visitNew(New node) => visitExpression(node); 138 T visitNew(New node) => visitExpression(node);
138 T visitCall(Call node) => visitExpression(node); 139 T visitCall(Call node) => visitExpression(node);
139 T visitBinary(Binary node) => visitExpression(node); 140 T visitBinary(Binary node) => visitExpression(node);
140 T visitPrefix(Prefix node) => visitExpression(node); 141 T visitPrefix(Prefix node) => visitExpression(node);
141 T visitPostfix(Postfix node) => visitExpression(node); 142 T visitPostfix(Postfix node) => visitExpression(node);
142 T visitSpread(Spread node) => visitPrefix(node); 143 T visitSpread(Spread node) => visitPrefix(node);
144 T visitYield(Yield node) => visitExpression(node);
143 T visitAccess(PropertyAccess node) => visitExpression(node); 145 T visitAccess(PropertyAccess node) => visitExpression(node);
144 146
145 T visitIdentifier(Identifier node) => visitExpression(node); 147 T visitIdentifier(Identifier node) => visitExpression(node);
146 T visitThis(This node) => visitExpression(node); 148 T visitThis(This node) => visitExpression(node);
147 T visitSuper(Super node) => visitExpression(node); 149 T visitSuper(Super node) => visitExpression(node);
148 150
149 T visitRestParameter(RestParameter node) => visitNode(node); 151 T visitRestParameter(RestParameter node) => visitNode(node);
150 152
151 T visitNamedFunction(NamedFunction node) => visitExpression(node); 153 T visitNamedFunction(NamedFunction node) => visitExpression(node);
152 T visitFunctionExpression(FunctionExpression node) => visitExpression(node); 154 T visitFunctionExpression(FunctionExpression node) => visitExpression(node);
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 for (var node in exprs) { 609 for (var node in exprs) {
608 comma = (comma == null) ? node : new Binary(op, comma, node); 610 comma = (comma == null) ? node : new Binary(op, comma, node);
609 } 611 }
610 return comma; 612 return comma;
611 } 613 }
612 614
613 int get precedenceLevel; 615 int get precedenceLevel;
614 616
615 Statement toStatement() => new ExpressionStatement(toVoidExpression()); 617 Statement toStatement() => new ExpressionStatement(toVoidExpression());
616 Statement toReturn() => new Return(this); 618 Statement toReturn() => new Return(this);
619 Statement toYieldStatement({bool star: false}) =>
620 new ExpressionStatement(new Yield(this, star: star));
617 621
618 Expression toVoidExpression() => this; 622 Expression toVoidExpression() => this;
619 Expression toAssignExpression(Expression left) => new Assignment(left, this); 623 Expression toAssignExpression(Expression left) => new Assignment(left, this);
620 Statement toVariableDeclaration(Identifier name) => 624 Statement toVariableDeclaration(Identifier name) =>
621 new VariableDeclarationList('let', 625 new VariableDeclarationList('let',
622 [new VariableInitialization(name, this)]).toStatement(); 626 [new VariableInitialization(name, this)]).toStatement();
623 } 627 }
624 628
625 class LiteralExpression extends Expression { 629 class LiteralExpression extends Expression {
626 final String template; 630 final String template;
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 Statement toStatement() { 788 Statement toStatement() {
785 if (!isCommaOperator) return super.toStatement(); 789 if (!isCommaOperator) return super.toStatement();
786 return new Block([left.toStatement(), right.toStatement()]); 790 return new Block([left.toStatement(), right.toStatement()]);
787 } 791 }
788 792
789 Statement toReturn() { 793 Statement toReturn() {
790 if (!isCommaOperator) return super.toReturn(); 794 if (!isCommaOperator) return super.toReturn();
791 return new Block([left.toStatement(), right.toReturn()]); 795 return new Block([left.toStatement(), right.toReturn()]);
792 } 796 }
793 797
798 Statement toYieldStatement({bool star: false}) {
799 if (!isCommaOperator) return super.toYieldStatement(star: star);
800 return new Block([left.toStatement(), right.toYieldStatement(star: star)]);
801 }
802
794 List<Expression> commaToExpressionList() { 803 List<Expression> commaToExpressionList() {
795 if (!isCommaOperator) throw new StateError('not a comma expression'); 804 if (!isCommaOperator) throw new StateError('not a comma expression');
796 var exprs = []; 805 var exprs = [];
797 _flattenComma(exprs, left); 806 _flattenComma(exprs, left);
798 _flattenComma(exprs, right); 807 _flattenComma(exprs, right);
799 return exprs; 808 return exprs;
800 } 809 }
801 810
802 static void _flattenComma(List<Expression> exprs, Expression node) { 811 static void _flattenComma(List<Expression> exprs, Expression node) {
803 if (node is Binary && node.isCommaOperator) { 812 if (node is Binary && node.isCommaOperator) {
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 } 972 }
964 973
965 abstract class FunctionExpression extends Expression { 974 abstract class FunctionExpression extends Expression {
966 List<Parameter> get params; 975 List<Parameter> get params;
967 get body; // Expression or block 976 get body; // Expression or block
968 } 977 }
969 978
970 class Fun extends FunctionExpression { 979 class Fun extends FunctionExpression {
971 final List<Parameter> params; 980 final List<Parameter> params;
972 final Block body; 981 final Block body;
982 /** Whether this is a JS generator (`function*`) that may contain `yield`. */
983 final bool isGenerator;
984
973 final AsyncModifier asyncModifier; 985 final AsyncModifier asyncModifier;
974 986
975 Fun(this.params, this.body, {this.asyncModifier: const AsyncModifier.sync()}); 987 Fun(this.params, this.body, {this.isGenerator: false,
988 this.asyncModifier: const AsyncModifier.sync()});
976 989
977 accept(NodeVisitor visitor) => visitor.visitFun(this); 990 accept(NodeVisitor visitor) => visitor.visitFun(this);
978 991
979 void visitChildren(NodeVisitor visitor) { 992 void visitChildren(NodeVisitor visitor) {
980 for (Parameter param in params) param.accept(visitor); 993 for (Parameter param in params) param.accept(visitor);
981 body.accept(visitor); 994 body.accept(visitor);
982 } 995 }
983 996
984 Fun _clone() => new Fun(params, body, asyncModifier: asyncModifier); 997 Fun _clone() => new Fun(params, body,
998 isGenerator: isGenerator, asyncModifier: asyncModifier);
985 999
986 int get precedenceLevel => CALL; 1000 int get precedenceLevel => ASSIGNMENT;
987 } 1001 }
988 1002
989 class ArrowFun extends FunctionExpression { 1003 class ArrowFun extends FunctionExpression {
990 final List<Parameter> params; 1004 final List<Parameter> params;
991 final body; // Expression or Block 1005 final body; // Expression or Block
992 1006
993 ArrowFun(this.params, this.body); 1007 ArrowFun(this.params, this.body);
994 1008
995 accept(NodeVisitor visitor) => visitor.visitArrowFun(this); 1009 accept(NodeVisitor visitor) => visitor.visitArrowFun(this);
996 1010
997 void visitChildren(NodeVisitor visitor) { 1011 void visitChildren(NodeVisitor visitor) {
998 for (Parameter param in params) param.accept(visitor); 1012 for (Parameter param in params) param.accept(visitor);
999 body.accept(visitor); 1013 body.accept(visitor);
1000 } 1014 }
1001 1015
1002 ArrowFun _clone() => new ArrowFun(params, body); 1016 ArrowFun _clone() => new ArrowFun(params, body);
1003 1017
1004 /// Ensure parens always get generated if necessary. 1018 /// Ensure parens always get generated if necessary.
1005 // TODO(jmesserly): I'm not sure the printer is handling this correctly for 1019 // TODO(jmesserly): I'm not sure the printer is handling this correctly for
1006 // function() { ... } either. 1020 // function() { ... } either.
1007 int get precedenceLevel => ASSIGNMENT; 1021 int get precedenceLevel => ASSIGNMENT;
1008 } 1022 }
1009 1023
1024 /**
1025 * The Dart sync, sync*, async, and async* modifier.
1026 * See [DartYield].
1027 *
1028 * This is not used for JS functions.
1029 */
1010 class AsyncModifier { 1030 class AsyncModifier {
1011 final bool isAsync; 1031 final bool isAsync;
1012 final bool isYielding; 1032 final bool isYielding;
1013 final String description; 1033 final String description;
1014 1034
1015 const AsyncModifier.sync() 1035 const AsyncModifier.sync()
1016 : isAsync = false, 1036 : isAsync = false,
1017 isYielding = false, 1037 isYielding = false,
1018 description = "sync"; 1038 description = "sync";
1019 const AsyncModifier.async() 1039 const AsyncModifier.async()
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 void visitChildren(NodeVisitor visitor) { 1250 void visitChildren(NodeVisitor visitor) {
1231 tag.accept(visitor); 1251 tag.accept(visitor);
1232 template.accept(visitor); 1252 template.accept(visitor);
1233 } 1253 }
1234 1254
1235 TaggedTemplate _clone() => new TaggedTemplate(tag, template); 1255 TaggedTemplate _clone() => new TaggedTemplate(tag, template);
1236 1256
1237 int get precedenceLevel => CALL; 1257 int get precedenceLevel => CALL;
1238 } 1258 }
1239 1259
1260 // TODO(jmesserly): parser does not support this yet.
1261 class Yield extends Expression {
1262 final Expression value;
1263
1264 /**
1265 * Whether this yield expression is a `yield*` that iterates each item in
1266 * [value].
1267 */
1268 final bool star;
1269
1270 Yield(this.value, {this.star: false});
1271
1272 accept(NodeVisitor visitor) => visitor.visitYield(this);
1273
1274 void visitChildren(NodeVisitor visitor) {
1275 value.accept(visitor);
1276 }
1277
1278 Yield _clone() => new Yield(value);
1279
1280 int get precedenceLevel => YIELD;
1281 }
1282
1240 class ClassDeclaration extends Statement { 1283 class ClassDeclaration extends Statement {
1241 final ClassExpression classExpr; 1284 final ClassExpression classExpr;
1242 1285
1243 ClassDeclaration(this.classExpr); 1286 ClassDeclaration(this.classExpr);
1244 1287
1245 accept(NodeVisitor visitor) => visitor.visitClassDeclaration(this); 1288 accept(NodeVisitor visitor) => visitor.visitClassDeclaration(this);
1246 visitChildren(NodeVisitor visitor) => classExpr.accept(visitor); 1289 visitChildren(NodeVisitor visitor) => classExpr.accept(visitor);
1247 ClassDeclaration _clone() => new ClassDeclaration(classExpr); 1290 ClassDeclaration _clone() => new ClassDeclaration(classExpr);
1248 } 1291 }
1249 1292
(...skipping 20 matching lines...) Expand all
1270 class Method extends Property { 1313 class Method extends Property {
1271 final bool isGetter; 1314 final bool isGetter;
1272 final bool isSetter; 1315 final bool isSetter;
1273 final bool isStatic; 1316 final bool isStatic;
1274 1317
1275 Method(Expression name, Fun function, 1318 Method(Expression name, Fun function,
1276 {this.isGetter: false, this.isSetter: false, this.isStatic: false}) 1319 {this.isGetter: false, this.isSetter: false, this.isStatic: false})
1277 : super(name, function) { 1320 : super(name, function) {
1278 assert(!isGetter || function.params.length == 0); 1321 assert(!isGetter || function.params.length == 0);
1279 assert(!isSetter || function.params.length == 1); 1322 assert(!isSetter || function.params.length == 1);
1323 assert(!isGetter && !isSetter || !function.isGenerator);
1280 } 1324 }
1281 1325
1282 Fun get function => super.value; 1326 Fun get function => super.value;
1283 1327
1284 accept(NodeVisitor visitor) => visitor.visitMethod(this); 1328 accept(NodeVisitor visitor) => visitor.visitMethod(this);
1285 1329
1286 void visitChildren(NodeVisitor visitor) { 1330 void visitChildren(NodeVisitor visitor) {
1287 name.accept(visitor); 1331 name.accept(visitor);
1288 function.accept(visitor); 1332 function.accept(visitor);
1289 } 1333 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 final Expression expression; 1506 final Expression expression;
1463 1507
1464 CommentExpression(this.comment, this.expression); 1508 CommentExpression(this.comment, this.expression);
1465 1509
1466 int get precedenceLevel => PRIMARY; 1510 int get precedenceLevel => PRIMARY;
1467 accept(NodeVisitor visitor) => visitor.visitCommentExpression(this); 1511 accept(NodeVisitor visitor) => visitor.visitCommentExpression(this);
1468 CommentExpression _clone() => new CommentExpression(comment, expression); 1512 CommentExpression _clone() => new CommentExpression(comment, expression);
1469 1513
1470 void visitChildren(NodeVisitor visitor) => expression.accept(visitor); 1514 void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
1471 } 1515 }
OLDNEW
« no previous file with comments | « lib/src/codegen/js_metalet.dart ('k') | lib/src/js/precedence.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698