| 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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 | 211 |
| 212 /** | 212 /** |
| 213 * Call to a factory or generative constructor. | 213 * Call to a factory or generative constructor. |
| 214 */ | 214 */ |
| 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 List<Expression> typeArguments; |
| 219 final Selector selector; | 220 final Selector selector; |
| 220 /// TODO(karlklose): get rid of this field. Instead use the constant's | 221 /// TODO(karlklose): get rid of this field. Instead use the constant's |
| 221 /// expression to find the constructor to be called in dart2dart. | 222 /// expression to find the constructor to be called in dart2dart. |
| 222 final values.ConstantValue constant; | 223 final values.ConstantValue constant; |
| 223 | 224 |
| 224 InvokeConstructor(this.type, this.target, this.selector, this.arguments, | 225 InvokeConstructor(this.type, this.target, this.selector, this.arguments, |
| 225 [this.constant]); | 226 this.typeArguments, [this.constant]); |
| 226 | 227 |
| 227 ClassElement get targetClass => target.enclosingElement; | 228 ClassElement get targetClass => target.enclosingElement; |
| 228 | 229 |
| 229 accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this); | 230 accept(ExpressionVisitor visitor) { |
| 231 return visitor.visitInvokeConstructor(this); |
| 232 } |
| 233 |
| 230 accept1(ExpressionVisitor1 visitor, arg) { | 234 accept1(ExpressionVisitor1 visitor, arg) { |
| 231 return visitor.visitInvokeConstructor(this, arg); | 235 return visitor.visitInvokeConstructor(this, arg); |
| 232 } | 236 } |
| 233 } | 237 } |
| 234 | 238 |
| 235 /// Calls [toString] on each argument and concatenates the results. | 239 /// Calls [toString] on each argument and concatenates the results. |
| 236 class ConcatenateStrings extends Expression { | 240 class ConcatenateStrings extends Expression { |
| 237 final List<Expression> arguments; | 241 final List<Expression> arguments; |
| 238 | 242 |
| 239 ConcatenateStrings(this.arguments); | 243 ConcatenateStrings(this.arguments); |
| (...skipping 545 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 class TypeExpression extends Expression { |
| 802 final DartType dartType; |
| 803 final List<Expression> arguments; |
| 804 |
| 805 TypeExpression(this.dartType, this.arguments); |
| 806 |
| 807 accept(ExpressionVisitor visitor) { |
| 808 return visitor.visitTypeExpression(this); |
| 809 } |
| 810 |
| 811 accept1(ExpressionVisitor1 visitor, arg) { |
| 812 return visitor.visitTypeExpression(this, arg); |
| 813 } |
| 814 } |
| 815 |
| 795 abstract class ExpressionVisitor<E> { | 816 abstract class ExpressionVisitor<E> { |
| 796 E visitExpression(Expression e) => e.accept(this); | 817 E visitExpression(Expression e) => e.accept(this); |
| 797 E visitVariableUse(VariableUse node); | 818 E visitVariableUse(VariableUse node); |
| 798 E visitInvokeStatic(InvokeStatic node); | 819 E visitInvokeStatic(InvokeStatic node); |
| 799 E visitInvokeMethod(InvokeMethod node); | 820 E visitInvokeMethod(InvokeMethod node); |
| 800 E visitInvokeMethodDirectly(InvokeMethodDirectly node); | 821 E visitInvokeMethodDirectly(InvokeMethodDirectly node); |
| 801 E visitInvokeConstructor(InvokeConstructor node); | 822 E visitInvokeConstructor(InvokeConstructor node); |
| 802 E visitConcatenateStrings(ConcatenateStrings node); | 823 E visitConcatenateStrings(ConcatenateStrings node); |
| 803 E visitConstant(Constant node); | 824 E visitConstant(Constant node); |
| 804 E visitThis(This node); | 825 E visitThis(This node); |
| 805 E visitReifyTypeVar(ReifyTypeVar node); | 826 E visitReifyTypeVar(ReifyTypeVar node); |
| 806 E visitConditional(Conditional node); | 827 E visitConditional(Conditional node); |
| 807 E visitLogicalOperator(LogicalOperator node); | 828 E visitLogicalOperator(LogicalOperator node); |
| 808 E visitNot(Not node); | 829 E visitNot(Not node); |
| 809 E visitLiteralList(LiteralList node); | 830 E visitLiteralList(LiteralList node); |
| 810 E visitLiteralMap(LiteralMap node); | 831 E visitLiteralMap(LiteralMap node); |
| 811 E visitTypeOperator(TypeOperator node); | 832 E visitTypeOperator(TypeOperator node); |
| 812 E visitFunctionExpression(FunctionExpression node); | 833 E visitFunctionExpression(FunctionExpression node); |
| 813 E visitFieldInitializer(FieldInitializer node); | 834 E visitFieldInitializer(FieldInitializer node); |
| 814 E visitSuperInitializer(SuperInitializer node); | 835 E visitSuperInitializer(SuperInitializer node); |
| 815 E visitGetField(GetField node); | 836 E visitGetField(GetField node); |
| 816 E visitCreateBox(CreateBox node); | 837 E visitCreateBox(CreateBox node); |
| 817 E visitCreateInstance(CreateInstance node); | 838 E visitCreateInstance(CreateInstance node); |
| 818 E visitReifyRuntimeType(ReifyRuntimeType node); | 839 E visitReifyRuntimeType(ReifyRuntimeType node); |
| 819 E visitReadTypeVariable(ReadTypeVariable node); | 840 E visitReadTypeVariable(ReadTypeVariable node); |
| 841 E visitTypeExpression(TypeExpression node); |
| 820 } | 842 } |
| 821 | 843 |
| 822 abstract class ExpressionVisitor1<E, A> { | 844 abstract class ExpressionVisitor1<E, A> { |
| 823 E visitExpression(Expression e, A arg) => e.accept1(this, arg); | 845 E visitExpression(Expression e, A arg) => e.accept1(this, arg); |
| 824 E visitVariableUse(VariableUse node, A arg); | 846 E visitVariableUse(VariableUse node, A arg); |
| 825 E visitInvokeStatic(InvokeStatic node, A arg); | 847 E visitInvokeStatic(InvokeStatic node, A arg); |
| 826 E visitInvokeMethod(InvokeMethod node, A arg); | 848 E visitInvokeMethod(InvokeMethod node, A arg); |
| 827 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); | 849 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); |
| 828 E visitInvokeConstructor(InvokeConstructor node, A arg); | 850 E visitInvokeConstructor(InvokeConstructor node, A arg); |
| 829 E visitConcatenateStrings(ConcatenateStrings node, A arg); | 851 E visitConcatenateStrings(ConcatenateStrings node, A arg); |
| 830 E visitConstant(Constant node, A arg); | 852 E visitConstant(Constant node, A arg); |
| 831 E visitThis(This node, A arg); | 853 E visitThis(This node, A arg); |
| 832 E visitReifyTypeVar(ReifyTypeVar node, A arg); | 854 E visitReifyTypeVar(ReifyTypeVar node, A arg); |
| 833 E visitConditional(Conditional node, A arg); | 855 E visitConditional(Conditional node, A arg); |
| 834 E visitLogicalOperator(LogicalOperator node, A arg); | 856 E visitLogicalOperator(LogicalOperator node, A arg); |
| 835 E visitNot(Not node, A arg); | 857 E visitNot(Not node, A arg); |
| 836 E visitLiteralList(LiteralList node, A arg); | 858 E visitLiteralList(LiteralList node, A arg); |
| 837 E visitLiteralMap(LiteralMap node, A arg); | 859 E visitLiteralMap(LiteralMap node, A arg); |
| 838 E visitTypeOperator(TypeOperator node, A arg); | 860 E visitTypeOperator(TypeOperator node, A arg); |
| 839 E visitFunctionExpression(FunctionExpression node, A arg); | 861 E visitFunctionExpression(FunctionExpression node, A arg); |
| 840 E visitFieldInitializer(FieldInitializer node, A arg); | 862 E visitFieldInitializer(FieldInitializer node, A arg); |
| 841 E visitSuperInitializer(SuperInitializer node, A arg); | 863 E visitSuperInitializer(SuperInitializer node, A arg); |
| 842 E visitGetField(GetField node, A arg); | 864 E visitGetField(GetField node, A arg); |
| 843 E visitCreateBox(CreateBox node, A arg); | 865 E visitCreateBox(CreateBox node, A arg); |
| 844 E visitCreateInstance(CreateInstance node, A arg); | 866 E visitCreateInstance(CreateInstance node, A arg); |
| 845 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); | 867 E visitReifyRuntimeType(ReifyRuntimeType node, A arg); |
| 846 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); | 868 E visitReadTypeVariable(ReadTypeVariable node, A arg); |
| 869 E visitTypeExpression(TypeExpression node, A arg); |
| 847 } | 870 } |
| 848 | 871 |
| 849 abstract class StatementVisitor<S> { | 872 abstract class StatementVisitor<S> { |
| 850 S visitStatement(Statement s) => s.accept(this); | 873 S visitStatement(Statement s) => s.accept(this); |
| 851 S visitLabeledStatement(LabeledStatement node); | 874 S visitLabeledStatement(LabeledStatement node); |
| 852 S visitAssign(Assign node); | 875 S visitAssign(Assign node); |
| 853 S visitReturn(Return node); | 876 S visitReturn(Return node); |
| 854 S visitBreak(Break node); | 877 S visitBreak(Break node); |
| 855 S visitContinue(Continue node); | 878 S visitContinue(Continue node); |
| 856 S visitIf(If node); | 879 S visitIf(If node); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1067 node.arguments.forEach(visitExpression); | 1090 node.arguments.forEach(visitExpression); |
| 1068 } | 1091 } |
| 1069 | 1092 |
| 1070 visitReifyRuntimeType(ReifyRuntimeType node) { | 1093 visitReifyRuntimeType(ReifyRuntimeType node) { |
| 1071 visitExpression(node.value); | 1094 visitExpression(node.value); |
| 1072 } | 1095 } |
| 1073 | 1096 |
| 1074 visitReadTypeVariable(ReadTypeVariable node) { | 1097 visitReadTypeVariable(ReadTypeVariable node) { |
| 1075 visitExpression(node.target); | 1098 visitExpression(node.target); |
| 1076 } | 1099 } |
| 1100 |
| 1101 @override |
| 1102 visitTypeExpression(TypeExpression node) { |
| 1103 node.arguments.forEach(visitExpression); |
| 1104 } |
| 1077 } | 1105 } |
| OLD | NEW |