OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 class TemplateManager { | 7 class TemplateManager { |
8 Map<String, Template> expressionTemplates = new Map<String, Template>(); | 8 Map<String, Template> expressionTemplates = new Map<String, Template>(); |
9 Map<String, Template> statementTemplates = new Map<String, Template>(); | 9 Map<String, Template> statementTemplates = new Map<String, Template>(); |
10 | 10 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 return visit(node); | 298 return visit(node); |
299 } | 299 } |
300 | 300 |
301 Instantiator visitProgram(Program node) { | 301 Instantiator visitProgram(Program node) { |
302 List instantiators = node.body.map(visitSplayableStatement).toList(); | 302 List instantiators = node.body.map(visitSplayableStatement).toList(); |
303 return (arguments) { | 303 return (arguments) { |
304 List<Statement> statements = <Statement>[]; | 304 List<Statement> statements = <Statement>[]; |
305 void add(node) { | 305 void add(node) { |
306 if (node is EmptyStatement) return; | 306 if (node is EmptyStatement) return; |
307 if (node is Iterable) { | 307 if (node is Iterable) { |
308 statements.addAll(node); | 308 for (var n in node) statements.add(n); |
309 } else { | 309 } else { |
310 statements.add(node.toStatement()); | 310 statements.add(node.toStatement()); |
311 } | 311 } |
312 } | 312 } |
313 for (Instantiator instantiator in instantiators) { | 313 for (Instantiator instantiator in instantiators) { |
314 add(instantiator(arguments)); | 314 add(instantiator(arguments)); |
315 } | 315 } |
316 return new Program(statements); | 316 return new Program(statements); |
317 }; | 317 }; |
318 } | 318 } |
319 | 319 |
320 Instantiator visitBlock(Block node) { | 320 Instantiator visitBlock(Block node) { |
321 List instantiators = node.statements.map(visitSplayableStatement).toList(); | 321 List instantiators = node.statements.map(visitSplayableStatement).toList(); |
322 return (arguments) { | 322 return (arguments) { |
323 List<Statement> statements = <Statement>[]; | 323 List<Statement> statements = <Statement>[]; |
324 void add(node) { | 324 void add(node) { |
325 if (node is EmptyStatement) return; | 325 if (node is EmptyStatement) return; |
326 if (node is Iterable) { | 326 if (node is Iterable) { |
327 statements.addAll(node); | 327 for (var n in node) statements.add(n); |
328 } else if (node is Block) { | 328 } else if (node is Block) { |
329 statements.addAll(node.statements); | 329 statements.addAll(node.statements); |
330 } else { | 330 } else { |
331 statements.add(node.toStatement()); | 331 statements.add(node.toStatement()); |
332 } | 332 } |
333 } | 333 } |
334 for (Instantiator instantiator in instantiators) { | 334 for (Instantiator instantiator in instantiators) { |
335 add(instantiator(arguments)); | 335 add(instantiator(arguments)); |
336 } | 336 } |
337 return new Block(statements); | 337 return new Block(statements); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 new Catch(makeDeclaration(arguments), makeBody(arguments)); | 483 new Catch(makeDeclaration(arguments), makeBody(arguments)); |
484 } | 484 } |
485 | 485 |
486 Instantiator visitSwitch(Switch node) { | 486 Instantiator visitSwitch(Switch node) { |
487 Instantiator makeKey = visit(node.key); | 487 Instantiator makeKey = visit(node.key); |
488 Iterable<Instantiator> makeCases = node.cases.map(visit); | 488 Iterable<Instantiator> makeCases = node.cases.map(visit); |
489 return (arguments) { | 489 return (arguments) { |
490 return new Switch( | 490 return new Switch( |
491 makeKey(arguments), | 491 makeKey(arguments), |
492 makeCases | 492 makeCases |
493 .map((Instantiator makeCase) => makeCase(arguments)) | 493 .map((makeCase) => makeCase(arguments) as SwitchClause) |
494 .toList()); | 494 .toList()); |
495 }; | 495 }; |
496 } | 496 } |
497 | 497 |
498 Instantiator visitCase(Case node) { | 498 Instantiator visitCase(Case node) { |
499 Instantiator makeExpression = visit(node.expression); | 499 Instantiator makeExpression = visit(node.expression); |
500 Instantiator makeBody = visit(node.body); | 500 Instantiator makeBody = visit(node.body); |
501 return (arguments) { | 501 return (arguments) { |
502 return new Case(makeExpression(arguments), makeBody(arguments)); | 502 return new Case(makeExpression(arguments), makeBody(arguments)); |
503 }; | 503 }; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 | 561 |
562 Instantiator visitConditional(Conditional cond) { | 562 Instantiator visitConditional(Conditional cond) { |
563 Instantiator makeCondition = visit(cond.condition); | 563 Instantiator makeCondition = visit(cond.condition); |
564 Instantiator makeThen = visit(cond.then); | 564 Instantiator makeThen = visit(cond.then); |
565 Instantiator makeOtherwise = visit(cond.otherwise); | 565 Instantiator makeOtherwise = visit(cond.otherwise); |
566 return (arguments) => new Conditional(makeCondition(arguments), | 566 return (arguments) => new Conditional(makeCondition(arguments), |
567 makeThen(arguments), makeOtherwise(arguments)); | 567 makeThen(arguments), makeOtherwise(arguments)); |
568 } | 568 } |
569 | 569 |
570 Instantiator visitNew(New node) => | 570 Instantiator visitNew(New node) => |
571 handleCallOrNew(node, (target, arguments) => new New(target, arguments)); | 571 handleCallOrNew(node, (target, arguments) => |
| 572 new New(target, arguments as List<Expression>)); |
572 | 573 |
573 Instantiator visitCall(Call node) => | 574 Instantiator visitCall(Call node) => |
574 handleCallOrNew(node, (target, arguments) => new Call(target, arguments)); | 575 handleCallOrNew(node, (target, arguments) => |
| 576 new Call(target, arguments as List<Expression>)); |
575 | 577 |
576 Instantiator handleCallOrNew(Call node, finish(target, arguments)) { | 578 Instantiator handleCallOrNew(Call node, finish(target, arguments)) { |
577 Instantiator makeTarget = visit(node.target); | 579 Instantiator makeTarget = visit(node.target); |
578 Iterable<Instantiator> argumentMakers = | 580 Iterable<Instantiator> argumentMakers = |
579 node.arguments.map(visitSplayableExpression).toList(); | 581 node.arguments.map(visitSplayableExpression).toList(); |
580 | 582 |
581 // TODO(sra): Avoid copying call arguments if no interpolation or forced | 583 // TODO(sra): Avoid copying call arguments if no interpolation or forced |
582 // copying. | 584 // copying. |
583 return (arguments) { | 585 return (arguments) { |
584 Node target = makeTarget(arguments); | 586 Node target = makeTarget(arguments); |
585 List<Expression> callArguments = <Expression>[]; | 587 List<Expression> callArguments = <Expression>[]; |
586 for (Instantiator instantiator in argumentMakers) { | 588 for (Instantiator instantiator in argumentMakers) { |
587 var result = instantiator(arguments); | 589 var result = instantiator(arguments); |
588 if (result is Iterable) { | 590 if (result is Iterable) { |
589 callArguments.addAll(result); | 591 for (var r in result) callArguments.add(r); |
590 } else { | 592 } else { |
591 callArguments.add(result); | 593 callArguments.add(result); |
592 } | 594 } |
593 } | 595 } |
594 return finish(target, callArguments.toList(growable: false)); | 596 return finish(target, callArguments.toList(growable: false)); |
595 }; | 597 }; |
596 } | 598 } |
597 | 599 |
598 Instantiator visitBinary(Binary node) { | 600 Instantiator visitBinary(Binary node) { |
599 Instantiator makeLeft = visit(node.left); | 601 Instantiator makeLeft = visit(node.left); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 649 |
648 Instantiator visitFunctionExpression(FunctionExpression node) { | 650 Instantiator visitFunctionExpression(FunctionExpression node) { |
649 List<Instantiator> paramMakers = node.params.map(visitSplayable).toList(); | 651 List<Instantiator> paramMakers = node.params.map(visitSplayable).toList(); |
650 Instantiator makeBody = visit(node.body); | 652 Instantiator makeBody = visit(node.body); |
651 // TODO(sra): Avoid copying params if no interpolation or forced copying. | 653 // TODO(sra): Avoid copying params if no interpolation or forced copying. |
652 return (arguments) { | 654 return (arguments) { |
653 List<Parameter> params = <Parameter>[]; | 655 List<Parameter> params = <Parameter>[]; |
654 for (Instantiator instantiator in paramMakers) { | 656 for (Instantiator instantiator in paramMakers) { |
655 var result = instantiator(arguments); | 657 var result = instantiator(arguments); |
656 if (result is Iterable) { | 658 if (result is Iterable) { |
657 params.addAll(result); | 659 for (var r in result) params.add(r); |
658 } else { | 660 } else { |
659 params.add(result); | 661 params.add(result); |
660 } | 662 } |
661 } | 663 } |
662 var body = makeBody(arguments); | 664 var body = makeBody(arguments); |
663 if (node is ArrowFun) { | 665 if (node is ArrowFun) { |
664 return new ArrowFun(params, body); | 666 return new ArrowFun(params, body); |
665 } else if (node is Fun) { | 667 } else if (node is Fun) { |
666 return new Fun(params, body); | 668 return new Fun(params, body); |
667 } else { | 669 } else { |
(...skipping 17 matching lines...) Expand all Loading... |
685 | 687 |
686 Instantiator visitLiteralNull(LiteralNull node) => | 688 Instantiator visitLiteralNull(LiteralNull node) => |
687 (arguments) => new LiteralNull(); | 689 (arguments) => new LiteralNull(); |
688 | 690 |
689 Instantiator visitArrayInitializer(ArrayInitializer node) { | 691 Instantiator visitArrayInitializer(ArrayInitializer node) { |
690 // TODO(sra): Implement splicing? | 692 // TODO(sra): Implement splicing? |
691 List<Instantiator> elementMakers = | 693 List<Instantiator> elementMakers = |
692 node.elements.map(visit).toList(growable: false); | 694 node.elements.map(visit).toList(growable: false); |
693 return (arguments) { | 695 return (arguments) { |
694 List<Expression> elements = elementMakers | 696 List<Expression> elements = elementMakers |
695 .map((Instantiator instantiator) => instantiator(arguments)) | 697 .map((instantiator) => instantiator(arguments) as Expression) |
696 .toList(growable: false); | 698 .toList(growable: false); |
697 return new ArrayInitializer(elements); | 699 return new ArrayInitializer(elements); |
698 }; | 700 }; |
699 } | 701 } |
700 | 702 |
701 Instantiator visitArrayHole(ArrayHole node) { | 703 Instantiator visitArrayHole(ArrayHole node) { |
702 return (arguments) => new ArrayHole(); | 704 return (arguments) => new ArrayHole(); |
703 } | 705 } |
704 | 706 |
705 Instantiator visitObjectInitializer(ObjectInitializer node) { | 707 Instantiator visitObjectInitializer(ObjectInitializer node) { |
706 List<Instantiator> propertyMakers = | 708 List<Instantiator> propertyMakers = |
707 node.properties.map(visitSplayable).toList(); | 709 node.properties.map(visitSplayable).toList(); |
708 return (arguments) { | 710 return (arguments) { |
709 List<Property> properties = <Property>[]; | 711 List<Property> properties = <Property>[]; |
710 for (Instantiator instantiator in propertyMakers) { | 712 for (Instantiator instantiator in propertyMakers) { |
711 var result = instantiator(arguments); | 713 var result = instantiator(arguments); |
712 if (result is Iterable) { | 714 if (result is Iterable) { |
713 properties.addAll(result); | 715 for (var r in result) properties.add(r); |
714 } else { | 716 } else { |
715 properties.add(result); | 717 properties.add(result); |
716 } | 718 } |
717 } | 719 } |
718 return new ObjectInitializer(properties); | 720 return new ObjectInitializer(properties); |
719 }; | 721 }; |
720 } | 722 } |
721 | 723 |
722 Instantiator visitProperty(Property node) { | 724 Instantiator visitProperty(Property node) { |
723 Instantiator makeName = visit(node.name); | 725 Instantiator makeName = visit(node.name); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 List<Instantiator> makeMethods = | 761 List<Instantiator> makeMethods = |
760 node.methods.map(visitSplayableExpression).toList(growable: true); | 762 node.methods.map(visitSplayableExpression).toList(growable: true); |
761 Instantiator makeName = visit(node.name); | 763 Instantiator makeName = visit(node.name); |
762 Instantiator makeHeritage = visit(node.heritage); | 764 Instantiator makeHeritage = visit(node.heritage); |
763 | 765 |
764 return (arguments) { | 766 return (arguments) { |
765 var methods = <Method>[]; | 767 var methods = <Method>[]; |
766 for (Instantiator instantiator in makeMethods) { | 768 for (Instantiator instantiator in makeMethods) { |
767 var result = instantiator(arguments); | 769 var result = instantiator(arguments); |
768 if (result is Iterable) { | 770 if (result is Iterable) { |
769 methods.addAll(result); | 771 for (var r in result) methods.add(r); |
770 } else { | 772 } else { |
771 methods.add(result); | 773 methods.add(result); |
772 } | 774 } |
773 } | 775 } |
774 return new ClassExpression( | 776 return new ClassExpression( |
775 makeName(arguments), makeHeritage(arguments), methods); | 777 makeName(arguments), makeHeritage(arguments), methods); |
776 }; | 778 }; |
777 } | 779 } |
778 | 780 |
779 Instantiator visitMethod(Method node) { | 781 Instantiator visitMethod(Method node) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 structure: makeStructure(arguments), | 858 structure: makeStructure(arguments), |
857 defaultValue: makeDefaultValue(arguments)); | 859 defaultValue: makeDefaultValue(arguments)); |
858 }; | 860 }; |
859 } | 861 } |
860 | 862 |
861 @override | 863 @override |
862 Instantiator visitArrayBindingPattern(ArrayBindingPattern node) { | 864 Instantiator visitArrayBindingPattern(ArrayBindingPattern node) { |
863 List<Instantiator> makeVars = node.variables.map(this.visit).toList(); | 865 List<Instantiator> makeVars = node.variables.map(this.visit).toList(); |
864 return (arguments) { | 866 return (arguments) { |
865 return new ArrayBindingPattern( | 867 return new ArrayBindingPattern( |
866 makeVars.map((m) => m(arguments)).toList()); | 868 makeVars.map((m) => m(arguments) as DestructuredVariable).toList()); |
867 }; | 869 }; |
868 } | 870 } |
869 | 871 |
870 @override | 872 @override |
871 Instantiator visitObjectBindingPattern(ObjectBindingPattern node) { | 873 Instantiator visitObjectBindingPattern(ObjectBindingPattern node) { |
872 List<Instantiator> makeVars = node.variables.map(this.visit).toList(); | 874 List<Instantiator> makeVars = node.variables.map(this.visit).toList(); |
873 return (arguments) { | 875 return (arguments) { |
874 return new ObjectBindingPattern( | 876 return new ObjectBindingPattern( |
875 makeVars.map((m) => m(arguments)).toList()); | 877 makeVars.map((m) => m(arguments) as DestructuredVariable).toList()); |
876 }; | 878 }; |
877 } | 879 } |
878 | 880 |
879 @override | 881 @override |
880 Instantiator visitSimpleBindingPattern(SimpleBindingPattern node) => | 882 Instantiator visitSimpleBindingPattern(SimpleBindingPattern node) => |
881 (arguments) => new SimpleBindingPattern(new Identifier(node.name.name)); | 883 (arguments) => new SimpleBindingPattern(new Identifier(node.name.name)); |
882 } | 884 } |
883 | 885 |
884 /** | 886 /** |
885 * InterpolatedNodeAnalysis determines which AST trees contain | 887 * InterpolatedNodeAnalysis determines which AST trees contain |
(...skipping 19 matching lines...) Expand all Loading... |
905 if (count != before) containsInterpolatedNode.add(node); | 907 if (count != before) containsInterpolatedNode.add(node); |
906 return null; | 908 return null; |
907 } | 909 } |
908 | 910 |
909 visitInterpolatedNode(InterpolatedNode node) { | 911 visitInterpolatedNode(InterpolatedNode node) { |
910 containsInterpolatedNode.add(node); | 912 containsInterpolatedNode.add(node); |
911 if (node.isNamed) holeNames.add(node.nameOrPosition); | 913 if (node.isNamed) holeNames.add(node.nameOrPosition); |
912 ++count; | 914 ++count; |
913 } | 915 } |
914 } | 916 } |
OLD | NEW |