Chromium Code Reviews| 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 library tree_ir_nodes; | 5 library tree_ir_nodes; |
| 6 | 6 |
| 7 import '../constants/expressions.dart'; | 7 import '../constants/expressions.dart'; |
| 8 import '../constants/values.dart' as values; | 8 import '../constants/values.dart' as values; |
| 9 import '../dart_types.dart' show DartType, GenericType, TypeVariableType; | 9 import '../dart_types.dart' show DartType, GenericType, InterfaceType, TypeVaria bleType; |
| 10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
| 11 import '../io/source_information.dart' show SourceInformation; | 11 import '../io/source_information.dart' show SourceInformation; |
| 12 import '../universe/universe.dart'; | 12 import '../universe/universe.dart'; |
| 13 import '../universe/universe.dart' show Selector; | 13 import '../universe/universe.dart' show Selector; |
| 14 import 'optimization/optimization.dart'; | 14 import 'optimization/optimization.dart'; |
| 15 | 15 |
| 16 // The Tree language is the target of translation out of the CPS-based IR. | 16 // The Tree language is the target of translation out of the CPS-based IR. |
| 17 // | 17 // |
| 18 // The translation from CPS to Dart consists of several stages. Among the | 18 // The translation from CPS to Dart consists of several stages. Among the |
| 19 // stages are translation to direct style, translation out of SSA, eliminating | 19 // stages are translation to direct style, translation out of SSA, eliminating |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 class InvokeConstructor extends Expression implements Invoke { | 215 class InvokeConstructor extends Expression implements Invoke { |
| 216 final DartType type; | 216 final DartType type; |
| 217 final FunctionElement target; | 217 final FunctionElement target; |
| 218 final List<Expression> arguments; | 218 final List<Expression> arguments; |
| 219 final Selector selector; | 219 final Selector selector; |
| 220 /// TODO(karlklose): get rid of this field. Instead use the constant's | 220 /// TODO(karlklose): get rid of this field. Instead use the constant's |
| 221 /// expression to find the constructor to be called in dart2dart. | 221 /// expression to find the constructor to be called in dart2dart. |
| 222 final values.ConstantValue constant; | 222 final values.ConstantValue constant; |
| 223 | 223 |
| 224 InvokeConstructor(this.type, this.target, this.selector, this.arguments, | 224 InvokeConstructor(this.type, this.target, this.selector, this.arguments, |
| 225 [this.constant]); | 225 [this.constant]); |
| 226 | 226 |
| 227 ClassElement get targetClass => target.enclosingElement; | 227 ClassElement get targetClass => target.enclosingElement; |
| 228 | 228 |
| 229 accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this); | 229 accept(ExpressionVisitor visitor) { |
| 230 return visitor.visitInvokeConstructor(this); | |
| 231 } | |
| 232 | |
| 230 accept1(ExpressionVisitor1 visitor, arg) { | 233 accept1(ExpressionVisitor1 visitor, arg) { |
| 231 return visitor.visitInvokeConstructor(this, arg); | 234 return visitor.visitInvokeConstructor(this, arg); |
| 232 } | 235 } |
| 233 } | 236 } |
| 234 | 237 |
| 235 /// Calls [toString] on each argument and concatenates the results. | 238 /// Calls [toString] on each argument and concatenates the results. |
| 236 class ConcatenateStrings extends Expression { | 239 class ConcatenateStrings extends Expression { |
| 237 final List<Expression> arguments; | 240 final List<Expression> arguments; |
| 238 | 241 |
| 239 ConcatenateStrings(this.arguments); | 242 ConcatenateStrings(this.arguments); |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 725 abstract class DartSpecificNode implements Node {} | 728 abstract class DartSpecificNode implements Node {} |
| 726 | 729 |
| 727 class CreateBox extends Expression implements JsSpecificNode { | 730 class CreateBox extends Expression implements JsSpecificNode { |
| 728 accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this); | 731 accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this); |
| 729 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg); | 732 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg); |
| 730 } | 733 } |
| 731 | 734 |
| 732 class CreateInstance extends Expression implements JsSpecificNode { | 735 class CreateInstance extends Expression implements JsSpecificNode { |
| 733 ClassElement classElement; | 736 ClassElement classElement; |
| 734 List<Expression> arguments; | 737 List<Expression> arguments; |
| 738 List<Expression> typeInformation; | |
| 735 | 739 |
| 736 CreateInstance(this.classElement, this.arguments); | 740 CreateInstance(this.classElement, this.arguments, this.typeInformation); |
| 737 | 741 |
| 738 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this); | 742 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this); |
| 739 accept1(ExpressionVisitor1 visitor, arg) { | 743 accept1(ExpressionVisitor1 visitor, arg) { |
| 740 return visitor.visitCreateInstance(this, arg); | 744 return visitor.visitCreateInstance(this, arg); |
| 741 } | 745 } |
| 742 } | 746 } |
| 743 | 747 |
| 744 class GetField extends Expression implements JsSpecificNode { | 748 class GetField extends Expression implements JsSpecificNode { |
| 745 Expression object; | 749 Expression object; |
| 746 Element field; | 750 Element field; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 | 789 |
| 786 accept(ExpressionVisitor visitor) { | 790 accept(ExpressionVisitor visitor) { |
| 787 return visitor.visitReadTypeVariable(this); | 791 return visitor.visitReadTypeVariable(this); |
| 788 } | 792 } |
| 789 | 793 |
| 790 accept1(ExpressionVisitor1 visitor, arg) { | 794 accept1(ExpressionVisitor1 visitor, arg) { |
| 791 return visitor.visitReadTypeVariable(this, arg); | 795 return visitor.visitReadTypeVariable(this, arg); |
| 792 } | 796 } |
| 793 } | 797 } |
| 794 | 798 |
| 799 /// Denotes the internal representation of [dartType], where all type variables | |
| 800 /// are replaced by the values in [arguments]. | |
| 801 /// (See documentation on the TypeExpression CPS node for more details.) | |
| 802 class TypeExpression extends Expression { | |
| 803 final DartType dartType; | |
| 804 final List<Expression> arguments; | |
| 805 | |
| 806 TypeExpression(this.dartType, this.arguments); | |
| 807 | |
| 808 accept(ExpressionVisitor visitor) { | |
| 809 return visitor.visitTypeExpression(this); | |
| 810 } | |
| 811 | |
| 812 accept1(ExpressionVisitor1 visitor, arg) { | |
| 813 return visitor.visitTypeExpression(this, arg); | |
| 814 } | |
| 815 } | |
| 816 | |
| 795 abstract class ExpressionVisitor<E> { | 817 abstract class ExpressionVisitor<E> { |
| 796 E visitExpression(Expression e) => e.accept(this); | 818 E visitExpression(Expression e) => e.accept(this); |
| 797 E visitVariableUse(VariableUse node); | 819 E visitVariableUse(VariableUse node); |
| 798 E visitInvokeStatic(InvokeStatic node); | 820 E visitInvokeStatic(InvokeStatic node); |
| 799 E visitInvokeMethod(InvokeMethod node); | 821 E visitInvokeMethod(InvokeMethod node); |
| 800 E visitInvokeMethodDirectly(InvokeMethodDirectly node); | 822 E visitInvokeMethodDirectly(InvokeMethodDirectly node); |
| 801 E visitInvokeConstructor(InvokeConstructor node); | 823 E visitInvokeConstructor(InvokeConstructor node); |
| 802 E visitConcatenateStrings(ConcatenateStrings node); | 824 E visitConcatenateStrings(ConcatenateStrings node); |
| 803 E visitConstant(Constant node); | 825 E visitConstant(Constant node); |
| 804 E visitThis(This node); | 826 E visitThis(This node); |
| 805 E visitReifyTypeVar(ReifyTypeVar node); | 827 E visitReifyTypeVar(ReifyTypeVar node); |
| 806 E visitConditional(Conditional node); | 828 E visitConditional(Conditional node); |
| 807 E visitLogicalOperator(LogicalOperator node); | 829 E visitLogicalOperator(LogicalOperator node); |
| 808 E visitNot(Not node); | 830 E visitNot(Not node); |
| 809 E visitLiteralList(LiteralList node); | 831 E visitLiteralList(LiteralList node); |
| 810 E visitLiteralMap(LiteralMap node); | 832 E visitLiteralMap(LiteralMap node); |
| 811 E visitTypeOperator(TypeOperator node); | 833 E visitTypeOperator(TypeOperator node); |
| 812 E visitFunctionExpression(FunctionExpression node); | 834 E visitFunctionExpression(FunctionExpression node); |
| 813 E visitFieldInitializer(FieldInitializer node); | 835 E visitFieldInitializer(FieldInitializer node); |
| 814 E visitSuperInitializer(SuperInitializer node); | 836 E visitSuperInitializer(SuperInitializer node); |
| 815 E visitGetField(GetField node); | 837 E visitGetField(GetField node); |
| 816 E visitCreateBox(CreateBox node); | 838 E visitCreateBox(CreateBox node); |
| 817 E visitCreateInstance(CreateInstance node); | 839 E visitCreateInstance(CreateInstance node); |
| 818 E visitReifyRuntimeType(ReifyRuntimeType node); | 840 E visitReifyRuntimeType(ReifyRuntimeType node); |
| 819 E visitReadTypeVariable(ReadTypeVariable node); | 841 E visitReadTypeVariable(ReadTypeVariable node); |
| 842 E visitTypeExpression(TypeExpression node); | |
| 820 } | 843 } |
| 821 | 844 |
| 822 abstract class ExpressionVisitor1<E, A> { | 845 abstract class ExpressionVisitor1<E, A> { |
| 823 E visitExpression(Expression e, A arg) => e.accept1(this, arg); | 846 E visitExpression(Expression e, A arg) => e.accept1(this, arg); |
| 824 E visitVariableUse(VariableUse node, A arg); | 847 E visitVariableUse(VariableUse node, A arg); |
| 825 E visitInvokeStatic(InvokeStatic node, A arg); | 848 E visitInvokeStatic(InvokeStatic node, A arg); |
| 826 E visitInvokeMethod(InvokeMethod node, A arg); | 849 E visitInvokeMethod(InvokeMethod node, A arg); |
| 827 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); | 850 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); |
| 828 E visitInvokeConstructor(InvokeConstructor node, A arg); | 851 E visitInvokeConstructor(InvokeConstructor node, A arg); |
| 829 E visitConcatenateStrings(ConcatenateStrings node, A arg); | 852 E visitConcatenateStrings(ConcatenateStrings node, A arg); |
| 830 E visitConstant(Constant node, A arg); | 853 E visitConstant(Constant node, A arg); |
| 831 E visitThis(This node, A arg); | 854 E visitThis(This node, A arg); |
| 832 E visitReifyTypeVar(ReifyTypeVar node, A arg); | 855 E visitReifyTypeVar(ReifyTypeVar node, A arg); |
| 833 E visitConditional(Conditional node, A arg); | 856 E visitConditional(Conditional node, A arg); |
| 834 E visitLogicalOperator(LogicalOperator node, A arg); | 857 E visitLogicalOperator(LogicalOperator node, A arg); |
| 835 E visitNot(Not node, A arg); | 858 E visitNot(Not node, A arg); |
| 836 E visitLiteralList(LiteralList node, A arg); | 859 E visitLiteralList(LiteralList node, A arg); |
| 837 E visitLiteralMap(LiteralMap node, A arg); | 860 E visitLiteralMap(LiteralMap node, A arg); |
| 838 E visitTypeOperator(TypeOperator node, A arg); | 861 E visitTypeOperator(TypeOperator node, A arg); |
| 839 E visitFunctionExpression(FunctionExpression node, A arg); | 862 E visitFunctionExpression(FunctionExpression node, A arg); |
| 840 E visitFieldInitializer(FieldInitializer node, A arg); | 863 E visitFieldInitializer(FieldInitializer node, A arg); |
| 841 E visitSuperInitializer(SuperInitializer node, A arg); | 864 E visitSuperInitializer(SuperInitializer node, A arg); |
| 842 E visitGetField(GetField node, A arg); | 865 E visitGetField(GetField node, A arg); |
| 843 E visitCreateBox(CreateBox node, A arg); | 866 E visitCreateBox(CreateBox node, A arg); |
| 844 E visitCreateInstance(CreateInstance node, A arg); | 867 E visitCreateInstance(CreateInstance node, A arg); |
| 845 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); | 868 E visitReifyRuntimeType(ReifyRuntimeType node, A arg); |
| 846 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); | 869 E visitReadTypeVariable(ReadTypeVariable node, A arg); |
| 870 E visitTypeExpression(TypeExpression node, A arg); | |
| 847 } | 871 } |
| 848 | 872 |
| 849 abstract class StatementVisitor<S> { | 873 abstract class StatementVisitor<S> { |
| 850 S visitStatement(Statement s) => s.accept(this); | 874 S visitStatement(Statement s) => s.accept(this); |
| 851 S visitLabeledStatement(LabeledStatement node); | 875 S visitLabeledStatement(LabeledStatement node); |
| 852 S visitAssign(Assign node); | 876 S visitAssign(Assign node); |
| 853 S visitReturn(Return node); | 877 S visitReturn(Return node); |
| 854 S visitBreak(Break node); | 878 S visitBreak(Break node); |
| 855 S visitContinue(Continue node); | 879 S visitContinue(Continue node); |
| 856 S visitIf(If node); | 880 S visitIf(If node); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1067 node.arguments.forEach(visitExpression); | 1091 node.arguments.forEach(visitExpression); |
| 1068 } | 1092 } |
| 1069 | 1093 |
| 1070 visitReifyRuntimeType(ReifyRuntimeType node) { | 1094 visitReifyRuntimeType(ReifyRuntimeType node) { |
| 1071 visitExpression(node.value); | 1095 visitExpression(node.value); |
| 1072 } | 1096 } |
| 1073 | 1097 |
| 1074 visitReadTypeVariable(ReadTypeVariable node) { | 1098 visitReadTypeVariable(ReadTypeVariable node) { |
| 1075 visitExpression(node.target); | 1099 visitExpression(node.target); |
| 1076 } | 1100 } |
| 1101 | |
| 1102 @override | |
| 1103 visitTypeExpression(TypeExpression node) { | |
| 1104 node.arguments.forEach(visitExpression); | |
|
asgerf
2015/03/19 14:53:40
Also visit the type information expressions.
This
karlklose
2015/03/20 07:39:04
Thanks for catching that!
| |
| 1105 } | |
| 1077 } | 1106 } |
| OLD | NEW |