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

Side by Side Diff: pkg/js_ast/lib/src/nodes.dart

Issue 2969873002: Add NodeVisitor1 to js_ast (Closed)
Patch Set: Updated cf. comment Created 3 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 | « pkg/compiler/lib/src/js/rewrite_async.dart ('k') | no next file » | 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 return visitInterpolatedNode(node); 187 return visitInterpolatedNode(node);
188 } 188 }
189 189
190 // Ignore comments by default. 190 // Ignore comments by default.
191 T visitComment(Comment node) => null; 191 T visitComment(Comment node) => null;
192 192
193 T visitAwait(Await node) => visitExpression(node); 193 T visitAwait(Await node) => visitExpression(node);
194 T visitDartYield(DartYield node) => visitStatement(node); 194 T visitDartYield(DartYield node) => visitStatement(node);
195 } 195 }
196 196
197 abstract class NodeVisitor1<R, A> {
198 R visitProgram(Program node, A arg);
199
200 R visitBlock(Block node, A arg);
201 R visitExpressionStatement(ExpressionStatement node, A arg);
202 R visitEmptyStatement(EmptyStatement node, A arg);
203 R visitIf(If node, A arg);
204 R visitFor(For node, A arg);
205 R visitForIn(ForIn node, A arg);
206 R visitWhile(While node, A arg);
207 R visitDo(Do node, A arg);
208 R visitContinue(Continue node, A arg);
209 R visitBreak(Break node, A arg);
210 R visitReturn(Return node, A arg);
211 R visitThrow(Throw node, A arg);
212 R visitTry(Try node, A arg);
213 R visitCatch(Catch node, A arg);
214 R visitSwitch(Switch node, A arg);
215 R visitCase(Case node, A arg);
216 R visitDefault(Default node, A arg);
217 R visitFunctionDeclaration(FunctionDeclaration node, A arg);
218 R visitLabeledStatement(LabeledStatement node, A arg);
219 R visitLiteralStatement(LiteralStatement node, A arg);
220 R visitDartYield(DartYield node, A arg);
221
222 R visitLiteralExpression(LiteralExpression node, A arg);
223 R visitVariableDeclarationList(VariableDeclarationList node, A arg);
224 R visitAssignment(Assignment node, A arg);
225 R visitVariableInitialization(VariableInitialization node, A arg);
226 R visitConditional(Conditional cond, A arg);
227 R visitNew(New node, A arg);
228 R visitCall(Call node, A arg);
229 R visitBinary(Binary node, A arg);
230 R visitPrefix(Prefix node, A arg);
231 R visitPostfix(Postfix node, A arg);
232
233 R visitVariableUse(VariableUse node, A arg);
234 R visitThis(This node, A arg);
235 R visitVariableDeclaration(VariableDeclaration node, A arg);
236 R visitParameter(Parameter node, A arg);
237 R visitAccess(PropertyAccess node, A arg);
238
239 R visitNamedFunction(NamedFunction node, A arg);
240 R visitFun(Fun node, A arg);
241
242 R visitDeferredExpression(DeferredExpression node, A arg);
243 R visitDeferredNumber(DeferredNumber node, A arg);
244 R visitDeferredString(DeferredString node, A arg);
245
246 R visitLiteralBool(LiteralBool node, A arg);
247 R visitLiteralString(LiteralString node, A arg);
248 R visitLiteralNumber(LiteralNumber node, A arg);
249 R visitLiteralNull(LiteralNull node, A arg);
250
251 R visitStringConcatenation(StringConcatenation node, A arg);
252
253 R visitName(Name node, A arg);
254
255 R visitArrayInitializer(ArrayInitializer node, A arg);
256 R visitArrayHole(ArrayHole node, A arg);
257 R visitObjectInitializer(ObjectInitializer node, A arg);
258 R visitProperty(Property node, A arg);
259 R visitRegExpLiteral(RegExpLiteral node, A arg);
260
261 R visitAwait(Await node, A arg);
262
263 R visitComment(Comment node, A arg);
264
265 R visitInterpolatedExpression(InterpolatedExpression node, A arg);
266 R visitInterpolatedLiteral(InterpolatedLiteral node, A arg);
267 R visitInterpolatedParameter(InterpolatedParameter node, A arg);
268 R visitInterpolatedSelector(InterpolatedSelector node, A arg);
269 R visitInterpolatedStatement(InterpolatedStatement node, A arg);
270 R visitInterpolatedDeclaration(InterpolatedDeclaration node, A arg);
271 }
272
273 class BaseVisitor1<R, A> implements NodeVisitor1<R, A> {
274 const BaseVisitor1();
275
276 R visitNode(Node node, A arg) {
277 node.visitChildren1(this, arg);
278 return null;
279 }
280
281 R visitProgram(Program node, A arg) => visitNode(node, arg);
282
283 R visitStatement(Statement node, A arg) => visitNode(node, arg);
284 R visitLoop(Loop node, A arg) => visitStatement(node, arg);
285 R visitJump(Statement node, A arg) => visitStatement(node, arg);
286
287 R visitBlock(Block node, A arg) => visitStatement(node, arg);
288 R visitExpressionStatement(ExpressionStatement node, A arg) =>
289 visitStatement(node, arg);
290 R visitEmptyStatement(EmptyStatement node, A arg) =>
291 visitStatement(node, arg);
292 R visitIf(If node, A arg) => visitStatement(node, arg);
293 R visitFor(For node, A arg) => visitLoop(node, arg);
294 R visitForIn(ForIn node, A arg) => visitLoop(node, arg);
295 R visitWhile(While node, A arg) => visitLoop(node, arg);
296 R visitDo(Do node, A arg) => visitLoop(node, arg);
297 R visitContinue(Continue node, A arg) => visitJump(node, arg);
298 R visitBreak(Break node, A arg) => visitJump(node, arg);
299 R visitReturn(Return node, A arg) => visitJump(node, arg);
300 R visitThrow(Throw node, A arg) => visitJump(node, arg);
301 R visitTry(Try node, A arg) => visitStatement(node, arg);
302 R visitSwitch(Switch node, A arg) => visitStatement(node, arg);
303 R visitFunctionDeclaration(FunctionDeclaration node, A arg) =>
304 visitStatement(node, arg);
305 R visitLabeledStatement(LabeledStatement node, A arg) =>
306 visitStatement(node, arg);
307 R visitLiteralStatement(LiteralStatement node, A arg) =>
308 visitStatement(node, arg);
309
310 R visitCatch(Catch node, A arg) => visitNode(node, arg);
311 R visitCase(Case node, A arg) => visitNode(node, arg);
312 R visitDefault(Default node, A arg) => visitNode(node, arg);
313
314 R visitExpression(Expression node, A arg) => visitNode(node, arg);
315 R visitVariableReference(VariableReference node, A arg) =>
316 visitExpression(node, arg);
317
318 R visitLiteralExpression(LiteralExpression node, A arg) =>
319 visitExpression(node, arg);
320 R visitVariableDeclarationList(VariableDeclarationList node, A arg) =>
321 visitExpression(node, arg);
322 R visitAssignment(Assignment node, A arg) => visitExpression(node, arg);
323 R visitVariableInitialization(VariableInitialization node, A arg) {
324 if (node.value != null) {
325 return visitAssignment(node, arg);
326 } else {
327 return visitExpression(node, arg);
328 }
329 }
330
331 R visitConditional(Conditional node, A arg) => visitExpression(node, arg);
332 R visitNew(New node, A arg) => visitExpression(node, arg);
333 R visitCall(Call node, A arg) => visitExpression(node, arg);
334 R visitBinary(Binary node, A arg) => visitExpression(node, arg);
335 R visitPrefix(Prefix node, A arg) => visitExpression(node, arg);
336 R visitPostfix(Postfix node, A arg) => visitExpression(node, arg);
337 R visitAccess(PropertyAccess node, A arg) => visitExpression(node, arg);
338
339 R visitVariableUse(VariableUse node, A arg) =>
340 visitVariableReference(node, arg);
341 R visitVariableDeclaration(VariableDeclaration node, A arg) =>
342 visitVariableReference(node, arg);
343 R visitParameter(Parameter node, A arg) =>
344 visitVariableDeclaration(node, arg);
345 R visitThis(This node, A arg) => visitParameter(node, arg);
346
347 R visitNamedFunction(NamedFunction node, A arg) => visitExpression(node, arg);
348 R visitFun(Fun node, A arg) => visitExpression(node, arg);
349
350 R visitToken(DeferredToken node, A arg) => visitExpression(node, arg);
351
352 R visitDeferredExpression(DeferredExpression node, A arg) =>
353 visitExpression(node, arg);
354 R visitDeferredNumber(DeferredNumber node, A arg) => visitToken(node, arg);
355 R visitDeferredString(DeferredString node, A arg) => visitToken(node, arg);
356
357 R visitLiteral(Literal node, A arg) => visitExpression(node, arg);
358
359 R visitLiteralBool(LiteralBool node, A arg) => visitLiteral(node, arg);
360 R visitLiteralString(LiteralString node, A arg) => visitLiteral(node, arg);
361 R visitLiteralNumber(LiteralNumber node, A arg) => visitLiteral(node, arg);
362 R visitLiteralNull(LiteralNull node, A arg) => visitLiteral(node, arg);
363
364 R visitStringConcatenation(StringConcatenation node, A arg) =>
365 visitLiteral(node, arg);
366
367 R visitName(Name node, A arg) => visitNode(node, arg);
368
369 R visitArrayInitializer(ArrayInitializer node, A arg) =>
370 visitExpression(node, arg);
371 R visitArrayHole(ArrayHole node, A arg) => visitExpression(node, arg);
372 R visitObjectInitializer(ObjectInitializer node, A arg) =>
373 visitExpression(node, arg);
374 R visitProperty(Property node, A arg) => visitNode(node, arg);
375 R visitRegExpLiteral(RegExpLiteral node, A arg) => visitExpression(node, arg);
376
377 R visitInterpolatedNode(InterpolatedNode node, A arg) => visitNode(node, arg);
378
379 R visitInterpolatedExpression(InterpolatedExpression node, A arg) =>
380 visitInterpolatedNode(node, arg);
381 R visitInterpolatedLiteral(InterpolatedLiteral node, A arg) =>
382 visitInterpolatedNode(node, arg);
383 R visitInterpolatedParameter(InterpolatedParameter node, A arg) =>
384 visitInterpolatedNode(node, arg);
385 R visitInterpolatedSelector(InterpolatedSelector node, A arg) =>
386 visitInterpolatedNode(node, arg);
387 R visitInterpolatedStatement(InterpolatedStatement node, A arg) =>
388 visitInterpolatedNode(node, arg);
389 R visitInterpolatedDeclaration(InterpolatedDeclaration node, A arg) {
390 return visitInterpolatedNode(node, arg);
391 }
392
393 // Ignore comments by default.
394 R visitComment(Comment node, A arg) => null;
395
396 R visitAwait(Await node, A arg) => visitExpression(node, arg);
397 R visitDartYield(DartYield node, A arg) => visitStatement(node, arg);
398 }
399
197 /// This tag interface has no behaviour but must be implemented by any class 400 /// This tag interface has no behaviour but must be implemented by any class
198 /// that is to be stored on a [Node] as source information. 401 /// that is to be stored on a [Node] as source information.
199 abstract class JavaScriptNodeSourceInformation { 402 abstract class JavaScriptNodeSourceInformation {
200 const JavaScriptNodeSourceInformation(); 403 const JavaScriptNodeSourceInformation();
201 } 404 }
202 405
203 abstract class Node { 406 abstract class Node {
204 JavaScriptNodeSourceInformation get sourceInformation => _sourceInformation; 407 JavaScriptNodeSourceInformation get sourceInformation => _sourceInformation;
205 408
206 JavaScriptNodeSourceInformation _sourceInformation; 409 JavaScriptNodeSourceInformation _sourceInformation;
207 410
208 accept(NodeVisitor visitor); 411 T accept<T>(NodeVisitor<T> visitor);
209 void visitChildren(NodeVisitor visitor); 412 void visitChildren<T>(NodeVisitor<T> visitor);
413
414 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg);
415 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg);
210 416
211 // Shallow clone of node. Does not clone positions since the only use of this 417 // Shallow clone of node. Does not clone positions since the only use of this
212 // private method is create a copy with a new position. 418 // private method is create a copy with a new position.
213 Node _clone(); 419 Node _clone();
214 420
215 // Returns a node equivalent to [this], but with new source position and end 421 // Returns a node equivalent to [this], but with new source position and end
216 // source position. 422 // source position.
217 Node withSourceInformation( 423 Node withSourceInformation(
218 JavaScriptNodeSourceInformation sourceInformation) { 424 JavaScriptNodeSourceInformation sourceInformation) {
219 if (sourceInformation == _sourceInformation) { 425 if (sourceInformation == _sourceInformation) {
(...skipping 14 matching lines...) Expand all
234 throw new UnsupportedError('toStatement'); 440 throw new UnsupportedError('toStatement');
235 } 441 }
236 442
237 String debugPrint() => DebugPrint(this); 443 String debugPrint() => DebugPrint(this);
238 } 444 }
239 445
240 class Program extends Node { 446 class Program extends Node {
241 final List<Statement> body; 447 final List<Statement> body;
242 Program(this.body); 448 Program(this.body);
243 449
244 accept(NodeVisitor visitor) => visitor.visitProgram(this); 450 T accept<T>(NodeVisitor<T> visitor) => visitor.visitProgram(this);
245 void visitChildren(NodeVisitor visitor) { 451
452 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
453 visitor.visitProgram(this, arg);
454
455 void visitChildren<T>(NodeVisitor<T> visitor) {
246 for (Statement statement in body) statement.accept(visitor); 456 for (Statement statement in body) statement.accept(visitor);
247 } 457 }
248 458
459 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
460 for (Statement statement in body) statement.accept1(visitor, arg);
461 }
462
249 Program _clone() => new Program(body); 463 Program _clone() => new Program(body);
250 } 464 }
251 465
252 abstract class Statement extends Node { 466 abstract class Statement extends Node {
253 Statement toStatement() => this; 467 Statement toStatement() => this;
254 } 468 }
255 469
256 class Block extends Statement { 470 class Block extends Statement {
257 final List<Statement> statements; 471 final List<Statement> statements;
472
258 Block(this.statements); 473 Block(this.statements);
474
259 Block.empty() : this.statements = <Statement>[]; 475 Block.empty() : this.statements = <Statement>[];
260 476
261 accept(NodeVisitor visitor) => visitor.visitBlock(this); 477 T accept<T>(NodeVisitor<T> visitor) => visitor.visitBlock(this);
262 void visitChildren(NodeVisitor visitor) { 478
479 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
480 visitor.visitBlock(this, arg);
481
482 void visitChildren<T>(NodeVisitor<T> visitor) {
263 for (Statement statement in statements) statement.accept(visitor); 483 for (Statement statement in statements) statement.accept(visitor);
264 } 484 }
265 485
486 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
487 for (Statement statement in statements) statement.accept1(visitor, arg);
488 }
489
266 Block _clone() => new Block(statements); 490 Block _clone() => new Block(statements);
267 } 491 }
268 492
269 class ExpressionStatement extends Statement { 493 class ExpressionStatement extends Statement {
270 final Expression expression; 494 final Expression expression;
495
271 ExpressionStatement(this.expression) { 496 ExpressionStatement(this.expression) {
272 assert(this.expression != null); 497 assert(this.expression != null);
273 } 498 }
274 499
275 accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this); 500 T accept<T>(NodeVisitor<T> visitor) => visitor.visitExpressionStatement(this);
276 void visitChildren(NodeVisitor visitor) { 501
502 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
503 visitor.visitExpressionStatement(this, arg);
504
505 void visitChildren<T>(NodeVisitor<T> visitor) {
277 expression.accept(visitor); 506 expression.accept(visitor);
278 } 507 }
279 508
509 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
510 expression.accept1(visitor, arg);
511 }
512
280 ExpressionStatement _clone() => new ExpressionStatement(expression); 513 ExpressionStatement _clone() => new ExpressionStatement(expression);
281 } 514 }
282 515
283 class EmptyStatement extends Statement { 516 class EmptyStatement extends Statement {
284 EmptyStatement(); 517 EmptyStatement();
285 518
286 accept(NodeVisitor visitor) => visitor.visitEmptyStatement(this); 519 T accept<T>(NodeVisitor<T> visitor) => visitor.visitEmptyStatement(this);
287 void visitChildren(NodeVisitor visitor) {} 520
521 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
522 visitor.visitEmptyStatement(this, arg);
523
524 void visitChildren<T>(NodeVisitor<T> visitor) {}
525
526 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
527
288 EmptyStatement _clone() => new EmptyStatement(); 528 EmptyStatement _clone() => new EmptyStatement();
289 } 529 }
290 530
291 class If extends Statement { 531 class If extends Statement {
292 final Expression condition; 532 final Expression condition;
293 final Statement then; 533 final Statement then;
294 final Statement otherwise; 534 final Statement otherwise;
295 535
296 If(this.condition, this.then, this.otherwise); 536 If(this.condition, this.then, this.otherwise);
537
297 If.noElse(this.condition, this.then) : this.otherwise = new EmptyStatement(); 538 If.noElse(this.condition, this.then) : this.otherwise = new EmptyStatement();
298 539
299 bool get hasElse => otherwise is! EmptyStatement; 540 bool get hasElse => otherwise is! EmptyStatement;
300 541
301 accept(NodeVisitor visitor) => visitor.visitIf(this); 542 T accept<T>(NodeVisitor<T> visitor) => visitor.visitIf(this);
302 543
303 void visitChildren(NodeVisitor visitor) { 544 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
545 visitor.visitIf(this, arg);
546
547 void visitChildren<T>(NodeVisitor<T> visitor) {
304 condition.accept(visitor); 548 condition.accept(visitor);
305 then.accept(visitor); 549 then.accept(visitor);
306 otherwise.accept(visitor); 550 otherwise.accept(visitor);
307 } 551 }
308 552
553 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
554 condition.accept1(visitor, arg);
555 then.accept1(visitor, arg);
556 otherwise.accept1(visitor, arg);
557 }
558
309 If _clone() => new If(condition, then, otherwise); 559 If _clone() => new If(condition, then, otherwise);
310 } 560 }
311 561
312 abstract class Loop extends Statement { 562 abstract class Loop extends Statement {
313 final Statement body; 563 final Statement body;
564
314 Loop(this.body); 565 Loop(this.body);
315 } 566 }
316 567
317 class For extends Loop { 568 class For extends Loop {
318 final Expression init; 569 final Expression init;
319 final Expression condition; 570 final Expression condition;
320 final Expression update; 571 final Expression update;
321 572
322 For(this.init, this.condition, this.update, Statement body) : super(body); 573 For(this.init, this.condition, this.update, Statement body) : super(body);
323 574
324 accept(NodeVisitor visitor) => visitor.visitFor(this); 575 T accept<T>(NodeVisitor<T> visitor) => visitor.visitFor(this);
325 576
326 void visitChildren(NodeVisitor visitor) { 577 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
578 visitor.visitFor(this, arg);
579
580 void visitChildren<T>(NodeVisitor<T> visitor) {
327 if (init != null) init.accept(visitor); 581 if (init != null) init.accept(visitor);
328 if (condition != null) condition.accept(visitor); 582 if (condition != null) condition.accept(visitor);
329 if (update != null) update.accept(visitor); 583 if (update != null) update.accept(visitor);
330 body.accept(visitor); 584 body.accept(visitor);
331 } 585 }
332 586
587 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
588 if (init != null) init.accept1(visitor, arg);
589 if (condition != null) condition.accept1(visitor, arg);
590 if (update != null) update.accept1(visitor, arg);
591 body.accept1(visitor, arg);
592 }
593
333 For _clone() => new For(init, condition, update, body); 594 For _clone() => new For(init, condition, update, body);
334 } 595 }
335 596
336 class ForIn extends Loop { 597 class ForIn extends Loop {
337 // Note that [VariableDeclarationList] is a subclass of [Expression]. 598 // Note that [VariableDeclarationList] is a subclass of [Expression].
338 // Therefore we can type the leftHandSide as [Expression]. 599 // Therefore we can type the leftHandSide as [Expression].
339 final Expression leftHandSide; 600 final Expression leftHandSide;
340 final Expression object; 601 final Expression object;
341 602
342 ForIn(this.leftHandSide, this.object, Statement body) : super(body); 603 ForIn(this.leftHandSide, this.object, Statement body) : super(body);
343 604
344 accept(NodeVisitor visitor) => visitor.visitForIn(this); 605 T accept<T>(NodeVisitor<T> visitor) => visitor.visitForIn(this);
345 606
346 void visitChildren(NodeVisitor visitor) { 607 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
608 visitor.visitForIn(this, arg);
609
610 void visitChildren<T>(NodeVisitor<T> visitor) {
347 leftHandSide.accept(visitor); 611 leftHandSide.accept(visitor);
348 object.accept(visitor); 612 object.accept(visitor);
349 body.accept(visitor); 613 body.accept(visitor);
350 } 614 }
351 615
616 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
617 leftHandSide.accept1(visitor, arg);
618 object.accept1(visitor, arg);
619 body.accept1(visitor, arg);
620 }
621
352 ForIn _clone() => new ForIn(leftHandSide, object, body); 622 ForIn _clone() => new ForIn(leftHandSide, object, body);
353 } 623 }
354 624
355 class While extends Loop { 625 class While extends Loop {
356 final Node condition; 626 final Node condition;
357 627
358 While(this.condition, Statement body) : super(body); 628 While(this.condition, Statement body) : super(body);
359 629
360 accept(NodeVisitor visitor) => visitor.visitWhile(this); 630 T accept<T>(NodeVisitor<T> visitor) => visitor.visitWhile(this);
361 631
362 void visitChildren(NodeVisitor visitor) { 632 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
633 visitor.visitWhile(this, arg);
634
635 void visitChildren<T>(NodeVisitor<T> visitor) {
363 condition.accept(visitor); 636 condition.accept(visitor);
364 body.accept(visitor); 637 body.accept(visitor);
365 } 638 }
366 639
640 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
641 condition.accept1(visitor, arg);
642 body.accept1(visitor, arg);
643 }
644
367 While _clone() => new While(condition, body); 645 While _clone() => new While(condition, body);
368 } 646 }
369 647
370 class Do extends Loop { 648 class Do extends Loop {
371 final Expression condition; 649 final Expression condition;
372 650
373 Do(Statement body, this.condition) : super(body); 651 Do(Statement body, this.condition) : super(body);
374 652
375 accept(NodeVisitor visitor) => visitor.visitDo(this); 653 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDo(this);
376 654
377 void visitChildren(NodeVisitor visitor) { 655 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
656 visitor.visitDo(this, arg);
657
658 void visitChildren<T>(NodeVisitor<T> visitor) {
378 body.accept(visitor); 659 body.accept(visitor);
379 condition.accept(visitor); 660 condition.accept(visitor);
380 } 661 }
381 662
663 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
664 body.accept1(visitor, arg);
665 condition.accept1(visitor, arg);
666 }
667
382 Do _clone() => new Do(body, condition); 668 Do _clone() => new Do(body, condition);
383 } 669 }
384 670
385 class Continue extends Statement { 671 class Continue extends Statement {
386 final String targetLabel; // Can be null. 672 final String targetLabel; // Can be null.
387 673
388 Continue(this.targetLabel); 674 Continue(this.targetLabel);
389 675
390 accept(NodeVisitor visitor) => visitor.visitContinue(this); 676 T accept<T>(NodeVisitor<T> visitor) => visitor.visitContinue(this);
391 void visitChildren(NodeVisitor visitor) {} 677
678 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
679 visitor.visitContinue(this, arg);
680
681 void visitChildren<T>(NodeVisitor<T> visitor) {}
682
683 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
392 684
393 Continue _clone() => new Continue(targetLabel); 685 Continue _clone() => new Continue(targetLabel);
394 } 686 }
395 687
396 class Break extends Statement { 688 class Break extends Statement {
397 final String targetLabel; // Can be null. 689 final String targetLabel; // Can be null.
398 690
399 Break(this.targetLabel); 691 Break(this.targetLabel);
400 692
401 accept(NodeVisitor visitor) => visitor.visitBreak(this); 693 T accept<T>(NodeVisitor<T> visitor) => visitor.visitBreak(this);
402 void visitChildren(NodeVisitor visitor) {} 694
695 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
696 visitor.visitBreak(this, arg);
697
698 void visitChildren<T>(NodeVisitor<T> visitor) {}
699
700 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
403 701
404 Break _clone() => new Break(targetLabel); 702 Break _clone() => new Break(targetLabel);
405 } 703 }
406 704
407 class Return extends Statement { 705 class Return extends Statement {
408 final Expression value; // Can be null. 706 final Expression value; // Can be null.
409 707
410 Return([this.value = null]); 708 Return([this.value = null]);
411 709
412 accept(NodeVisitor visitor) => visitor.visitReturn(this); 710 T accept<T>(NodeVisitor<T> visitor) => visitor.visitReturn(this);
413 711
414 void visitChildren(NodeVisitor visitor) { 712 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
713 visitor.visitReturn(this, arg);
714
715 void visitChildren<T>(NodeVisitor<T> visitor) {
415 if (value != null) value.accept(visitor); 716 if (value != null) value.accept(visitor);
416 } 717 }
417 718
719 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
720 if (value != null) value.accept1(visitor, arg);
721 }
722
418 Return _clone() => new Return(value); 723 Return _clone() => new Return(value);
419 } 724 }
420 725
421 class Throw extends Statement { 726 class Throw extends Statement {
422 final Expression expression; 727 final Expression expression;
423 728
424 Throw(this.expression); 729 Throw(this.expression);
425 730
426 accept(NodeVisitor visitor) => visitor.visitThrow(this); 731 T accept<T>(NodeVisitor<T> visitor) => visitor.visitThrow(this);
427 732
428 void visitChildren(NodeVisitor visitor) { 733 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
734 visitor.visitThrow(this, arg);
735
736 void visitChildren<T>(NodeVisitor<T> visitor) {
429 expression.accept(visitor); 737 expression.accept(visitor);
430 } 738 }
431 739
740 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
741 expression.accept1(visitor, arg);
742 }
743
432 Throw _clone() => new Throw(expression); 744 Throw _clone() => new Throw(expression);
433 } 745 }
434 746
435 class Try extends Statement { 747 class Try extends Statement {
436 final Block body; 748 final Block body;
437 final Catch catchPart; // Can be null if [finallyPart] is non-null. 749 final Catch catchPart; // Can be null if [finallyPart] is non-null.
438 final Block finallyPart; // Can be null if [catchPart] is non-null. 750 final Block finallyPart; // Can be null if [catchPart] is non-null.
439 751
440 Try(this.body, this.catchPart, this.finallyPart) { 752 Try(this.body, this.catchPart, this.finallyPart) {
441 assert(catchPart != null || finallyPart != null); 753 assert(catchPart != null || finallyPart != null);
442 } 754 }
443 755
444 accept(NodeVisitor visitor) => visitor.visitTry(this); 756 T accept<T>(NodeVisitor<T> visitor) => visitor.visitTry(this);
445 757
446 void visitChildren(NodeVisitor visitor) { 758 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
759 visitor.visitTry(this, arg);
760
761 void visitChildren<T>(NodeVisitor<T> visitor) {
447 body.accept(visitor); 762 body.accept(visitor);
448 if (catchPart != null) catchPart.accept(visitor); 763 if (catchPart != null) catchPart.accept(visitor);
449 if (finallyPart != null) finallyPart.accept(visitor); 764 if (finallyPart != null) finallyPart.accept(visitor);
450 } 765 }
451 766
767 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
768 body.accept1(visitor, arg);
769 if (catchPart != null) catchPart.accept1(visitor, arg);
770 if (finallyPart != null) finallyPart.accept1(visitor, arg);
771 }
772
452 Try _clone() => new Try(body, catchPart, finallyPart); 773 Try _clone() => new Try(body, catchPart, finallyPart);
453 } 774 }
454 775
455 class Catch extends Node { 776 class Catch extends Node {
456 final Declaration declaration; 777 final Declaration declaration;
457 final Block body; 778 final Block body;
458 779
459 Catch(this.declaration, this.body); 780 Catch(this.declaration, this.body);
460 781
461 accept(NodeVisitor visitor) => visitor.visitCatch(this); 782 T accept<T>(NodeVisitor<T> visitor) => visitor.visitCatch(this);
462 783
463 void visitChildren(NodeVisitor visitor) { 784 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
785 visitor.visitCatch(this, arg);
786
787 void visitChildren<T>(NodeVisitor<T> visitor) {
464 declaration.accept(visitor); 788 declaration.accept(visitor);
465 body.accept(visitor); 789 body.accept(visitor);
466 } 790 }
467 791
792 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
793 declaration.accept1(visitor, arg);
794 body.accept1(visitor, arg);
795 }
796
468 Catch _clone() => new Catch(declaration, body); 797 Catch _clone() => new Catch(declaration, body);
469 } 798 }
470 799
471 class Switch extends Statement { 800 class Switch extends Statement {
472 final Expression key; 801 final Expression key;
473 final List<SwitchClause> cases; 802 final List<SwitchClause> cases;
474 803
475 Switch(this.key, this.cases); 804 Switch(this.key, this.cases);
476 805
477 accept(NodeVisitor visitor) => visitor.visitSwitch(this); 806 T accept<T>(NodeVisitor<T> visitor) => visitor.visitSwitch(this);
478 807
479 void visitChildren(NodeVisitor visitor) { 808 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
809 visitor.visitSwitch(this, arg);
810
811 void visitChildren<T>(NodeVisitor<T> visitor) {
480 key.accept(visitor); 812 key.accept(visitor);
481 for (SwitchClause clause in cases) clause.accept(visitor); 813 for (SwitchClause clause in cases) clause.accept(visitor);
482 } 814 }
483 815
816 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
817 key.accept1(visitor, arg);
818 for (SwitchClause clause in cases) clause.accept1(visitor, arg);
819 }
820
484 Switch _clone() => new Switch(key, cases); 821 Switch _clone() => new Switch(key, cases);
485 } 822 }
486 823
487 abstract class SwitchClause extends Node { 824 abstract class SwitchClause extends Node {
488 final Block body; 825 final Block body;
489 826
490 SwitchClause(this.body); 827 SwitchClause(this.body);
491 } 828 }
492 829
493 class Case extends SwitchClause { 830 class Case extends SwitchClause {
494 final Expression expression; 831 final Expression expression;
495 832
496 Case(this.expression, Block body) : super(body); 833 Case(this.expression, Block body) : super(body);
497 834
498 accept(NodeVisitor visitor) => visitor.visitCase(this); 835 T accept<T>(NodeVisitor<T> visitor) => visitor.visitCase(this);
499 836
500 void visitChildren(NodeVisitor visitor) { 837 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
838 visitor.visitCase(this, arg);
839
840 void visitChildren<T>(NodeVisitor<T> visitor) {
501 expression.accept(visitor); 841 expression.accept(visitor);
502 body.accept(visitor); 842 body.accept(visitor);
503 } 843 }
504 844
845 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
846 expression.accept1(visitor, arg);
847 body.accept1(visitor, arg);
848 }
849
505 Case _clone() => new Case(expression, body); 850 Case _clone() => new Case(expression, body);
506 } 851 }
507 852
508 class Default extends SwitchClause { 853 class Default extends SwitchClause {
509 Default(Block body) : super(body); 854 Default(Block body) : super(body);
510 855
511 accept(NodeVisitor visitor) => visitor.visitDefault(this); 856 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDefault(this);
512 857
513 void visitChildren(NodeVisitor visitor) { 858 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
859 visitor.visitDefault(this, arg);
860
861 void visitChildren<T>(NodeVisitor<T> visitor) {
514 body.accept(visitor); 862 body.accept(visitor);
515 } 863 }
516 864
865 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
866 body.accept1(visitor, arg);
867 }
868
517 Default _clone() => new Default(body); 869 Default _clone() => new Default(body);
518 } 870 }
519 871
520 class FunctionDeclaration extends Statement { 872 class FunctionDeclaration extends Statement {
521 final Declaration name; 873 final Declaration name;
522 final Fun function; 874 final Fun function;
523 875
524 FunctionDeclaration(this.name, this.function); 876 FunctionDeclaration(this.name, this.function);
525 877
526 accept(NodeVisitor visitor) => visitor.visitFunctionDeclaration(this); 878 T accept<T>(NodeVisitor<T> visitor) => visitor.visitFunctionDeclaration(this);
527 879
528 void visitChildren(NodeVisitor visitor) { 880 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
881 visitor.visitFunctionDeclaration(this, arg);
882
883 void visitChildren<T>(NodeVisitor<T> visitor) {
529 name.accept(visitor); 884 name.accept(visitor);
530 function.accept(visitor); 885 function.accept(visitor);
531 } 886 }
532 887
888 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
889 name.accept1(visitor, arg);
890 function.accept1(visitor, arg);
891 }
892
533 FunctionDeclaration _clone() => new FunctionDeclaration(name, function); 893 FunctionDeclaration _clone() => new FunctionDeclaration(name, function);
534 } 894 }
535 895
536 class LabeledStatement extends Statement { 896 class LabeledStatement extends Statement {
537 final String label; 897 final String label;
538 final Statement body; 898 final Statement body;
539 899
540 LabeledStatement(this.label, this.body); 900 LabeledStatement(this.label, this.body);
541 901
542 accept(NodeVisitor visitor) => visitor.visitLabeledStatement(this); 902 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLabeledStatement(this);
543 903
544 void visitChildren(NodeVisitor visitor) { 904 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
905 visitor.visitLabeledStatement(this, arg);
906
907 void visitChildren<T>(NodeVisitor<T> visitor) {
545 body.accept(visitor); 908 body.accept(visitor);
546 } 909 }
547 910
911 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
912 body.accept1(visitor, arg);
913 }
914
548 LabeledStatement _clone() => new LabeledStatement(label, body); 915 LabeledStatement _clone() => new LabeledStatement(label, body);
549 } 916 }
550 917
551 class LiteralStatement extends Statement { 918 class LiteralStatement extends Statement {
552 final String code; 919 final String code;
553 920
554 LiteralStatement(this.code); 921 LiteralStatement(this.code);
555 922
556 accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this); 923 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralStatement(this);
557 void visitChildren(NodeVisitor visitor) {} 924
925 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
926 visitor.visitLiteralStatement(this, arg);
927
928 void visitChildren<T>(NodeVisitor<T> visitor) {}
929
930 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
558 931
559 LiteralStatement _clone() => new LiteralStatement(code); 932 LiteralStatement _clone() => new LiteralStatement(code);
560 } 933 }
561 934
562 // Not a real JavaScript node, but represents the yield statement from a dart 935 // Not a real JavaScript node, but represents the yield statement from a dart
563 // program translated to JavaScript. 936 // program translated to JavaScript.
564 class DartYield extends Statement { 937 class DartYield extends Statement {
565 final Expression expression; 938 final Expression expression;
566 939
567 final bool hasStar; 940 final bool hasStar;
568 941
569 DartYield(this.expression, this.hasStar); 942 DartYield(this.expression, this.hasStar);
570 943
571 accept(NodeVisitor visitor) => visitor.visitDartYield(this); 944 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDartYield(this);
572 945
573 void visitChildren(NodeVisitor visitor) { 946 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
947 visitor.visitDartYield(this, arg);
948
949 void visitChildren<T>(NodeVisitor<T> visitor) {
574 expression.accept(visitor); 950 expression.accept(visitor);
575 } 951 }
576 952
953 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
954 expression.accept1(visitor, arg);
955 }
956
577 DartYield _clone() => new DartYield(expression, hasStar); 957 DartYield _clone() => new DartYield(expression, hasStar);
578 } 958 }
579 959
580 abstract class Expression extends Node { 960 abstract class Expression extends Node {
581 int get precedenceLevel; 961 int get precedenceLevel;
582 962
583 Statement toStatement() => new ExpressionStatement(this); 963 Statement toStatement() => new ExpressionStatement(this);
584 } 964 }
585 965
586 abstract class Declaration implements VariableReference {} 966 abstract class Declaration implements VariableReference {}
587 967
588 /// An implementation of [Name] represents a potentially late bound name in 968 /// An implementation of [Name] represents a potentially late bound name in
589 /// the generated ast. 969 /// the generated ast.
590 /// 970 ///
591 /// While [Name] implements comparable, there is no requirement on the actual 971 /// While [Name] implements comparable, there is no requirement on the actual
592 /// implementation of [compareTo] other than that it needs to be stable. 972 /// implementation of [compareTo] other than that it needs to be stable.
593 /// In particular, there is no guarantee that implementations of [compareTo] 973 /// In particular, there is no guarantee that implementations of [compareTo]
594 /// will implement some form of lexicographic ordering like [String.compareTo]. 974 /// will implement some form of lexicographic ordering like [String.compareTo].
595 abstract class Name extends Literal 975 abstract class Name extends Literal
596 implements Declaration, Parameter, Comparable { 976 implements Declaration, Parameter, Comparable {
597 accept(NodeVisitor visitor) => visitor.visitName(this); 977 T accept<T>(NodeVisitor<T> visitor) => visitor.visitName(this);
978
979 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
980 visitor.visitName(this, arg);
598 981
599 /// Returns a unique [key] for this name. 982 /// Returns a unique [key] for this name.
600 /// 983 ///
601 /// The key is unrelated to the actual name and is not intended for human 984 /// The key is unrelated to the actual name and is not intended for human
602 /// consumption. As such, it might be long or cryptic. 985 /// consumption. As such, it might be long or cryptic.
603 String get key; 986 String get key;
604 987
605 bool get allowRename => false; 988 bool get allowRename => false;
606 } 989 }
607 990
608 class LiteralStringFromName extends LiteralString { 991 class LiteralStringFromName extends LiteralString {
609 Name name; 992 Name name;
610 993
611 LiteralStringFromName(this.name) : super(null); 994 LiteralStringFromName(this.name) : super(null);
612 995
613 String get value => '"${name.name}"'; 996 String get value => '"${name.name}"';
614 997
615 void visitChildren(NodeVisitor visitor) { 998 void visitChildren<T>(NodeVisitor<T> visitor) {
616 name.accept(visitor); 999 name.accept(visitor);
617 } 1000 }
1001
1002 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1003 name.accept1(visitor, arg);
1004 }
618 } 1005 }
619 1006
620 class LiteralExpression extends Expression { 1007 class LiteralExpression extends Expression {
621 final String template; 1008 final String template;
622 final List<Expression> inputs; 1009 final List<Expression> inputs;
623 1010
624 LiteralExpression(this.template) : inputs = const []; 1011 LiteralExpression(this.template) : inputs = const [];
1012
625 LiteralExpression.withData(this.template, this.inputs); 1013 LiteralExpression.withData(this.template, this.inputs);
626 1014
627 accept(NodeVisitor visitor) => visitor.visitLiteralExpression(this); 1015 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralExpression(this);
628 1016
629 void visitChildren(NodeVisitor visitor) { 1017 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1018 visitor.visitLiteralExpression(this, arg);
1019
1020 void visitChildren<T>(NodeVisitor<T> visitor) {
630 if (inputs != null) { 1021 if (inputs != null) {
631 for (Expression expr in inputs) expr.accept(visitor); 1022 for (Expression expr in inputs) expr.accept(visitor);
632 } 1023 }
633 } 1024 }
634 1025
1026 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1027 if (inputs != null) {
1028 for (Expression expr in inputs) expr.accept1(visitor, arg);
1029 }
1030 }
1031
635 LiteralExpression _clone() => 1032 LiteralExpression _clone() =>
636 new LiteralExpression.withData(template, inputs); 1033 new LiteralExpression.withData(template, inputs);
637 1034
638 // Code that uses JS must take care of operator precedences, and 1035 // Code that uses JS must take care of operator precedences, and
639 // put parenthesis if needed. 1036 // put parenthesis if needed.
640 int get precedenceLevel => PRIMARY; 1037 int get precedenceLevel => PRIMARY;
641 } 1038 }
642 1039
643 /** 1040 /**
644 * [VariableDeclarationList] is a subclass of [Expression] to simplify the 1041 * [VariableDeclarationList] is a subclass of [Expression] to simplify the
645 * AST. 1042 * AST.
646 */ 1043 */
647 class VariableDeclarationList extends Expression { 1044 class VariableDeclarationList extends Expression {
648 final List<VariableInitialization> declarations; 1045 final List<VariableInitialization> declarations;
649 1046
650 VariableDeclarationList(this.declarations); 1047 VariableDeclarationList(this.declarations);
651 1048
652 accept(NodeVisitor visitor) => visitor.visitVariableDeclarationList(this); 1049 T accept<T>(NodeVisitor<T> visitor) =>
1050 visitor.visitVariableDeclarationList(this);
653 1051
654 void visitChildren(NodeVisitor visitor) { 1052 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1053 visitor.visitVariableDeclarationList(this, arg);
1054
1055 void visitChildren<T>(NodeVisitor<T> visitor) {
655 for (VariableInitialization declaration in declarations) { 1056 for (VariableInitialization declaration in declarations) {
656 declaration.accept(visitor); 1057 declaration.accept(visitor);
657 } 1058 }
658 } 1059 }
659 1060
1061 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1062 for (VariableInitialization declaration in declarations) {
1063 declaration.accept1(visitor, arg);
1064 }
1065 }
1066
660 VariableDeclarationList _clone() => new VariableDeclarationList(declarations); 1067 VariableDeclarationList _clone() => new VariableDeclarationList(declarations);
661 1068
662 int get precedenceLevel => EXPRESSION; 1069 int get precedenceLevel => EXPRESSION;
663 } 1070 }
664 1071
665 class Assignment extends Expression { 1072 class Assignment extends Expression {
666 final Expression leftHandSide; 1073 final Expression leftHandSide;
667 final String op; // Null, if the assignment is not compound. 1074 final String op; // Null, if the assignment is not compound.
668 final Expression value; // May be null, for [VariableInitialization]s. 1075 final Expression value; // May be null, for [VariableInitialization]s.
669 1076
670 Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value); 1077 Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value);
1078
671 // If `this.op == null` this will be a non-compound assignment. 1079 // If `this.op == null` this will be a non-compound assignment.
672 Assignment.compound(this.leftHandSide, this.op, this.value); 1080 Assignment.compound(this.leftHandSide, this.op, this.value);
673 1081
674 int get precedenceLevel => ASSIGNMENT; 1082 int get precedenceLevel => ASSIGNMENT;
675 1083
676 bool get isCompound => op != null; 1084 bool get isCompound => op != null;
677 1085
678 accept(NodeVisitor visitor) => visitor.visitAssignment(this); 1086 T accept<T>(NodeVisitor<T> visitor) => visitor.visitAssignment(this);
679 1087
680 void visitChildren(NodeVisitor visitor) { 1088 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1089 visitor.visitAssignment(this, arg);
1090
1091 void visitChildren<T>(NodeVisitor<T> visitor) {
681 leftHandSide.accept(visitor); 1092 leftHandSide.accept(visitor);
682 if (value != null) value.accept(visitor); 1093 if (value != null) value.accept(visitor);
683 } 1094 }
684 1095
1096 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1097 leftHandSide.accept1(visitor, arg);
1098 if (value != null) value.accept1(visitor, arg);
1099 }
1100
685 Assignment _clone() => new Assignment.compound(leftHandSide, op, value); 1101 Assignment _clone() => new Assignment.compound(leftHandSide, op, value);
686 } 1102 }
687 1103
688 class VariableInitialization extends Assignment { 1104 class VariableInitialization extends Assignment {
689 /** [value] may be null. */ 1105 /** [value] may be null. */
690 VariableInitialization(Declaration declaration, Expression value) 1106 VariableInitialization(Declaration declaration, Expression value)
691 : super(declaration, value); 1107 : super(declaration, value);
692 1108
693 Declaration get declaration => leftHandSide; 1109 Declaration get declaration => leftHandSide;
694 1110
695 accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this); 1111 T accept<T>(NodeVisitor<T> visitor) =>
1112 visitor.visitVariableInitialization(this);
1113
1114 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1115 visitor.visitVariableInitialization(this, arg);
696 1116
697 VariableInitialization _clone() => 1117 VariableInitialization _clone() =>
698 new VariableInitialization(declaration, value); 1118 new VariableInitialization(declaration, value);
699 } 1119 }
700 1120
701 class Conditional extends Expression { 1121 class Conditional extends Expression {
702 final Expression condition; 1122 final Expression condition;
703 final Expression then; 1123 final Expression then;
704 final Expression otherwise; 1124 final Expression otherwise;
705 1125
706 Conditional(this.condition, this.then, this.otherwise); 1126 Conditional(this.condition, this.then, this.otherwise);
707 1127
708 accept(NodeVisitor visitor) => visitor.visitConditional(this); 1128 T accept<T>(NodeVisitor<T> visitor) => visitor.visitConditional(this);
709 1129
710 void visitChildren(NodeVisitor visitor) { 1130 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1131 visitor.visitConditional(this, arg);
1132
1133 void visitChildren<T>(NodeVisitor<T> visitor) {
711 condition.accept(visitor); 1134 condition.accept(visitor);
712 then.accept(visitor); 1135 then.accept(visitor);
713 otherwise.accept(visitor); 1136 otherwise.accept(visitor);
714 } 1137 }
715 1138
1139 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1140 condition.accept1(visitor, arg);
1141 then.accept1(visitor, arg);
1142 otherwise.accept1(visitor, arg);
1143 }
1144
716 Conditional _clone() => new Conditional(condition, then, otherwise); 1145 Conditional _clone() => new Conditional(condition, then, otherwise);
717 1146
718 int get precedenceLevel => ASSIGNMENT; 1147 int get precedenceLevel => ASSIGNMENT;
719 } 1148 }
720 1149
721 class Call extends Expression { 1150 class Call extends Expression {
722 Expression target; 1151 Expression target;
723 List<Expression> arguments; 1152 List<Expression> arguments;
724 1153
725 Call(this.target, this.arguments, 1154 Call(this.target, this.arguments,
726 {JavaScriptNodeSourceInformation sourceInformation}) { 1155 {JavaScriptNodeSourceInformation sourceInformation}) {
727 this._sourceInformation = sourceInformation; 1156 this._sourceInformation = sourceInformation;
728 } 1157 }
729 1158
730 accept(NodeVisitor visitor) => visitor.visitCall(this); 1159 T accept<T>(NodeVisitor<T> visitor) => visitor.visitCall(this);
731 1160
732 void visitChildren(NodeVisitor visitor) { 1161 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1162 visitor.visitCall(this, arg);
1163
1164 void visitChildren<T>(NodeVisitor<T> visitor) {
733 target.accept(visitor); 1165 target.accept(visitor);
734 for (Expression arg in arguments) { 1166 for (Expression arg in arguments) {
735 arg.accept(visitor); 1167 arg.accept(visitor);
736 } 1168 }
737 } 1169 }
738 1170
1171 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1172 target.accept1(visitor, arg);
1173 for (Expression arg in arguments) {
1174 arg.accept1(visitor, arg);
1175 }
1176 }
1177
739 Call _clone() => new Call(target, arguments); 1178 Call _clone() => new Call(target, arguments);
740 1179
741 int get precedenceLevel => CALL; 1180 int get precedenceLevel => CALL;
742 } 1181 }
743 1182
744 class New extends Call { 1183 class New extends Call {
745 New(Expression cls, List<Expression> arguments) : super(cls, arguments); 1184 New(Expression cls, List<Expression> arguments) : super(cls, arguments);
746 1185
747 accept(NodeVisitor visitor) => visitor.visitNew(this); 1186 T accept<T>(NodeVisitor<T> visitor) => visitor.visitNew(this);
1187
1188 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1189 visitor.visitNew(this, arg);
748 1190
749 New _clone() => new New(target, arguments); 1191 New _clone() => new New(target, arguments);
750 } 1192 }
751 1193
752 class Binary extends Expression { 1194 class Binary extends Expression {
753 final String op; 1195 final String op;
754 final Expression left; 1196 final Expression left;
755 final Expression right; 1197 final Expression right;
756 1198
757 Binary(this.op, this.left, this.right); 1199 Binary(this.op, this.left, this.right);
758 1200
759 accept(NodeVisitor visitor) => visitor.visitBinary(this); 1201 T accept<T>(NodeVisitor<T> visitor) => visitor.visitBinary(this);
1202
1203 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1204 visitor.visitBinary(this, arg);
760 1205
761 Binary _clone() => new Binary(op, left, right); 1206 Binary _clone() => new Binary(op, left, right);
762 1207
763 void visitChildren(NodeVisitor visitor) { 1208 void visitChildren<T>(NodeVisitor<T> visitor) {
764 left.accept(visitor); 1209 left.accept(visitor);
765 right.accept(visitor); 1210 right.accept(visitor);
766 } 1211 }
767 1212
1213 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1214 left.accept1(visitor, arg);
1215 right.accept1(visitor, arg);
1216 }
1217
768 bool get isCommaOperator => op == ','; 1218 bool get isCommaOperator => op == ',';
769 1219
770 int get precedenceLevel { 1220 int get precedenceLevel {
771 // TODO(floitsch): switch to constant map. 1221 // TODO(floitsch): switch to constant map.
772 switch (op) { 1222 switch (op) {
773 case "*": 1223 case "*":
774 case "/": 1224 case "/":
775 case "%": 1225 case "%":
776 return MULTIPLICATIVE; 1226 return MULTIPLICATIVE;
777 case "+": 1227 case "+":
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 } 1260 }
811 } 1261 }
812 } 1262 }
813 1263
814 class Prefix extends Expression { 1264 class Prefix extends Expression {
815 final String op; 1265 final String op;
816 final Expression argument; 1266 final Expression argument;
817 1267
818 Prefix(this.op, this.argument); 1268 Prefix(this.op, this.argument);
819 1269
820 accept(NodeVisitor visitor) => visitor.visitPrefix(this); 1270 T accept<T>(NodeVisitor<T> visitor) => visitor.visitPrefix(this);
1271
1272 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1273 visitor.visitPrefix(this, arg);
821 1274
822 Prefix _clone() => new Prefix(op, argument); 1275 Prefix _clone() => new Prefix(op, argument);
823 1276
824 void visitChildren(NodeVisitor visitor) { 1277 void visitChildren<T>(NodeVisitor<T> visitor) {
825 argument.accept(visitor); 1278 argument.accept(visitor);
826 } 1279 }
827 1280
1281 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1282 argument.accept1(visitor, arg);
1283 }
1284
828 int get precedenceLevel => UNARY; 1285 int get precedenceLevel => UNARY;
829 } 1286 }
830 1287
831 class Postfix extends Expression { 1288 class Postfix extends Expression {
832 final String op; 1289 final String op;
833 final Expression argument; 1290 final Expression argument;
834 1291
835 Postfix(this.op, this.argument); 1292 Postfix(this.op, this.argument);
836 1293
837 accept(NodeVisitor visitor) => visitor.visitPostfix(this); 1294 T accept<T>(NodeVisitor<T> visitor) => visitor.visitPostfix(this);
1295
1296 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1297 visitor.visitPostfix(this, arg);
838 1298
839 Postfix _clone() => new Postfix(op, argument); 1299 Postfix _clone() => new Postfix(op, argument);
840 1300
841 void visitChildren(NodeVisitor visitor) { 1301 void visitChildren<T>(NodeVisitor<T> visitor) {
842 argument.accept(visitor); 1302 argument.accept(visitor);
843 } 1303 }
844 1304
1305 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1306 argument.accept1(visitor, arg);
1307 }
1308
845 int get precedenceLevel => UNARY; 1309 int get precedenceLevel => UNARY;
846 } 1310 }
847 1311
848 abstract class VariableReference extends Expression { 1312 abstract class VariableReference extends Expression {
849 final String name; 1313 final String name;
850 1314
851 VariableReference(this.name) { 1315 VariableReference(this.name) {
852 assert(_identifierRE.hasMatch(name)); 1316 assert(_identifierRE.hasMatch(name));
853 } 1317 }
1318
854 static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$'); 1319 static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
855 1320
856 accept(NodeVisitor visitor); 1321 accept(NodeVisitor visitor);
1322
857 int get precedenceLevel => PRIMARY; 1323 int get precedenceLevel => PRIMARY;
858 void visitChildren(NodeVisitor visitor) {} 1324
1325 void visitChildren<T>(NodeVisitor<T> visitor) {}
1326
1327 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
859 } 1328 }
860 1329
861 class VariableUse extends VariableReference { 1330 class VariableUse extends VariableReference {
862 VariableUse(String name) : super(name); 1331 VariableUse(String name) : super(name);
863 1332
864 accept(NodeVisitor visitor) => visitor.visitVariableUse(this); 1333 T accept<T>(NodeVisitor<T> visitor) => visitor.visitVariableUse(this);
1334
1335 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1336 visitor.visitVariableUse(this, arg);
1337
865 VariableUse _clone() => new VariableUse(name); 1338 VariableUse _clone() => new VariableUse(name);
866 1339
867 VariableUse asVariableUse() => this; 1340 VariableUse asVariableUse() => this;
868 1341
869 toString() => 'VariableUse($name)'; 1342 String toString() => 'VariableUse($name)';
870 } 1343 }
871 1344
872 class VariableDeclaration extends VariableReference implements Declaration { 1345 class VariableDeclaration extends VariableReference implements Declaration {
873 final bool allowRename; 1346 final bool allowRename;
1347
874 VariableDeclaration(String name, {this.allowRename: true}) : super(name); 1348 VariableDeclaration(String name, {this.allowRename: true}) : super(name);
875 1349
876 accept(NodeVisitor visitor) => visitor.visitVariableDeclaration(this); 1350 T accept<T>(NodeVisitor<T> visitor) => visitor.visitVariableDeclaration(this);
1351
1352 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1353 visitor.visitVariableDeclaration(this, arg);
1354
877 VariableDeclaration _clone() => new VariableDeclaration(name); 1355 VariableDeclaration _clone() => new VariableDeclaration(name);
878 } 1356 }
879 1357
880 class Parameter extends VariableDeclaration { 1358 class Parameter extends VariableDeclaration {
881 Parameter(String name) : super(name); 1359 Parameter(String name) : super(name);
882 1360
883 accept(NodeVisitor visitor) => visitor.visitParameter(this); 1361 T accept<T>(NodeVisitor<T> visitor) => visitor.visitParameter(this);
1362
1363 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1364 visitor.visitParameter(this, arg);
1365
884 Parameter _clone() => new Parameter(name); 1366 Parameter _clone() => new Parameter(name);
885 } 1367 }
886 1368
887 class This extends Parameter { 1369 class This extends Parameter {
888 This() : super("this"); 1370 This() : super("this");
889 1371
890 accept(NodeVisitor visitor) => visitor.visitThis(this); 1372 T accept<T>(NodeVisitor<T> visitor) => visitor.visitThis(this);
1373
1374 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1375 visitor.visitThis(this, arg);
1376
891 This _clone() => new This(); 1377 This _clone() => new This();
892 } 1378 }
893 1379
894 class NamedFunction extends Expression { 1380 class NamedFunction extends Expression {
895 final Declaration name; 1381 final Declaration name;
896 final Fun function; 1382 final Fun function;
897 1383
898 NamedFunction(this.name, this.function); 1384 NamedFunction(this.name, this.function);
899 1385
900 accept(NodeVisitor visitor) => visitor.visitNamedFunction(this); 1386 T accept<T>(NodeVisitor<T> visitor) => visitor.visitNamedFunction(this);
901 1387
902 void visitChildren(NodeVisitor visitor) { 1388 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1389 visitor.visitNamedFunction(this, arg);
1390
1391 void visitChildren<T>(NodeVisitor<T> visitor) {
903 name.accept(visitor); 1392 name.accept(visitor);
904 function.accept(visitor); 1393 function.accept(visitor);
905 } 1394 }
906 1395
1396 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1397 name.accept1(visitor, arg);
1398 function.accept1(visitor, arg);
1399 }
1400
907 NamedFunction _clone() => new NamedFunction(name, function); 1401 NamedFunction _clone() => new NamedFunction(name, function);
908 1402
909 int get precedenceLevel => LEFT_HAND_SIDE; 1403 int get precedenceLevel => LEFT_HAND_SIDE;
910 } 1404 }
911 1405
912 class Fun extends Expression { 1406 class Fun extends Expression {
913 final List<Parameter> params; 1407 final List<Parameter> params;
914 final Block body; 1408 final Block body;
915 final AsyncModifier asyncModifier; 1409 final AsyncModifier asyncModifier;
916 1410
917 Fun(this.params, this.body, {this.asyncModifier: const AsyncModifier.sync()}); 1411 Fun(this.params, this.body, {this.asyncModifier: const AsyncModifier.sync()});
918 1412
919 accept(NodeVisitor visitor) => visitor.visitFun(this); 1413 T accept<T>(NodeVisitor<T> visitor) => visitor.visitFun(this);
920 1414
921 void visitChildren(NodeVisitor visitor) { 1415 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1416 visitor.visitFun(this, arg);
1417
1418 void visitChildren<T>(NodeVisitor<T> visitor) {
922 for (Parameter param in params) param.accept(visitor); 1419 for (Parameter param in params) param.accept(visitor);
923 body.accept(visitor); 1420 body.accept(visitor);
924 } 1421 }
925 1422
1423 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1424 for (Parameter param in params) param.accept1(visitor, arg);
1425 body.accept1(visitor, arg);
1426 }
1427
926 Fun _clone() => new Fun(params, body, asyncModifier: asyncModifier); 1428 Fun _clone() => new Fun(params, body, asyncModifier: asyncModifier);
927 1429
928 int get precedenceLevel => LEFT_HAND_SIDE; 1430 int get precedenceLevel => LEFT_HAND_SIDE;
929 } 1431 }
930 1432
931 class AsyncModifier { 1433 class AsyncModifier {
932 final bool isAsync; 1434 final bool isAsync;
933 final bool isYielding; 1435 final bool isYielding;
934 final String description; 1436 final String description;
935 1437
(...skipping 14 matching lines...) Expand all
950 isYielding = true, 1452 isYielding = true,
951 description = "sync*"; 1453 description = "sync*";
952 toString() => description; 1454 toString() => description;
953 } 1455 }
954 1456
955 class PropertyAccess extends Expression { 1457 class PropertyAccess extends Expression {
956 final Expression receiver; 1458 final Expression receiver;
957 final Expression selector; 1459 final Expression selector;
958 1460
959 PropertyAccess(this.receiver, this.selector); 1461 PropertyAccess(this.receiver, this.selector);
1462
960 PropertyAccess.field(this.receiver, String fieldName) 1463 PropertyAccess.field(this.receiver, String fieldName)
961 : selector = new LiteralString('"$fieldName"'); 1464 : selector = new LiteralString('"$fieldName"');
1465
962 PropertyAccess.indexed(this.receiver, int index) 1466 PropertyAccess.indexed(this.receiver, int index)
963 : selector = new LiteralNumber('$index'); 1467 : selector = new LiteralNumber('$index');
964 1468
965 accept(NodeVisitor visitor) => visitor.visitAccess(this); 1469 T accept<T>(NodeVisitor<T> visitor) => visitor.visitAccess(this);
966 1470
967 void visitChildren(NodeVisitor visitor) { 1471 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1472 visitor.visitAccess(this, arg);
1473
1474 void visitChildren<T>(NodeVisitor<T> visitor) {
968 receiver.accept(visitor); 1475 receiver.accept(visitor);
969 selector.accept(visitor); 1476 selector.accept(visitor);
970 } 1477 }
971 1478
1479 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1480 receiver.accept1(visitor, arg);
1481 selector.accept1(visitor, arg);
1482 }
1483
972 PropertyAccess _clone() => new PropertyAccess(receiver, selector); 1484 PropertyAccess _clone() => new PropertyAccess(receiver, selector);
973 1485
974 int get precedenceLevel => LEFT_HAND_SIDE; 1486 int get precedenceLevel => LEFT_HAND_SIDE;
975 } 1487 }
976 1488
977 /// A [DeferredToken] is a placeholder for some [Expression] that is not known 1489 /// A [DeferredToken] is a placeholder for some [Expression] that is not known
978 /// at construction time of an ast. Unlike [InterpolatedExpression], 1490 /// at construction time of an ast. Unlike [InterpolatedExpression],
979 /// [DeferredToken] is not limited to templates but may also occur in 1491 /// [DeferredToken] is not limited to templates but may also occur in
980 /// fully instantiated asts. 1492 /// fully instantiated asts.
981 abstract class DeferredToken extends Expression { 1493 abstract class DeferredToken extends Expression {
982 void visitChildren(NodeVisitor visitor) {} 1494 void visitChildren<T>(NodeVisitor<T> visitor) {}
1495
1496 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
983 1497
984 DeferredToken _clone() => this; 1498 DeferredToken _clone() => this;
985 } 1499 }
986 1500
987 /// Interface for a deferred integer value. An implementation has to provide 1501 /// Interface for a deferred integer value. An implementation has to provide
988 /// a value via the [value] getter the latest when the ast is printed. 1502 /// a value via the [value] getter the latest when the ast is printed.
989 abstract class DeferredNumber extends DeferredToken implements Literal { 1503 abstract class DeferredNumber extends DeferredToken implements Literal {
990 accept(NodeVisitor visitor) => visitor.visitDeferredNumber(this); 1504 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDeferredNumber(this);
1505
1506 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1507 visitor.visitDeferredNumber(this, arg);
991 1508
992 int get value; 1509 int get value;
993 1510
994 int get precedenceLevel => value.isNegative ? UNARY : PRIMARY; 1511 int get precedenceLevel => value.isNegative ? UNARY : PRIMARY;
995 } 1512 }
996 1513
997 /// Interface for a deferred string value. An implementation has to provide 1514 /// Interface for a deferred string value. An implementation has to provide
998 /// a value via the [value] getter the latest when the ast is printed. 1515 /// a value via the [value] getter the latest when the ast is printed.
999 abstract class DeferredString extends DeferredToken implements Literal { 1516 abstract class DeferredString extends DeferredToken implements Literal {
1000 accept(NodeVisitor visitor) => visitor.visitDeferredString(this); 1517 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDeferredString(this);
1518
1519 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1520 visitor.visitDeferredString(this, arg);
1001 1521
1002 String get value; 1522 String get value;
1003 1523
1004 int get precedenceLevel => PRIMARY; 1524 int get precedenceLevel => PRIMARY;
1005 } 1525 }
1006 1526
1007 /// Interface for a deferred [Expression] value. An implementation has to provid e 1527 /// Interface for a deferred [Expression] value. An implementation has to provid e
1008 /// a value via the [value] getter the latest when the ast is printed. 1528 /// a value via the [value] getter the latest when the ast is printed.
1009 /// Also, [precedenceLevel] has to return the same value that 1529 /// Also, [precedenceLevel] has to return the same value that
1010 /// [value.precedenceLevel] returns once [value] is bound to an [Expression]. 1530 /// [value.precedenceLevel] returns once [value] is bound to an [Expression].
1011 abstract class DeferredExpression extends DeferredToken { 1531 abstract class DeferredExpression extends DeferredToken {
1012 accept(NodeVisitor visitor) => visitor.visitDeferredExpression(this); 1532 T accept<T>(NodeVisitor<T> visitor) => visitor.visitDeferredExpression(this);
1533
1534 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1535 visitor.visitDeferredExpression(this, arg);
1013 1536
1014 Expression get value; 1537 Expression get value;
1015 } 1538 }
1016 1539
1017 abstract class Literal extends Expression { 1540 abstract class Literal extends Expression {
1018 void visitChildren(NodeVisitor visitor) {} 1541 void visitChildren<T>(NodeVisitor<T> visitor) {}
1542
1543 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1019 1544
1020 int get precedenceLevel => PRIMARY; 1545 int get precedenceLevel => PRIMARY;
1021 } 1546 }
1022 1547
1023 class LiteralBool extends Literal { 1548 class LiteralBool extends Literal {
1024 final bool value; 1549 final bool value;
1025 1550
1026 LiteralBool(this.value); 1551 LiteralBool(this.value);
1027 1552
1028 accept(NodeVisitor visitor) => visitor.visitLiteralBool(this); 1553 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralBool(this);
1554
1555 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1556 visitor.visitLiteralBool(this, arg);
1557
1029 // [visitChildren] inherited from [Literal]. 1558 // [visitChildren] inherited from [Literal].
1559
1030 LiteralBool _clone() => new LiteralBool(value); 1560 LiteralBool _clone() => new LiteralBool(value);
1031 } 1561 }
1032 1562
1033 class LiteralNull extends Literal { 1563 class LiteralNull extends Literal {
1034 LiteralNull(); 1564 LiteralNull();
1035 1565
1036 accept(NodeVisitor visitor) => visitor.visitLiteralNull(this); 1566 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNull(this);
1567
1568 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1569 visitor.visitLiteralNull(this, arg);
1570
1037 LiteralNull _clone() => new LiteralNull(); 1571 LiteralNull _clone() => new LiteralNull();
1038 } 1572 }
1039 1573
1040 class LiteralString extends Literal { 1574 class LiteralString extends Literal {
1041 final String value; 1575 final String value;
1042 1576
1043 /** 1577 /**
1044 * Constructs a LiteralString from a string value. 1578 * Constructs a LiteralString from a string value.
1045 * 1579 *
1046 * The constructor does not add the required quotes. If [value] is not 1580 * The constructor does not add the required quotes. If [value] is not
1047 * surrounded by quotes and properly escaped, the resulting object is invalid 1581 * surrounded by quotes and properly escaped, the resulting object is invalid
1048 * as a JS value. 1582 * as a JS value.
1049 * 1583 *
1050 * TODO(sra): Introduce variants for known valid strings that don't allocate a 1584 * TODO(sra): Introduce variants for known valid strings that don't allocate a
1051 * new string just to add quotes. 1585 * new string just to add quotes.
1052 */ 1586 */
1053 LiteralString(this.value); 1587 LiteralString(this.value);
1054 1588
1055 accept(NodeVisitor visitor) => visitor.visitLiteralString(this); 1589 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralString(this);
1590
1591 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1592 visitor.visitLiteralString(this, arg);
1593
1056 LiteralString _clone() => new LiteralString(value); 1594 LiteralString _clone() => new LiteralString(value);
1057 } 1595 }
1058 1596
1059 class StringConcatenation extends Literal { 1597 class StringConcatenation extends Literal {
1060 final List<Literal> parts; 1598 final List<Literal> parts;
1061 1599
1062 /** 1600 /**
1063 * Constructs a StringConcatenation from a list of Literal elements. 1601 * Constructs a StringConcatenation from a list of Literal elements.
1064 * The constructor does not add surrounding quotes to the resulting 1602 * The constructor does not add surrounding quotes to the resulting
1065 * concatenated string. 1603 * concatenated string.
1066 */ 1604 */
1067 StringConcatenation(this.parts); 1605 StringConcatenation(this.parts);
1068 1606
1069 accept(NodeVisitor visitor) => visitor.visitStringConcatenation(this); 1607 T accept<T>(NodeVisitor<T> visitor) => visitor.visitStringConcatenation(this);
1070 1608
1071 void visitChildren(NodeVisitor visitor) { 1609 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1610 visitor.visitStringConcatenation(this, arg);
1611
1612 void visitChildren<T>(NodeVisitor<T> visitor) {
1072 for (Literal part in parts) part.accept(visitor); 1613 for (Literal part in parts) part.accept(visitor);
1073 } 1614 }
1074 1615
1616 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1617 for (Literal part in parts) part.accept1(visitor, arg);
1618 }
1619
1075 StringConcatenation _clone() => new StringConcatenation(this.parts); 1620 StringConcatenation _clone() => new StringConcatenation(this.parts);
1076 } 1621 }
1077 1622
1078 class LiteralNumber extends Literal { 1623 class LiteralNumber extends Literal {
1079 final String value; // Must be a valid JavaScript number literal. 1624 final String value; // Must be a valid JavaScript number literal.
1080 1625
1081 LiteralNumber(this.value); 1626 LiteralNumber(this.value);
1082 1627
1083 int get precedenceLevel => value.startsWith('-') ? UNARY : PRIMARY; 1628 int get precedenceLevel => value.startsWith('-') ? UNARY : PRIMARY;
1084 1629
1085 accept(NodeVisitor visitor) => visitor.visitLiteralNumber(this); 1630 T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNumber(this);
1631
1632 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1633 visitor.visitLiteralNumber(this, arg);
1634
1086 LiteralNumber _clone() => new LiteralNumber(value); 1635 LiteralNumber _clone() => new LiteralNumber(value);
1087 } 1636 }
1088 1637
1089 class ArrayInitializer extends Expression { 1638 class ArrayInitializer extends Expression {
1090 final List<Expression> elements; 1639 final List<Expression> elements;
1091 1640
1092 ArrayInitializer(this.elements); 1641 ArrayInitializer(this.elements);
1093 1642
1094 accept(NodeVisitor visitor) => visitor.visitArrayInitializer(this); 1643 T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayInitializer(this);
1095 1644
1096 void visitChildren(NodeVisitor visitor) { 1645 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1646 visitor.visitArrayInitializer(this, arg);
1647
1648 void visitChildren<T>(NodeVisitor<T> visitor) {
1097 for (Expression element in elements) element.accept(visitor); 1649 for (Expression element in elements) element.accept(visitor);
1098 } 1650 }
1099 1651
1652 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1653 for (Expression element in elements) element.accept1(visitor, arg);
1654 }
1655
1100 ArrayInitializer _clone() => new ArrayInitializer(elements); 1656 ArrayInitializer _clone() => new ArrayInitializer(elements);
1101 1657
1102 int get precedenceLevel => PRIMARY; 1658 int get precedenceLevel => PRIMARY;
1103 } 1659 }
1104 1660
1105 /** 1661 /**
1106 * An empty place in an [ArrayInitializer]. 1662 * An empty place in an [ArrayInitializer].
1107 * For example the list [1, , , 2] would contain two holes. 1663 * For example the list [1, , , 2] would contain two holes.
1108 */ 1664 */
1109 class ArrayHole extends Expression { 1665 class ArrayHole extends Expression {
1110 accept(NodeVisitor visitor) => visitor.visitArrayHole(this); 1666 T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayHole(this);
1111 1667
1112 void visitChildren(NodeVisitor visitor) {} 1668 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1669 visitor.visitArrayHole(this, arg);
1670
1671 void visitChildren<T>(NodeVisitor<T> visitor) {}
1672
1673 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1113 1674
1114 ArrayHole _clone() => new ArrayHole(); 1675 ArrayHole _clone() => new ArrayHole();
1115 1676
1116 int get precedenceLevel => PRIMARY; 1677 int get precedenceLevel => PRIMARY;
1117 } 1678 }
1118 1679
1119 class ObjectInitializer extends Expression { 1680 class ObjectInitializer extends Expression {
1120 final List<Property> properties; 1681 final List<Property> properties;
1121 final bool isOneLiner; 1682 final bool isOneLiner;
1122 1683
1123 /** 1684 /**
1124 * Constructs a new object-initializer containing the given [properties]. 1685 * Constructs a new object-initializer containing the given [properties].
1125 * 1686 *
1126 * [isOneLiner] describes the behaviour when pretty-printing (non-minified). 1687 * [isOneLiner] describes the behaviour when pretty-printing (non-minified).
1127 * If true print all properties on the same line. 1688 * If true print all properties on the same line.
1128 * If false print each property on a seperate line. 1689 * If false print each property on a seperate line.
1129 */ 1690 */
1130 ObjectInitializer(this.properties, {this.isOneLiner: true}); 1691 ObjectInitializer(this.properties, {this.isOneLiner: true});
1131 1692
1132 accept(NodeVisitor visitor) => visitor.visitObjectInitializer(this); 1693 T accept<T>(NodeVisitor<T> visitor) => visitor.visitObjectInitializer(this);
1133 1694
1134 void visitChildren(NodeVisitor visitor) { 1695 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1696 visitor.visitObjectInitializer(this, arg);
1697
1698 void visitChildren<T>(NodeVisitor<T> visitor) {
1135 for (Property init in properties) init.accept(visitor); 1699 for (Property init in properties) init.accept(visitor);
1136 } 1700 }
1137 1701
1702 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1703 for (Property init in properties) init.accept1(visitor, arg);
1704 }
1705
1138 ObjectInitializer _clone() => 1706 ObjectInitializer _clone() =>
1139 new ObjectInitializer(properties, isOneLiner: isOneLiner); 1707 new ObjectInitializer(properties, isOneLiner: isOneLiner);
1140 1708
1141 int get precedenceLevel => PRIMARY; 1709 int get precedenceLevel => PRIMARY;
1142 } 1710 }
1143 1711
1144 class Property extends Node { 1712 class Property extends Node {
1145 final Literal name; 1713 final Literal name;
1146 final Expression value; 1714 final Expression value;
1147 1715
1148 Property(this.name, this.value); 1716 Property(this.name, this.value);
1149 1717
1150 accept(NodeVisitor visitor) => visitor.visitProperty(this); 1718 T accept<T>(NodeVisitor<T> visitor) => visitor.visitProperty(this);
1151 1719
1152 void visitChildren(NodeVisitor visitor) { 1720 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1721 visitor.visitProperty(this, arg);
1722
1723 void visitChildren<T>(NodeVisitor<T> visitor) {
1153 name.accept(visitor); 1724 name.accept(visitor);
1154 value.accept(visitor); 1725 value.accept(visitor);
1155 } 1726 }
1156 1727
1728 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
1729 name.accept1(visitor, arg);
1730 value.accept1(visitor, arg);
1731 }
1732
1157 Property _clone() => new Property(name, value); 1733 Property _clone() => new Property(name, value);
1158 } 1734 }
1159 1735
1160 /// Tag class for all interpolated positions. 1736 /// Tag class for all interpolated positions.
1161 abstract class InterpolatedNode implements Node { 1737 abstract class InterpolatedNode implements Node {
1162 get nameOrPosition; 1738 get nameOrPosition;
1163 1739
1164 bool get isNamed => nameOrPosition is String; 1740 bool get isNamed => nameOrPosition is String;
1741
1165 bool get isPositional => nameOrPosition is int; 1742 bool get isPositional => nameOrPosition is int;
1166 } 1743 }
1167 1744
1168 class InterpolatedExpression extends Expression with InterpolatedNode { 1745 class InterpolatedExpression extends Expression with InterpolatedNode {
1169 final nameOrPosition; 1746 final nameOrPosition;
1170 1747
1171 InterpolatedExpression(this.nameOrPosition); 1748 InterpolatedExpression(this.nameOrPosition);
1172 1749
1173 accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this); 1750 T accept<T>(NodeVisitor<T> visitor) =>
1174 void visitChildren(NodeVisitor visitor) {} 1751 visitor.visitInterpolatedExpression(this);
1752
1753 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1754 visitor.visitInterpolatedExpression(this, arg);
1755
1756 void visitChildren<T>(NodeVisitor<T> visitor) {}
1757
1758 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1759
1175 InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition); 1760 InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition);
1176 1761
1177 int get precedenceLevel => PRIMARY; 1762 int get precedenceLevel => PRIMARY;
1178 } 1763 }
1179 1764
1180 class InterpolatedLiteral extends Literal with InterpolatedNode { 1765 class InterpolatedLiteral extends Literal with InterpolatedNode {
1181 final nameOrPosition; 1766 final nameOrPosition;
1182 1767
1183 InterpolatedLiteral(this.nameOrPosition); 1768 InterpolatedLiteral(this.nameOrPosition);
1184 1769
1185 accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this); 1770 T accept<T>(NodeVisitor<T> visitor) => visitor.visitInterpolatedLiteral(this);
1186 void visitChildren(NodeVisitor visitor) {} 1771
1772 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1773 visitor.visitInterpolatedLiteral(this, arg);
1774
1775 void visitChildren<T>(NodeVisitor<T> visitor) {}
1776
1777 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1778
1187 InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition); 1779 InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition);
1188 } 1780 }
1189 1781
1190 class InterpolatedParameter extends Expression 1782 class InterpolatedParameter extends Expression
1191 with InterpolatedNode 1783 with InterpolatedNode
1192 implements Parameter { 1784 implements Parameter {
1193 final nameOrPosition; 1785 final nameOrPosition;
1194 1786
1787 InterpolatedParameter(this.nameOrPosition);
1788
1195 String get name { 1789 String get name {
1196 throw "InterpolatedParameter.name must not be invoked"; 1790 throw "InterpolatedParameter.name must not be invoked";
1197 } 1791 }
1198 1792
1199 bool get allowRename => false; 1793 bool get allowRename => false;
1200 1794
1201 InterpolatedParameter(this.nameOrPosition); 1795 T accept<T>(NodeVisitor<T> visitor) =>
1796 visitor.visitInterpolatedParameter(this);
1202 1797
1203 accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this); 1798 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1204 void visitChildren(NodeVisitor visitor) {} 1799 visitor.visitInterpolatedParameter(this, arg);
1800
1801 void visitChildren<T>(NodeVisitor<T> visitor) {}
1802
1803 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1804
1205 InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition); 1805 InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition);
1206 1806
1207 int get precedenceLevel => PRIMARY; 1807 int get precedenceLevel => PRIMARY;
1208 } 1808 }
1209 1809
1210 class InterpolatedSelector extends Expression with InterpolatedNode { 1810 class InterpolatedSelector extends Expression with InterpolatedNode {
1211 final nameOrPosition; 1811 final nameOrPosition;
1212 1812
1213 InterpolatedSelector(this.nameOrPosition); 1813 InterpolatedSelector(this.nameOrPosition);
1214 1814
1215 accept(NodeVisitor visitor) => visitor.visitInterpolatedSelector(this); 1815 T accept<T>(NodeVisitor<T> visitor) =>
1216 void visitChildren(NodeVisitor visitor) {} 1816 visitor.visitInterpolatedSelector(this);
1817
1818 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1819 visitor.visitInterpolatedSelector(this, arg);
1820
1821 void visitChildren<T>(NodeVisitor<T> visitor) {}
1822
1823 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1824
1217 InterpolatedSelector _clone() => new InterpolatedSelector(nameOrPosition); 1825 InterpolatedSelector _clone() => new InterpolatedSelector(nameOrPosition);
1218 1826
1219 int get precedenceLevel => PRIMARY; 1827 int get precedenceLevel => PRIMARY;
1220 } 1828 }
1221 1829
1222 class InterpolatedStatement extends Statement with InterpolatedNode { 1830 class InterpolatedStatement extends Statement with InterpolatedNode {
1223 final nameOrPosition; 1831 final nameOrPosition;
1224 1832
1225 InterpolatedStatement(this.nameOrPosition); 1833 InterpolatedStatement(this.nameOrPosition);
1226 1834
1227 accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this); 1835 T accept<T>(NodeVisitor<T> visitor) =>
1228 void visitChildren(NodeVisitor visitor) {} 1836 visitor.visitInterpolatedStatement(this);
1837
1838 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1839 visitor.visitInterpolatedStatement(this, arg);
1840
1841 void visitChildren<T>(NodeVisitor<T> visitor) {}
1842
1843 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1844
1229 InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition); 1845 InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition);
1230 } 1846 }
1231 1847
1232 class InterpolatedDeclaration extends Expression 1848 class InterpolatedDeclaration extends Expression
1233 with InterpolatedNode 1849 with InterpolatedNode
1234 implements Declaration { 1850 implements Declaration {
1235 final nameOrPosition; 1851 final nameOrPosition;
1236 1852
1237 InterpolatedDeclaration(this.nameOrPosition); 1853 InterpolatedDeclaration(this.nameOrPosition);
1238 1854
1239 accept(NodeVisitor visitor) => visitor.visitInterpolatedDeclaration(this); 1855 T accept<T>(NodeVisitor<T> visitor) =>
1240 void visitChildren(NodeVisitor visitor) {} 1856 visitor.visitInterpolatedDeclaration(this);
1857
1858 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1859 visitor.visitInterpolatedDeclaration(this, arg);
1860
1861 void visitChildren<T>(NodeVisitor<T> visitor) {}
1862
1863 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1864
1241 InterpolatedDeclaration _clone() { 1865 InterpolatedDeclaration _clone() {
1242 return new InterpolatedDeclaration(nameOrPosition); 1866 return new InterpolatedDeclaration(nameOrPosition);
1243 } 1867 }
1244 1868
1245 @override 1869 @override
1246 String get name => throw "No name for the interpolated node"; 1870 String get name => throw "No name for the interpolated node";
1247 1871
1248 @override 1872 @override
1249 int get precedenceLevel => PRIMARY; 1873 int get precedenceLevel => PRIMARY;
1250 } 1874 }
1251 1875
1252 /** 1876 /**
1253 * [RegExpLiteral]s, despite being called "Literal", do not inherit from 1877 * [RegExpLiteral]s, despite being called "Literal", do not inherit from
1254 * [Literal]. Indeed, regular expressions in JavaScript have a side-effect and 1878 * [Literal]. Indeed, regular expressions in JavaScript have a side-effect and
1255 * are thus not in the same category as numbers or strings. 1879 * are thus not in the same category as numbers or strings.
1256 */ 1880 */
1257 class RegExpLiteral extends Expression { 1881 class RegExpLiteral extends Expression {
1258 /** Contains the pattern and the flags.*/ 1882 /** Contains the pattern and the flags.*/
1259 final String pattern; 1883 final String pattern;
1260 1884
1261 RegExpLiteral(this.pattern); 1885 RegExpLiteral(this.pattern);
1262 1886
1263 accept(NodeVisitor visitor) => visitor.visitRegExpLiteral(this); 1887 T accept<T>(NodeVisitor<T> visitor) => visitor.visitRegExpLiteral(this);
1264 void visitChildren(NodeVisitor visitor) {} 1888
1889 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1890 visitor.visitRegExpLiteral(this, arg);
1891
1892 void visitChildren<T>(NodeVisitor<T> visitor) {}
1893
1894 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1895
1265 RegExpLiteral _clone() => new RegExpLiteral(pattern); 1896 RegExpLiteral _clone() => new RegExpLiteral(pattern);
1266 1897
1267 int get precedenceLevel => PRIMARY; 1898 int get precedenceLevel => PRIMARY;
1268 } 1899 }
1269 1900
1270 /** 1901 /**
1271 * An asynchronous await. 1902 * An asynchronous await.
1272 * 1903 *
1273 * Not part of JavaScript. We desugar this expression before outputting. 1904 * Not part of JavaScript. We desugar this expression before outputting.
1274 * Should only occur in a [Fun] with `asyncModifier` async or asyncStar. 1905 * Should only occur in a [Fun] with `asyncModifier` async or asyncStar.
1275 */ 1906 */
1276 class Await extends Expression { 1907 class Await extends Expression {
1277 /** The awaited expression. */ 1908 /** The awaited expression. */
1278 final Expression expression; 1909 final Expression expression;
1279 1910
1280 Await(this.expression); 1911 Await(this.expression);
1281 1912
1282 int get precedenceLevel => UNARY; 1913 int get precedenceLevel => UNARY;
1283 accept(NodeVisitor visitor) => visitor.visitAwait(this); 1914
1284 void visitChildren(NodeVisitor visitor) => expression.accept(visitor); 1915 T accept<T>(NodeVisitor<T> visitor) => visitor.visitAwait(this);
1916
1917 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1918 visitor.visitAwait(this, arg);
1919
1920 void visitChildren<T>(NodeVisitor<T> visitor) => expression.accept(visitor);
1921
1922 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1923 expression.accept1(visitor, arg);
1924
1285 Await _clone() => new Await(expression); 1925 Await _clone() => new Await(expression);
1286 } 1926 }
1287 1927
1288 /** 1928 /**
1289 * A comment. 1929 * A comment.
1290 * 1930 *
1291 * Extends [Statement] so we can add comments before statements in 1931 * Extends [Statement] so we can add comments before statements in
1292 * [Block] and [Program]. 1932 * [Block] and [Program].
1293 */ 1933 */
1294 class Comment extends Statement { 1934 class Comment extends Statement {
1295 final String comment; 1935 final String comment;
1296 1936
1297 Comment(this.comment); 1937 Comment(this.comment);
1298 1938
1299 accept(NodeVisitor visitor) => visitor.visitComment(this); 1939 T accept<T>(NodeVisitor<T> visitor) => visitor.visitComment(this);
1940
1941 R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
1942 visitor.visitComment(this, arg);
1943
1300 Comment _clone() => new Comment(comment); 1944 Comment _clone() => new Comment(comment);
1301 1945
1302 void visitChildren(NodeVisitor visitor) {} 1946 void visitChildren<T>(NodeVisitor<T> visitor) {}
1947
1948 void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {}
1303 } 1949 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js/rewrite_async.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698