| 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 |