| 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 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 | 253 |
| 254 Instantiator visitInterpolatedStatement(InterpolatedStatement node) { | 254 Instantiator visitInterpolatedStatement(InterpolatedStatement node) { |
| 255 var nameOrPosition = node.nameOrPosition; | 255 var nameOrPosition = node.nameOrPosition; |
| 256 return (arguments) { | 256 return (arguments) { |
| 257 var value = arguments[nameOrPosition]; | 257 var value = arguments[nameOrPosition]; |
| 258 if (value is Node) return value.toStatement(); | 258 if (value is Node) return value.toStatement(); |
| 259 error('Interpolated value #$nameOrPosition is not a Statement: $value'); | 259 error('Interpolated value #$nameOrPosition is not a Statement: $value'); |
| 260 }; | 260 }; |
| 261 } | 261 } |
| 262 | 262 |
| 263 Instantiator visitInterpolatedMethod(InterpolatedMethod node) { |
| 264 var nameOrPosition = node.nameOrPosition; |
| 265 return (arguments) { |
| 266 var value = arguments[nameOrPosition]; |
| 267 Method toMethod(item) { |
| 268 if (item is Method) return item; |
| 269 return error('Interpolated value #$nameOrPosition is not a Method ' |
| 270 'or List of Methods: $value'); |
| 271 } |
| 272 if (value is Iterable) return value.map(toMethod); |
| 273 return toMethod(value); |
| 274 }; |
| 275 } |
| 276 |
| 277 Instantiator visitInterpolatedPropertyName(InterpolatedPropertyName node) { |
| 278 var nameOrPosition = node.nameOrPosition; |
| 279 return (arguments) { |
| 280 var item = arguments[nameOrPosition]; |
| 281 if (item is PropertyName) return item; |
| 282 if (item is String) return new PropertyName(item); |
| 283 return error('Interpolated value #$nameOrPosition is not a ' |
| 284 'PropertyName or String: $item'); |
| 285 }; |
| 286 } |
| 287 |
| 288 Instantiator visitInterpolatedVariableDeclaration( |
| 289 InterpolatedVariableDeclaration node) { |
| 290 var nameOrPosition = node.nameOrPosition; |
| 291 return (arguments) { |
| 292 var item = arguments[nameOrPosition]; |
| 293 if (item is VariableDeclaration) return item; |
| 294 if (item is String) return new VariableDeclaration(item); |
| 295 return error('Interpolated value #$nameOrPosition is not a ' |
| 296 'VariableDeclaration or String: $item'); |
| 297 }; |
| 298 } |
| 299 |
| 263 Instantiator visitSplayableStatement(Node node) { | 300 Instantiator visitSplayableStatement(Node node) { |
| 264 if (node is InterpolatedStatement) { | 301 if (node is InterpolatedStatement) { |
| 265 var nameOrPosition = node.nameOrPosition; | 302 var nameOrPosition = node.nameOrPosition; |
| 266 return (arguments) { | 303 return (arguments) { |
| 267 var value = arguments[nameOrPosition]; | 304 var value = arguments[nameOrPosition]; |
| 268 Statement toStatement(item) { | 305 Statement toStatement(item) { |
| 269 if (item is Statement) return item; | 306 if (item is Statement) return item; |
| 270 if (item is Expression) return item.toStatement();; | 307 if (item is Expression) return item.toStatement();; |
| 271 return error('Interpolated value #$nameOrPosition is not ' | 308 return error('Interpolated value #$nameOrPosition is not ' |
| 272 'a Statement or List of Statements: $value'); | 309 'a Statement or List of Statements: $value'); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 Instantiator makeObject = visit(node.object); | 434 Instantiator makeObject = visit(node.object); |
| 398 Instantiator makeBody = visit(node.body); | 435 Instantiator makeBody = visit(node.body); |
| 399 return (arguments) { | 436 return (arguments) { |
| 400 return new ForIn( | 437 return new ForIn( |
| 401 makeLeftHandSide(arguments), | 438 makeLeftHandSide(arguments), |
| 402 makeObject(arguments), | 439 makeObject(arguments), |
| 403 makeBody(arguments)); | 440 makeBody(arguments)); |
| 404 }; | 441 }; |
| 405 } | 442 } |
| 406 | 443 |
| 444 Instantiator visitForOf(ForOf node) { |
| 445 Instantiator makeLeftHandSide = visit(node.leftHandSide); |
| 446 Instantiator makeObject = visit(node.iterable); |
| 447 Instantiator makeBody = visit(node.body); |
| 448 return (arguments) { |
| 449 return new ForOf( |
| 450 makeLeftHandSide(arguments), |
| 451 makeObject(arguments), |
| 452 makeBody(arguments)); |
| 453 }; |
| 454 } |
| 455 |
| 407 TODO(String name) { | 456 TODO(String name) { |
| 408 throw new UnimplementedError('$this.$name'); | 457 throw new UnimplementedError('$this.$name'); |
| 409 } | 458 } |
| 410 | 459 |
| 411 Instantiator visitWhile(While node) { | 460 Instantiator visitWhile(While node) { |
| 412 Instantiator makeCondition = visit(node.condition); | 461 Instantiator makeCondition = visit(node.condition); |
| 413 Instantiator makeBody = visit(node.body); | 462 Instantiator makeBody = visit(node.body); |
| 414 return (arguments) { | 463 return (arguments) { |
| 415 return new While(makeCondition(arguments), makeBody(arguments)); | 464 return new While(makeCondition(arguments), makeBody(arguments)); |
| 416 }; | 465 }; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 | 553 |
| 505 Instantiator visitVariableDeclarationList(VariableDeclarationList node) { | 554 Instantiator visitVariableDeclarationList(VariableDeclarationList node) { |
| 506 List<Instantiator> declarationMakers = | 555 List<Instantiator> declarationMakers = |
| 507 node.declarations.map(visit).toList(); | 556 node.declarations.map(visit).toList(); |
| 508 return (arguments) { | 557 return (arguments) { |
| 509 List<VariableInitialization> declarations = <VariableInitialization>[]; | 558 List<VariableInitialization> declarations = <VariableInitialization>[]; |
| 510 for (Instantiator instantiator in declarationMakers) { | 559 for (Instantiator instantiator in declarationMakers) { |
| 511 var result = instantiator(arguments); | 560 var result = instantiator(arguments); |
| 512 declarations.add(result); | 561 declarations.add(result); |
| 513 } | 562 } |
| 514 return new VariableDeclarationList(declarations); | 563 return new VariableDeclarationList(node.keyword, declarations); |
| 515 }; | 564 }; |
| 516 } | 565 } |
| 517 | 566 |
| 518 Instantiator visitAssignment(Assignment node) { | 567 Instantiator visitAssignment(Assignment node) { |
| 519 Instantiator makeLeftHandSide = visit(node.leftHandSide); | 568 Instantiator makeLeftHandSide = visit(node.leftHandSide); |
| 520 String op = node.op; | 569 String op = node.op; |
| 521 Instantiator makeValue = visitNullable(node.value); | 570 Instantiator makeValue = visitNullable(node.value); |
| 522 return (arguments) { | 571 return (arguments) { |
| 523 return new Assignment.compound( | 572 return new Assignment.compound( |
| 524 makeLeftHandSide(arguments), | 573 makeLeftHandSide(arguments), |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 Instantiator visitPostfix(Postfix node) { | 640 Instantiator visitPostfix(Postfix node) { |
| 592 Instantiator makeOperand = visit(node.argument); | 641 Instantiator makeOperand = visit(node.argument); |
| 593 String op = node.op; | 642 String op = node.op; |
| 594 return (arguments) => new Postfix(op, makeOperand(arguments)); | 643 return (arguments) => new Postfix(op, makeOperand(arguments)); |
| 595 } | 644 } |
| 596 | 645 |
| 597 Instantiator visitVariableUse(VariableUse node) => | 646 Instantiator visitVariableUse(VariableUse node) => |
| 598 (arguments) => new VariableUse(node.name); | 647 (arguments) => new VariableUse(node.name); |
| 599 | 648 |
| 600 Instantiator visitThis(This node) => (arguments) => new This(); | 649 Instantiator visitThis(This node) => (arguments) => new This(); |
| 650 Instantiator visitSuper(Super node) => (arguments) => new Super(); |
| 601 | 651 |
| 602 Instantiator visitVariableDeclaration(VariableDeclaration node) => | 652 Instantiator visitVariableDeclaration(VariableDeclaration node) => |
| 603 (arguments) => new VariableDeclaration(node.name); | 653 (arguments) => new VariableDeclaration(node.name); |
| 604 | 654 |
| 605 Instantiator visitParameter(Parameter node) => | 655 Instantiator visitParameter(Parameter node) => |
| 606 (arguments) => new Parameter(node.name); | 656 (arguments) => new Parameter(node.name); |
| 607 | 657 |
| 608 Instantiator visitAccess(PropertyAccess node) { | 658 Instantiator visitAccess(PropertyAccess node) { |
| 609 Instantiator makeReceiver = visit(node.receiver); | 659 Instantiator makeReceiver = visit(node.receiver); |
| 610 Instantiator makeSelector = visit(node.selector); | 660 Instantiator makeSelector = visit(node.selector); |
| 611 return (arguments) => | 661 return (arguments) => |
| 612 new PropertyAccess(makeReceiver(arguments), makeSelector(arguments)); | 662 new PropertyAccess(makeReceiver(arguments), makeSelector(arguments)); |
| 613 } | 663 } |
| 614 | 664 |
| 615 Instantiator visitNamedFunction(NamedFunction node) { | 665 Instantiator visitNamedFunction(NamedFunction node) { |
| 616 Instantiator makeDeclaration = visit(node.name); | 666 Instantiator makeDeclaration = visit(node.name); |
| 617 Instantiator makeFunction = visit(node.function); | 667 Instantiator makeFunction = visit(node.function); |
| 618 return (arguments) => | 668 return (arguments) => |
| 619 new NamedFunction(makeDeclaration(arguments), makeFunction(arguments)); | 669 new NamedFunction(makeDeclaration(arguments), makeFunction(arguments)); |
| 620 } | 670 } |
| 621 | 671 |
| 622 Instantiator visitFun(Fun node) { | 672 Instantiator visitFunctionExpression(FunctionExpression node) { |
| 623 List<Instantiator> paramMakers = node.params.map(visitSplayable).toList(); | 673 List<Instantiator> paramMakers = node.params.map(visitSplayable).toList(); |
| 624 Instantiator makeBody = visit(node.body); | 674 Instantiator makeBody = visit(node.body); |
| 625 // TODO(sra): Avoid copying params if no interpolation or forced copying. | 675 // TODO(sra): Avoid copying params if no interpolation or forced copying. |
| 626 return (arguments) { | 676 return (arguments) { |
| 627 List<Parameter> params = <Parameter>[]; | 677 List<Parameter> params = <Parameter>[]; |
| 628 for (Instantiator instantiator in paramMakers) { | 678 for (Instantiator instantiator in paramMakers) { |
| 629 var result = instantiator(arguments); | 679 var result = instantiator(arguments); |
| 630 if (result is Iterable) { | 680 if (result is Iterable) { |
| 631 params.addAll(result); | 681 params.addAll(result); |
| 632 } else { | 682 } else { |
| 633 params.add(result); | 683 params.add(result); |
| 634 } | 684 } |
| 635 } | 685 } |
| 636 Statement body = makeBody(arguments); | 686 var body = makeBody(arguments); |
| 637 return new Fun(params, body); | 687 if (node is ArrowFun) { |
| 688 return new ArrowFun(params, body); |
| 689 } else if (node is Fun) { |
| 690 return new Fun(params, body); |
| 691 } else { |
| 692 throw "Unknown FunctionExpression type ${node.runtimeType}: $node"; |
| 693 } |
| 638 }; | 694 }; |
| 639 } | 695 } |
| 640 | 696 |
| 697 Instantiator visitFun(Fun node) => visitFunctionExpression(node); |
| 698 |
| 699 Instantiator visitArrowFun(ArrowFun node) => visitFunctionExpression(node); |
| 700 |
| 641 Instantiator visitLiteralBool(LiteralBool node) => | 701 Instantiator visitLiteralBool(LiteralBool node) => |
| 642 (arguments) => new LiteralBool(node.value); | 702 (arguments) => new LiteralBool(node.value); |
| 643 | 703 |
| 644 Instantiator visitLiteralString(LiteralString node) => | 704 Instantiator visitLiteralString(LiteralString node) => |
| 645 (arguments) => new LiteralString(node.value); | 705 (arguments) => new LiteralString(node.value); |
| 646 | 706 |
| 647 Instantiator visitLiteralNumber(LiteralNumber node) => | 707 Instantiator visitLiteralNumber(LiteralNumber node) => |
| 648 (arguments) => new LiteralNumber(node.value); | 708 (arguments) => new LiteralNumber(node.value); |
| 649 | 709 |
| 650 Instantiator visitLiteralNull(LiteralNull node) => | 710 Instantiator visitLiteralNull(LiteralNull node) => |
| (...skipping 12 matching lines...) Expand all Loading... |
| 663 }; | 723 }; |
| 664 } | 724 } |
| 665 | 725 |
| 666 Instantiator visitArrayHole(ArrayHole node) { | 726 Instantiator visitArrayHole(ArrayHole node) { |
| 667 return (arguments) => new ArrayHole(); | 727 return (arguments) => new ArrayHole(); |
| 668 } | 728 } |
| 669 | 729 |
| 670 Instantiator visitObjectInitializer(ObjectInitializer node) { | 730 Instantiator visitObjectInitializer(ObjectInitializer node) { |
| 671 List<Instantiator> propertyMakers = | 731 List<Instantiator> propertyMakers = |
| 672 node.properties.map(visitSplayable).toList(); | 732 node.properties.map(visitSplayable).toList(); |
| 673 bool isOneLiner = node.isOneLiner; | |
| 674 return (arguments) { | 733 return (arguments) { |
| 675 List<Property> properties = <Property>[]; | 734 List<Property> properties = <Property>[]; |
| 676 for (Instantiator instantiator in propertyMakers) { | 735 for (Instantiator instantiator in propertyMakers) { |
| 677 var result = instantiator(arguments); | 736 var result = instantiator(arguments); |
| 678 if (result is Iterable) { | 737 if (result is Iterable) { |
| 679 properties.addAll(result); | 738 properties.addAll(result); |
| 680 } else { | 739 } else { |
| 681 properties.add(result); | 740 properties.add(result); |
| 682 } | 741 } |
| 683 } | 742 } |
| 684 return new ObjectInitializer(properties, isOneLiner: isOneLiner); | 743 return new ObjectInitializer(properties); |
| 685 }; | 744 }; |
| 686 } | 745 } |
| 687 | 746 |
| 688 Instantiator visitProperty(Property node) { | 747 Instantiator visitProperty(Property node) { |
| 689 Instantiator makeName = visit(node.name); | 748 Instantiator makeName = visit(node.name); |
| 690 Instantiator makeValue = visit(node.value); | 749 Instantiator makeValue = visit(node.value); |
| 691 return (arguments) { | 750 return (arguments) { |
| 692 return new Property(makeName(arguments), makeValue(arguments)); | 751 return new Property(makeName(arguments), makeValue(arguments)); |
| 693 }; | 752 }; |
| 694 } | 753 } |
| 695 | 754 |
| 755 Instantiator visitPropertyName(PropertyName node) => |
| 756 (arguments) => new PropertyName(node.name); |
| 757 |
| 696 Instantiator visitRegExpLiteral(RegExpLiteral node) => | 758 Instantiator visitRegExpLiteral(RegExpLiteral node) => |
| 697 (arguments) => new RegExpLiteral(node.pattern); | 759 (arguments) => new RegExpLiteral(node.pattern); |
| 698 | 760 |
| 699 Instantiator visitComment(Comment node) => TODO('visitComment'); | 761 Instantiator visitTemplateString(TemplateString node) { |
| 762 Iterable makeElements = |
| 763 node.elements.map((e) => e is String ? e : visit(e)); |
| 764 return (arguments) { |
| 765 return new TemplateString(makeElements |
| 766 .map((m) => m is String ? m : m(arguments)) |
| 767 .toList(growable: false)); |
| 768 }; |
| 769 } |
| 770 |
| 771 Instantiator visitTaggedTemplate(TaggedTemplate node) { |
| 772 Instantiator makeTag = visit(node.tag); |
| 773 Instantiator makeTemplate = visit(node.template); |
| 774 return (arguments) { |
| 775 return new TaggedTemplate(makeTag(arguments), makeTemplate(arguments)); |
| 776 }; |
| 777 } |
| 778 |
| 779 Instantiator visitClassDeclaration(ClassDeclaration node) { |
| 780 Instantiator makeClass = visit(node.classExpr); |
| 781 return (arguments) { |
| 782 return new ClassDeclaration(makeClass(arguments)); |
| 783 }; |
| 784 } |
| 785 |
| 786 Instantiator visitClassExpression(ClassExpression node) { |
| 787 List<Instantiator> makeMethods = node.methods.map(visitSplayableExpression) |
| 788 .toList(growable: true); |
| 789 Instantiator makeName = visit(node.name); |
| 790 Instantiator makeHeritage = visit(node.heritage); |
| 791 |
| 792 return (arguments) { |
| 793 var methods = <Method>[]; |
| 794 for (Instantiator instantiator in makeMethods) { |
| 795 var result = instantiator(arguments); |
| 796 if (result is Iterable) { |
| 797 methods.addAll(result); |
| 798 } else { |
| 799 methods.add(result); |
| 800 } |
| 801 } |
| 802 return new ClassExpression( |
| 803 makeName(arguments), makeHeritage(arguments), methods); |
| 804 }; |
| 805 } |
| 806 |
| 807 Instantiator visitMethod(Method node) { |
| 808 Instantiator makeName = visit(node.name); |
| 809 Instantiator makeFunction = visit(node.function); |
| 810 return (arguments) { |
| 811 return new Method( |
| 812 makeName(arguments), |
| 813 makeFunction(arguments), |
| 814 isGetter: node.isGetter, |
| 815 isSetter: node.isSetter, |
| 816 isStatic: node.isStatic); |
| 817 }; |
| 818 } |
| 819 |
| 820 Instantiator visitComment(Comment node) => |
| 821 (arguments) => new Comment(node.comment); |
| 822 |
| 823 Instantiator visitCommentExpression(CommentExpression node) { |
| 824 Instantiator makeExpr = visit(node.expression); |
| 825 return (arguments) { |
| 826 return new CommentExpression(node.comment, makeExpr(arguments)); |
| 827 }; |
| 828 } |
| 700 | 829 |
| 701 Instantiator visitAwait(Await node) { | 830 Instantiator visitAwait(Await node) { |
| 702 Instantiator makeExpression = visit(node.expression); | 831 Instantiator makeExpression = visit(node.expression); |
| 703 return (arguments) { | 832 return (arguments) { |
| 704 return new Await(makeExpression(arguments)); | 833 return new Await(makeExpression(arguments)); |
| 705 }; | 834 }; |
| 706 } | 835 } |
| 707 } | 836 } |
| 708 | 837 |
| 709 /** | 838 /** |
| (...skipping 20 matching lines...) Expand all Loading... |
| 730 if (count != before) containsInterpolatedNode.add(node); | 859 if (count != before) containsInterpolatedNode.add(node); |
| 731 return null; | 860 return null; |
| 732 } | 861 } |
| 733 | 862 |
| 734 visitInterpolatedNode(InterpolatedNode node) { | 863 visitInterpolatedNode(InterpolatedNode node) { |
| 735 containsInterpolatedNode.add(node); | 864 containsInterpolatedNode.add(node); |
| 736 if (node.isNamed) holeNames.add(node.nameOrPosition); | 865 if (node.isNamed) holeNames.add(node.nameOrPosition); |
| 737 ++count; | 866 ++count; |
| 738 } | 867 } |
| 739 } | 868 } |
| OLD | NEW |