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 |