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

Side by Side Diff: lib/src/js/template.dart

Issue 949383003: use js_ast instead of strings to generate JS (Closed) Base URL: git@github.com:dart-lang/dart-dev-compiler.git@master
Patch Set: add redirecting ctor test Created 5 years, 10 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 | « lib/src/js/printer.dart ('k') | test/codegen/constructors.dart » ('j') | 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) 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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « lib/src/js/printer.dart ('k') | test/codegen/constructors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698