OLD | NEW |
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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 return null; | 88 return null; |
89 } | 89 } |
90 | 90 |
91 T visitProgram(Program node) => visitNode(node); | 91 T visitProgram(Program node) => visitNode(node); |
92 | 92 |
93 T visitStatement(Statement node) => visitNode(node); | 93 T visitStatement(Statement node) => visitNode(node); |
94 T visitLoop(Loop node) => visitStatement(node); | 94 T visitLoop(Loop node) => visitStatement(node); |
95 T visitJump(Statement node) => visitStatement(node); | 95 T visitJump(Statement node) => visitStatement(node); |
96 | 96 |
97 T visitBlock(Block node) => visitStatement(node); | 97 T visitBlock(Block node) => visitStatement(node); |
98 T visitExpressionStatement(ExpressionStatement node) | 98 T visitExpressionStatement(ExpressionStatement node) => visitStatement(node); |
99 => visitStatement(node); | |
100 T visitEmptyStatement(EmptyStatement node) => visitStatement(node); | 99 T visitEmptyStatement(EmptyStatement node) => visitStatement(node); |
101 T visitIf(If node) => visitStatement(node); | 100 T visitIf(If node) => visitStatement(node); |
102 T visitFor(For node) => visitLoop(node); | 101 T visitFor(For node) => visitLoop(node); |
103 T visitForIn(ForIn node) => visitLoop(node); | 102 T visitForIn(ForIn node) => visitLoop(node); |
104 T visitWhile(While node) => visitLoop(node); | 103 T visitWhile(While node) => visitLoop(node); |
105 T visitDo(Do node) => visitLoop(node); | 104 T visitDo(Do node) => visitLoop(node); |
106 T visitContinue(Continue node) => visitJump(node); | 105 T visitContinue(Continue node) => visitJump(node); |
107 T visitBreak(Break node) => visitJump(node); | 106 T visitBreak(Break node) => visitJump(node); |
108 T visitReturn(Return node) => visitJump(node); | 107 T visitReturn(Return node) => visitJump(node); |
109 T visitThrow(Throw node) => visitJump(node); | 108 T visitThrow(Throw node) => visitJump(node); |
110 T visitTry(Try node) => visitStatement(node); | 109 T visitTry(Try node) => visitStatement(node); |
111 T visitSwitch(Switch node) => visitStatement(node); | 110 T visitSwitch(Switch node) => visitStatement(node); |
112 T visitFunctionDeclaration(FunctionDeclaration node) | 111 T visitFunctionDeclaration(FunctionDeclaration node) => visitStatement(node); |
113 => visitStatement(node); | |
114 T visitLabeledStatement(LabeledStatement node) => visitStatement(node); | 112 T visitLabeledStatement(LabeledStatement node) => visitStatement(node); |
115 T visitLiteralStatement(LiteralStatement node) => visitStatement(node); | 113 T visitLiteralStatement(LiteralStatement node) => visitStatement(node); |
116 | 114 |
117 T visitCatch(Catch node) => visitNode(node); | 115 T visitCatch(Catch node) => visitNode(node); |
118 T visitCase(Case node) => visitNode(node); | 116 T visitCase(Case node) => visitNode(node); |
119 T visitDefault(Default node) => visitNode(node); | 117 T visitDefault(Default node) => visitNode(node); |
120 | 118 |
121 T visitExpression(Expression node) => visitNode(node); | 119 T visitExpression(Expression node) => visitNode(node); |
122 T visitVariableReference(VariableReference node) => visitExpression(node); | 120 T visitVariableReference(VariableReference node) => visitExpression(node); |
123 | 121 |
124 T visitLiteralExpression(LiteralExpression node) => visitExpression(node); | 122 T visitLiteralExpression(LiteralExpression node) => visitExpression(node); |
125 T visitVariableDeclarationList(VariableDeclarationList node) | 123 T visitVariableDeclarationList(VariableDeclarationList node) => |
126 => visitExpression(node); | 124 visitExpression(node); |
127 T visitAssignment(Assignment node) => visitExpression(node); | 125 T visitAssignment(Assignment node) => visitExpression(node); |
128 T visitVariableInitialization(VariableInitialization node) { | 126 T visitVariableInitialization(VariableInitialization node) { |
129 if (node.value != null) { | 127 if (node.value != null) { |
130 return visitAssignment(node); | 128 return visitAssignment(node); |
131 } else { | 129 } else { |
132 return visitExpression(node); | 130 return visitExpression(node); |
133 } | 131 } |
134 } | 132 } |
| 133 |
135 T visitConditional(Conditional node) => visitExpression(node); | 134 T visitConditional(Conditional node) => visitExpression(node); |
136 T visitNew(New node) => visitExpression(node); | 135 T visitNew(New node) => visitExpression(node); |
137 T visitCall(Call node) => visitExpression(node); | 136 T visitCall(Call node) => visitExpression(node); |
138 T visitBinary(Binary node) => visitExpression(node); | 137 T visitBinary(Binary node) => visitExpression(node); |
139 T visitPrefix(Prefix node) => visitExpression(node); | 138 T visitPrefix(Prefix node) => visitExpression(node); |
140 T visitPostfix(Postfix node) => visitExpression(node); | 139 T visitPostfix(Postfix node) => visitExpression(node); |
141 T visitAccess(PropertyAccess node) => visitExpression(node); | 140 T visitAccess(PropertyAccess node) => visitExpression(node); |
142 | 141 |
143 T visitVariableUse(VariableUse node) => visitVariableReference(node); | 142 T visitVariableUse(VariableUse node) => visitVariableReference(node); |
144 T visitVariableDeclaration(VariableDeclaration node) | 143 T visitVariableDeclaration(VariableDeclaration node) => |
145 => visitVariableReference(node); | 144 visitVariableReference(node); |
146 T visitParameter(Parameter node) => visitVariableDeclaration(node); | 145 T visitParameter(Parameter node) => visitVariableDeclaration(node); |
147 T visitThis(This node) => visitParameter(node); | 146 T visitThis(This node) => visitParameter(node); |
148 | 147 |
149 T visitNamedFunction(NamedFunction node) => visitExpression(node); | 148 T visitNamedFunction(NamedFunction node) => visitExpression(node); |
150 T visitFun(Fun node) => visitExpression(node); | 149 T visitFun(Fun node) => visitExpression(node); |
151 | 150 |
152 T visitToken(DeferredToken node) => visitExpression(node); | 151 T visitToken(DeferredToken node) => visitExpression(node); |
153 | 152 |
154 T visitDeferredExpression(DeferredExpression node) => visitExpression(node); | 153 T visitDeferredExpression(DeferredExpression node) => visitExpression(node); |
155 T visitDeferredNumber(DeferredNumber node) => visitToken(node); | 154 T visitDeferredNumber(DeferredNumber node) => visitToken(node); |
(...skipping 11 matching lines...) Expand all Loading... |
167 T visitName(Name node) => visitNode(node); | 166 T visitName(Name node) => visitNode(node); |
168 | 167 |
169 T visitArrayInitializer(ArrayInitializer node) => visitExpression(node); | 168 T visitArrayInitializer(ArrayInitializer node) => visitExpression(node); |
170 T visitArrayHole(ArrayHole node) => visitExpression(node); | 169 T visitArrayHole(ArrayHole node) => visitExpression(node); |
171 T visitObjectInitializer(ObjectInitializer node) => visitExpression(node); | 170 T visitObjectInitializer(ObjectInitializer node) => visitExpression(node); |
172 T visitProperty(Property node) => visitNode(node); | 171 T visitProperty(Property node) => visitNode(node); |
173 T visitRegExpLiteral(RegExpLiteral node) => visitExpression(node); | 172 T visitRegExpLiteral(RegExpLiteral node) => visitExpression(node); |
174 | 173 |
175 T visitInterpolatedNode(InterpolatedNode node) => visitNode(node); | 174 T visitInterpolatedNode(InterpolatedNode node) => visitNode(node); |
176 | 175 |
177 T visitInterpolatedExpression(InterpolatedExpression node) | 176 T visitInterpolatedExpression(InterpolatedExpression node) => |
178 => visitInterpolatedNode(node); | 177 visitInterpolatedNode(node); |
179 T visitInterpolatedLiteral(InterpolatedLiteral node) | 178 T visitInterpolatedLiteral(InterpolatedLiteral node) => |
180 => visitInterpolatedNode(node); | 179 visitInterpolatedNode(node); |
181 T visitInterpolatedParameter(InterpolatedParameter node) | 180 T visitInterpolatedParameter(InterpolatedParameter node) => |
182 => visitInterpolatedNode(node); | 181 visitInterpolatedNode(node); |
183 T visitInterpolatedSelector(InterpolatedSelector node) | 182 T visitInterpolatedSelector(InterpolatedSelector node) => |
184 => visitInterpolatedNode(node); | 183 visitInterpolatedNode(node); |
185 T visitInterpolatedStatement(InterpolatedStatement node) | 184 T visitInterpolatedStatement(InterpolatedStatement node) => |
186 => visitInterpolatedNode(node); | 185 visitInterpolatedNode(node); |
187 T visitInterpolatedDeclaration(InterpolatedDeclaration node) { | 186 T visitInterpolatedDeclaration(InterpolatedDeclaration node) { |
188 return visitInterpolatedNode(node); | 187 return visitInterpolatedNode(node); |
189 } | 188 } |
190 | 189 |
191 // Ignore comments by default. | 190 // Ignore comments by default. |
192 T visitComment(Comment node) => null; | 191 T visitComment(Comment node) => null; |
193 | 192 |
194 T visitAwait(Await node) => visitExpression(node); | 193 T visitAwait(Await node) => visitExpression(node); |
195 T visitDartYield(DartYield node) => visitStatement(node); | 194 T visitDartYield(DartYield node) => visitStatement(node); |
196 } | 195 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 } | 236 } |
238 | 237 |
239 class Program extends Node { | 238 class Program extends Node { |
240 final List<Statement> body; | 239 final List<Statement> body; |
241 Program(this.body); | 240 Program(this.body); |
242 | 241 |
243 accept(NodeVisitor visitor) => visitor.visitProgram(this); | 242 accept(NodeVisitor visitor) => visitor.visitProgram(this); |
244 void visitChildren(NodeVisitor visitor) { | 243 void visitChildren(NodeVisitor visitor) { |
245 for (Statement statement in body) statement.accept(visitor); | 244 for (Statement statement in body) statement.accept(visitor); |
246 } | 245 } |
| 246 |
247 Program _clone() => new Program(body); | 247 Program _clone() => new Program(body); |
248 } | 248 } |
249 | 249 |
250 abstract class Statement extends Node { | 250 abstract class Statement extends Node { |
251 Statement toStatement() => this; | 251 Statement toStatement() => this; |
252 } | 252 } |
253 | 253 |
254 class Block extends Statement { | 254 class Block extends Statement { |
255 final List<Statement> statements; | 255 final List<Statement> statements; |
256 Block(this.statements); | 256 Block(this.statements); |
257 Block.empty() : this.statements = <Statement>[]; | 257 Block.empty() : this.statements = <Statement>[]; |
258 | 258 |
259 accept(NodeVisitor visitor) => visitor.visitBlock(this); | 259 accept(NodeVisitor visitor) => visitor.visitBlock(this); |
260 void visitChildren(NodeVisitor visitor) { | 260 void visitChildren(NodeVisitor visitor) { |
261 for (Statement statement in statements) statement.accept(visitor); | 261 for (Statement statement in statements) statement.accept(visitor); |
262 } | 262 } |
| 263 |
263 Block _clone() => new Block(statements); | 264 Block _clone() => new Block(statements); |
264 } | 265 } |
265 | 266 |
266 class ExpressionStatement extends Statement { | 267 class ExpressionStatement extends Statement { |
267 final Expression expression; | 268 final Expression expression; |
268 ExpressionStatement(this.expression) { | 269 ExpressionStatement(this.expression) { |
269 assert(this.expression != null); | 270 assert(this.expression != null); |
270 } | 271 } |
271 | 272 |
272 accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this); | 273 accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this); |
273 void visitChildren(NodeVisitor visitor) { expression.accept(visitor); } | 274 void visitChildren(NodeVisitor visitor) { |
| 275 expression.accept(visitor); |
| 276 } |
| 277 |
274 ExpressionStatement _clone() => new ExpressionStatement(expression); | 278 ExpressionStatement _clone() => new ExpressionStatement(expression); |
275 } | 279 } |
276 | 280 |
277 class EmptyStatement extends Statement { | 281 class EmptyStatement extends Statement { |
278 EmptyStatement(); | 282 EmptyStatement(); |
279 | 283 |
280 accept(NodeVisitor visitor) => visitor.visitEmptyStatement(this); | 284 accept(NodeVisitor visitor) => visitor.visitEmptyStatement(this); |
281 void visitChildren(NodeVisitor visitor) {} | 285 void visitChildren(NodeVisitor visitor) {} |
282 EmptyStatement _clone() => new EmptyStatement(); | 286 EmptyStatement _clone() => new EmptyStatement(); |
283 } | 287 } |
284 | 288 |
285 class If extends Statement { | 289 class If extends Statement { |
286 final Expression condition; | 290 final Expression condition; |
287 final Statement then; | 291 final Statement then; |
288 final Statement otherwise; | 292 final Statement otherwise; |
289 | 293 |
290 If(this.condition, this.then, this.otherwise); | 294 If(this.condition, this.then, this.otherwise); |
291 If.noElse(this.condition, this.then) : this.otherwise = new EmptyStatement(); | 295 If.noElse(this.condition, this.then) : this.otherwise = new EmptyStatement(); |
292 | 296 |
293 bool get hasElse => otherwise is !EmptyStatement; | 297 bool get hasElse => otherwise is! EmptyStatement; |
294 | 298 |
295 accept(NodeVisitor visitor) => visitor.visitIf(this); | 299 accept(NodeVisitor visitor) => visitor.visitIf(this); |
296 | 300 |
297 void visitChildren(NodeVisitor visitor) { | 301 void visitChildren(NodeVisitor visitor) { |
298 condition.accept(visitor); | 302 condition.accept(visitor); |
299 then.accept(visitor); | 303 then.accept(visitor); |
300 otherwise.accept(visitor); | 304 otherwise.accept(visitor); |
301 } | 305 } |
302 | 306 |
303 If _clone() => new If(condition, then, otherwise); | 307 If _clone() => new If(condition, then, otherwise); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 | 374 |
371 void visitChildren(NodeVisitor visitor) { | 375 void visitChildren(NodeVisitor visitor) { |
372 body.accept(visitor); | 376 body.accept(visitor); |
373 condition.accept(visitor); | 377 condition.accept(visitor); |
374 } | 378 } |
375 | 379 |
376 Do _clone() => new Do(body, condition); | 380 Do _clone() => new Do(body, condition); |
377 } | 381 } |
378 | 382 |
379 class Continue extends Statement { | 383 class Continue extends Statement { |
380 final String targetLabel; // Can be null. | 384 final String targetLabel; // Can be null. |
381 | 385 |
382 Continue(this.targetLabel); | 386 Continue(this.targetLabel); |
383 | 387 |
384 accept(NodeVisitor visitor) => visitor.visitContinue(this); | 388 accept(NodeVisitor visitor) => visitor.visitContinue(this); |
385 void visitChildren(NodeVisitor visitor) {} | 389 void visitChildren(NodeVisitor visitor) {} |
386 | 390 |
387 Continue _clone() => new Continue(targetLabel); | 391 Continue _clone() => new Continue(targetLabel); |
388 } | 392 } |
389 | 393 |
390 class Break extends Statement { | 394 class Break extends Statement { |
391 final String targetLabel; // Can be null. | 395 final String targetLabel; // Can be null. |
392 | 396 |
393 Break(this.targetLabel); | 397 Break(this.targetLabel); |
394 | 398 |
395 accept(NodeVisitor visitor) => visitor.visitBreak(this); | 399 accept(NodeVisitor visitor) => visitor.visitBreak(this); |
396 void visitChildren(NodeVisitor visitor) {} | 400 void visitChildren(NodeVisitor visitor) {} |
397 | 401 |
398 Break _clone() => new Break(targetLabel); | 402 Break _clone() => new Break(targetLabel); |
399 } | 403 } |
400 | 404 |
401 class Return extends Statement { | 405 class Return extends Statement { |
402 final Expression value; // Can be null. | 406 final Expression value; // Can be null. |
403 | 407 |
404 Return([this.value = null]); | 408 Return([this.value = null]); |
405 | 409 |
406 accept(NodeVisitor visitor) => visitor.visitReturn(this); | 410 accept(NodeVisitor visitor) => visitor.visitReturn(this); |
407 | 411 |
408 void visitChildren(NodeVisitor visitor) { | 412 void visitChildren(NodeVisitor visitor) { |
409 if (value != null) value.accept(visitor); | 413 if (value != null) value.accept(visitor); |
410 } | 414 } |
411 | 415 |
412 Return _clone() => new Return(value); | 416 Return _clone() => new Return(value); |
413 } | 417 } |
414 | 418 |
415 class Throw extends Statement { | 419 class Throw extends Statement { |
416 final Expression expression; | 420 final Expression expression; |
417 | 421 |
418 Throw(this.expression); | 422 Throw(this.expression); |
419 | 423 |
420 accept(NodeVisitor visitor) => visitor.visitThrow(this); | 424 accept(NodeVisitor visitor) => visitor.visitThrow(this); |
421 | 425 |
422 void visitChildren(NodeVisitor visitor) { | 426 void visitChildren(NodeVisitor visitor) { |
423 expression.accept(visitor); | 427 expression.accept(visitor); |
424 } | 428 } |
425 | 429 |
426 Throw _clone() => new Throw(expression); | 430 Throw _clone() => new Throw(expression); |
427 } | 431 } |
428 | 432 |
429 class Try extends Statement { | 433 class Try extends Statement { |
430 final Block body; | 434 final Block body; |
431 final Catch catchPart; // Can be null if [finallyPart] is non-null. | 435 final Catch catchPart; // Can be null if [finallyPart] is non-null. |
432 final Block finallyPart; // Can be null if [catchPart] is non-null. | 436 final Block finallyPart; // Can be null if [catchPart] is non-null. |
433 | 437 |
434 Try(this.body, this.catchPart, this.finallyPart) { | 438 Try(this.body, this.catchPart, this.finallyPart) { |
435 assert(catchPart != null || finallyPart != null); | 439 assert(catchPart != null || finallyPart != null); |
436 } | 440 } |
437 | 441 |
438 accept(NodeVisitor visitor) => visitor.visitTry(this); | 442 accept(NodeVisitor visitor) => visitor.visitTry(this); |
439 | 443 |
440 void visitChildren(NodeVisitor visitor) { | 444 void visitChildren(NodeVisitor visitor) { |
441 body.accept(visitor); | 445 body.accept(visitor); |
442 if (catchPart != null) catchPart.accept(visitor); | 446 if (catchPart != null) catchPart.accept(visitor); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 | 545 |
542 LabeledStatement _clone() => new LabeledStatement(label, body); | 546 LabeledStatement _clone() => new LabeledStatement(label, body); |
543 } | 547 } |
544 | 548 |
545 class LiteralStatement extends Statement { | 549 class LiteralStatement extends Statement { |
546 final String code; | 550 final String code; |
547 | 551 |
548 LiteralStatement(this.code); | 552 LiteralStatement(this.code); |
549 | 553 |
550 accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this); | 554 accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this); |
551 void visitChildren(NodeVisitor visitor) { } | 555 void visitChildren(NodeVisitor visitor) {} |
552 | 556 |
553 LiteralStatement _clone() => new LiteralStatement(code); | 557 LiteralStatement _clone() => new LiteralStatement(code); |
554 } | 558 } |
555 | 559 |
556 // Not a real JavaScript node, but represents the yield statement from a dart | 560 // Not a real JavaScript node, but represents the yield statement from a dart |
557 // program translated to JavaScript. | 561 // program translated to JavaScript. |
558 class DartYield extends Statement { | 562 class DartYield extends Statement { |
559 final Expression expression; | 563 final Expression expression; |
560 | 564 |
561 final bool hasStar; | 565 final bool hasStar; |
562 | 566 |
563 DartYield(this.expression, this.hasStar); | 567 DartYield(this.expression, this.hasStar); |
564 | 568 |
565 accept(NodeVisitor visitor) => visitor.visitDartYield(this); | 569 accept(NodeVisitor visitor) => visitor.visitDartYield(this); |
566 | 570 |
567 void visitChildren(NodeVisitor visitor) { | 571 void visitChildren(NodeVisitor visitor) { |
568 expression.accept(visitor); | 572 expression.accept(visitor); |
569 } | 573 } |
570 | 574 |
571 DartYield _clone() => new DartYield(expression, hasStar); | 575 DartYield _clone() => new DartYield(expression, hasStar); |
572 } | 576 } |
573 | 577 |
574 abstract class Expression extends Node { | 578 abstract class Expression extends Node { |
575 int get precedenceLevel; | 579 int get precedenceLevel; |
576 | 580 |
577 Statement toStatement() => new ExpressionStatement(this); | 581 Statement toStatement() => new ExpressionStatement(this); |
578 } | 582 } |
579 | 583 |
580 abstract class Declaration implements VariableReference { | 584 abstract class Declaration implements VariableReference {} |
581 | |
582 } | |
583 | 585 |
584 /// An implementation of [Name] represents a potentially late bound name in | 586 /// An implementation of [Name] represents a potentially late bound name in |
585 /// the generated ast. | 587 /// the generated ast. |
586 /// | 588 /// |
587 /// While [Name] implements comparable, there is no requirement on the actual | 589 /// While [Name] implements comparable, there is no requirement on the actual |
588 /// implementation of [compareTo] other than that it needs to be stable. | 590 /// implementation of [compareTo] other than that it needs to be stable. |
589 /// In particular, there is no guarantee that implementations of [compareTo] | 591 /// In particular, there is no guarantee that implementations of [compareTo] |
590 /// will implement some form of lexicographic ordering like [String.compareTo]. | 592 /// will implement some form of lexicographic ordering like [String.compareTo]. |
591 abstract class Name extends Literal | 593 abstract class Name extends Literal |
592 implements Declaration, Parameter, Comparable { | 594 implements Declaration, Parameter, Comparable { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 } | 655 } |
654 } | 656 } |
655 | 657 |
656 VariableDeclarationList _clone() => new VariableDeclarationList(declarations); | 658 VariableDeclarationList _clone() => new VariableDeclarationList(declarations); |
657 | 659 |
658 int get precedenceLevel => EXPRESSION; | 660 int get precedenceLevel => EXPRESSION; |
659 } | 661 } |
660 | 662 |
661 class Assignment extends Expression { | 663 class Assignment extends Expression { |
662 final Expression leftHandSide; | 664 final Expression leftHandSide; |
663 final String op; // Null, if the assignment is not compound. | 665 final String op; // Null, if the assignment is not compound. |
664 final Expression value; // May be null, for [VariableInitialization]s. | 666 final Expression value; // May be null, for [VariableInitialization]s. |
665 | 667 |
666 Assignment(leftHandSide, value) | 668 Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value); |
667 : this.compound(leftHandSide, null, value); | |
668 // If `this.op == null` this will be a non-compound assignment. | 669 // If `this.op == null` this will be a non-compound assignment. |
669 Assignment.compound(this.leftHandSide, this.op, this.value); | 670 Assignment.compound(this.leftHandSide, this.op, this.value); |
670 | 671 |
671 int get precedenceLevel => ASSIGNMENT; | 672 int get precedenceLevel => ASSIGNMENT; |
672 | 673 |
673 bool get isCompound => op != null; | 674 bool get isCompound => op != null; |
674 | 675 |
675 accept(NodeVisitor visitor) => visitor.visitAssignment(this); | 676 accept(NodeVisitor visitor) => visitor.visitAssignment(this); |
676 | 677 |
677 void visitChildren(NodeVisitor visitor) { | 678 void visitChildren(NodeVisitor visitor) { |
678 leftHandSide.accept(visitor); | 679 leftHandSide.accept(visitor); |
679 if (value != null) value.accept(visitor); | 680 if (value != null) value.accept(visitor); |
680 } | 681 } |
681 | 682 |
682 Assignment _clone() => | 683 Assignment _clone() => new Assignment.compound(leftHandSide, op, value); |
683 new Assignment.compound(leftHandSide, op, value); | |
684 } | 684 } |
685 | 685 |
686 class VariableInitialization extends Assignment { | 686 class VariableInitialization extends Assignment { |
687 /** [value] may be null. */ | 687 /** [value] may be null. */ |
688 VariableInitialization(Declaration declaration, Expression value) | 688 VariableInitialization(Declaration declaration, Expression value) |
689 : super(declaration, value); | 689 : super(declaration, value); |
690 | 690 |
691 Declaration get declaration => leftHandSide; | 691 Declaration get declaration => leftHandSide; |
692 | 692 |
693 accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this); | 693 accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this); |
(...skipping 20 matching lines...) Expand all Loading... |
714 Conditional _clone() => new Conditional(condition, then, otherwise); | 714 Conditional _clone() => new Conditional(condition, then, otherwise); |
715 | 715 |
716 int get precedenceLevel => ASSIGNMENT; | 716 int get precedenceLevel => ASSIGNMENT; |
717 } | 717 } |
718 | 718 |
719 class Call extends Expression { | 719 class Call extends Expression { |
720 Expression target; | 720 Expression target; |
721 List<Expression> arguments; | 721 List<Expression> arguments; |
722 | 722 |
723 Call(this.target, this.arguments, | 723 Call(this.target, this.arguments, |
724 {JavaScriptNodeSourceInformation sourceInformation}) { | 724 {JavaScriptNodeSourceInformation sourceInformation}) { |
725 this._sourceInformation = sourceInformation; | 725 this._sourceInformation = sourceInformation; |
726 } | 726 } |
727 | 727 |
728 accept(NodeVisitor visitor) => visitor.visitCall(this); | 728 accept(NodeVisitor visitor) => visitor.visitCall(this); |
729 | 729 |
730 void visitChildren(NodeVisitor visitor) { | 730 void visitChildren(NodeVisitor visitor) { |
731 target.accept(visitor); | 731 target.accept(visitor); |
732 for (Expression arg in arguments) { | 732 for (Expression arg in arguments) { |
733 arg.accept(visitor); | 733 arg.accept(visitor); |
734 } | 734 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 Postfix(this.op, this.argument); | 833 Postfix(this.op, this.argument); |
834 | 834 |
835 accept(NodeVisitor visitor) => visitor.visitPostfix(this); | 835 accept(NodeVisitor visitor) => visitor.visitPostfix(this); |
836 | 836 |
837 Postfix _clone() => new Postfix(op, argument); | 837 Postfix _clone() => new Postfix(op, argument); |
838 | 838 |
839 void visitChildren(NodeVisitor visitor) { | 839 void visitChildren(NodeVisitor visitor) { |
840 argument.accept(visitor); | 840 argument.accept(visitor); |
841 } | 841 } |
842 | 842 |
843 | |
844 int get precedenceLevel => UNARY; | 843 int get precedenceLevel => UNARY; |
845 } | 844 } |
846 | 845 |
847 abstract class VariableReference extends Expression { | 846 abstract class VariableReference extends Expression { |
848 final String name; | 847 final String name; |
849 | 848 |
850 VariableReference(this.name) { | 849 VariableReference(this.name) { |
851 assert(_identifierRE.hasMatch(name)); | 850 assert(_identifierRE.hasMatch(name)); |
852 } | 851 } |
853 static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$'); | 852 static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$'); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 final Fun function; | 894 final Fun function; |
896 | 895 |
897 NamedFunction(this.name, this.function); | 896 NamedFunction(this.name, this.function); |
898 | 897 |
899 accept(NodeVisitor visitor) => visitor.visitNamedFunction(this); | 898 accept(NodeVisitor visitor) => visitor.visitNamedFunction(this); |
900 | 899 |
901 void visitChildren(NodeVisitor visitor) { | 900 void visitChildren(NodeVisitor visitor) { |
902 name.accept(visitor); | 901 name.accept(visitor); |
903 function.accept(visitor); | 902 function.accept(visitor); |
904 } | 903 } |
| 904 |
905 NamedFunction _clone() => new NamedFunction(name, function); | 905 NamedFunction _clone() => new NamedFunction(name, function); |
906 | 906 |
907 int get precedenceLevel => LEFT_HAND_SIDE; | 907 int get precedenceLevel => LEFT_HAND_SIDE; |
908 } | 908 } |
909 | 909 |
910 class Fun extends Expression { | 910 class Fun extends Expression { |
911 final List<Parameter> params; | 911 final List<Parameter> params; |
912 final Block body; | 912 final Block body; |
913 final AsyncModifier asyncModifier; | 913 final AsyncModifier asyncModifier; |
914 | 914 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 accept(NodeVisitor visitor) => visitor.visitStringConcatenation(this); | 1067 accept(NodeVisitor visitor) => visitor.visitStringConcatenation(this); |
1068 | 1068 |
1069 void visitChildren(NodeVisitor visitor) { | 1069 void visitChildren(NodeVisitor visitor) { |
1070 for (Literal part in parts) part.accept(visitor); | 1070 for (Literal part in parts) part.accept(visitor); |
1071 } | 1071 } |
1072 | 1072 |
1073 StringConcatenation _clone() => new StringConcatenation(this.parts); | 1073 StringConcatenation _clone() => new StringConcatenation(this.parts); |
1074 } | 1074 } |
1075 | 1075 |
1076 class LiteralNumber extends Literal { | 1076 class LiteralNumber extends Literal { |
1077 final String value; // Must be a valid JavaScript number literal. | 1077 final String value; // Must be a valid JavaScript number literal. |
1078 | 1078 |
1079 LiteralNumber(this.value); | 1079 LiteralNumber(this.value); |
1080 | 1080 |
1081 int get precedenceLevel => value.startsWith('-') ? UNARY : PRIMARY; | 1081 int get precedenceLevel => value.startsWith('-') ? UNARY : PRIMARY; |
1082 | 1082 |
1083 accept(NodeVisitor visitor) => visitor.visitLiteralNumber(this); | 1083 accept(NodeVisitor visitor) => visitor.visitLiteralNumber(this); |
1084 LiteralNumber _clone() => new LiteralNumber(value); | 1084 LiteralNumber _clone() => new LiteralNumber(value); |
1085 } | 1085 } |
1086 | 1086 |
1087 class ArrayInitializer extends Expression { | 1087 class ArrayInitializer extends Expression { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 bool get isPositional => nameOrPosition is int; | 1163 bool get isPositional => nameOrPosition is int; |
1164 } | 1164 } |
1165 | 1165 |
1166 class InterpolatedExpression extends Expression with InterpolatedNode { | 1166 class InterpolatedExpression extends Expression with InterpolatedNode { |
1167 final nameOrPosition; | 1167 final nameOrPosition; |
1168 | 1168 |
1169 InterpolatedExpression(this.nameOrPosition); | 1169 InterpolatedExpression(this.nameOrPosition); |
1170 | 1170 |
1171 accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this); | 1171 accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this); |
1172 void visitChildren(NodeVisitor visitor) {} | 1172 void visitChildren(NodeVisitor visitor) {} |
1173 InterpolatedExpression _clone() => | 1173 InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition); |
1174 new InterpolatedExpression(nameOrPosition); | |
1175 | 1174 |
1176 int get precedenceLevel => PRIMARY; | 1175 int get precedenceLevel => PRIMARY; |
1177 } | 1176 } |
1178 | 1177 |
1179 class InterpolatedLiteral extends Literal with InterpolatedNode { | 1178 class InterpolatedLiteral extends Literal with InterpolatedNode { |
1180 final nameOrPosition; | 1179 final nameOrPosition; |
1181 | 1180 |
1182 InterpolatedLiteral(this.nameOrPosition); | 1181 InterpolatedLiteral(this.nameOrPosition); |
1183 | 1182 |
1184 accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this); | 1183 accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this); |
1185 void visitChildren(NodeVisitor visitor) {} | 1184 void visitChildren(NodeVisitor visitor) {} |
1186 InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition); | 1185 InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition); |
1187 } | 1186 } |
1188 | 1187 |
1189 class InterpolatedParameter extends Expression with InterpolatedNode | 1188 class InterpolatedParameter extends Expression |
| 1189 with InterpolatedNode |
1190 implements Parameter { | 1190 implements Parameter { |
1191 final nameOrPosition; | 1191 final nameOrPosition; |
1192 | 1192 |
1193 String get name { throw "InterpolatedParameter.name must not be invoked"; } | 1193 String get name { |
| 1194 throw "InterpolatedParameter.name must not be invoked"; |
| 1195 } |
| 1196 |
1194 bool get allowRename => false; | 1197 bool get allowRename => false; |
1195 | 1198 |
1196 InterpolatedParameter(this.nameOrPosition); | 1199 InterpolatedParameter(this.nameOrPosition); |
1197 | 1200 |
1198 accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this); | 1201 accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this); |
1199 void visitChildren(NodeVisitor visitor) {} | 1202 void visitChildren(NodeVisitor visitor) {} |
1200 InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition); | 1203 InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition); |
1201 | 1204 |
1202 int get precedenceLevel => PRIMARY; | 1205 int get precedenceLevel => PRIMARY; |
1203 } | 1206 } |
(...skipping 14 matching lines...) Expand all Loading... |
1218 final nameOrPosition; | 1221 final nameOrPosition; |
1219 | 1222 |
1220 InterpolatedStatement(this.nameOrPosition); | 1223 InterpolatedStatement(this.nameOrPosition); |
1221 | 1224 |
1222 accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this); | 1225 accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this); |
1223 void visitChildren(NodeVisitor visitor) {} | 1226 void visitChildren(NodeVisitor visitor) {} |
1224 InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition); | 1227 InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition); |
1225 } | 1228 } |
1226 | 1229 |
1227 class InterpolatedDeclaration extends Expression | 1230 class InterpolatedDeclaration extends Expression |
1228 with InterpolatedNode | 1231 with InterpolatedNode |
1229 implements Declaration { | 1232 implements Declaration { |
1230 final nameOrPosition; | 1233 final nameOrPosition; |
1231 | 1234 |
1232 InterpolatedDeclaration(this.nameOrPosition); | 1235 InterpolatedDeclaration(this.nameOrPosition); |
1233 | 1236 |
1234 accept(NodeVisitor visitor) => visitor.visitInterpolatedDeclaration(this); | 1237 accept(NodeVisitor visitor) => visitor.visitInterpolatedDeclaration(this); |
1235 void visitChildren(NodeVisitor visitor) {} | 1238 void visitChildren(NodeVisitor visitor) {} |
1236 InterpolatedDeclaration _clone() { | 1239 InterpolatedDeclaration _clone() { |
1237 return new InterpolatedDeclaration(nameOrPosition); | 1240 return new InterpolatedDeclaration(nameOrPosition); |
1238 } | 1241 } |
1239 | 1242 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1289 class Comment extends Statement { | 1292 class Comment extends Statement { |
1290 final String comment; | 1293 final String comment; |
1291 | 1294 |
1292 Comment(this.comment); | 1295 Comment(this.comment); |
1293 | 1296 |
1294 accept(NodeVisitor visitor) => visitor.visitComment(this); | 1297 accept(NodeVisitor visitor) => visitor.visitComment(this); |
1295 Comment _clone() => new Comment(comment); | 1298 Comment _clone() => new Comment(comment); |
1296 | 1299 |
1297 void visitChildren(NodeVisitor visitor) {} | 1300 void visitChildren(NodeVisitor visitor) {} |
1298 } | 1301 } |
OLD | NEW |