| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart'; | 8 import '../common/names.dart'; |
| 9 import '../compiler.dart'; | 9 import '../compiler.dart'; |
| 10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 GlobalTypeInferenceElementData lookupDataOfMember(MemberElement element); | 125 GlobalTypeInferenceElementData lookupDataOfMember(MemberElement element); |
| 126 | 126 |
| 127 bool checkIfExposesThis(ConstructorElement element); | 127 bool checkIfExposesThis(ConstructorElement element); |
| 128 | 128 |
| 129 void recordExposesThis(ConstructorElement element, bool exposesThis); | 129 void recordExposesThis(ConstructorElement element, bool exposesThis); |
| 130 | 130 |
| 131 /// Records that the return type [element] is of type [type]. | 131 /// Records that the return type [element] is of type [type]. |
| 132 void recordReturnType(MethodElement element, TypeInformation type); | 132 void recordReturnType(MethodElement element, TypeInformation type); |
| 133 | 133 |
| 134 /// Records that [element] is of type [type]. | 134 /// Records that [element] is of type [type]. |
| 135 // TODO(johnniwinther): Merge [recordTypeOfFinalField] and | |
| 136 // [recordTypeOfNonFinalField] with this? | |
| 137 void recordTypeOfField(FieldElement element, TypeInformation type); | 135 void recordTypeOfField(FieldElement element, TypeInformation type); |
| 138 | 136 |
| 139 /// Records that [node] sets final field [element] to be of type [type]. | |
| 140 void recordTypeOfFinalField(FieldElement element, TypeInformation type); | |
| 141 | |
| 142 /// Records that [node] sets non-final field [element] to be of type [type]. | |
| 143 void recordTypeOfNonFinalField(FieldElement element, TypeInformation type); | |
| 144 | |
| 145 /// Records that the captured variable [local] is read. | |
| 146 // TODO(johnniwinther): Remove this. | |
| 147 void recordCapturedLocalRead(Local local) {} | |
| 148 | |
| 149 /// Records that the variable [local] is being updated. | |
| 150 // TODO(johnniwinther): Remove this. | |
| 151 void recordLocalUpdate(Local local, TypeInformation type) {} | |
| 152 | |
| 153 /// Registers a call to await with an expression of type [argumentType] as | 137 /// Registers a call to await with an expression of type [argumentType] as |
| 154 /// argument. | 138 /// argument. |
| 155 TypeInformation registerAwait(ast.Node node, TypeInformation argument); | 139 TypeInformation registerAwait(ast.Node node, TypeInformation argument); |
| 156 | 140 |
| 157 /// Registers a call to yield with an expression of type [argumentType] as | 141 /// Registers a call to yield with an expression of type [argumentType] as |
| 158 /// argument. | 142 /// argument. |
| 159 TypeInformation registerYield(ast.Node node, TypeInformation argument); | 143 TypeInformation registerYield(ast.Node node, TypeInformation argument); |
| 160 | 144 |
| 161 /// Registers that [caller] calls [closure] with [arguments]. | 145 /// Registers that [caller] calls [closure] with [arguments]. |
| 162 /// | 146 /// |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 } | 698 } |
| 715 } | 699 } |
| 716 recordTypeOfField(element, type); | 700 recordTypeOfField(element, type); |
| 717 } else if (!element.isInstanceMember) { | 701 } else if (!element.isInstanceMember) { |
| 718 recordTypeOfField(element, types.nullType); | 702 recordTypeOfField(element, types.nullType); |
| 719 } | 703 } |
| 720 } else if (initializer == null) { | 704 } else if (initializer == null) { |
| 721 // Only update types of static fields if there is no | 705 // Only update types of static fields if there is no |
| 722 // assignment. Instance fields are dealt with in the constructor. | 706 // assignment. Instance fields are dealt with in the constructor. |
| 723 if (Elements.isStaticOrTopLevelField(element)) { | 707 if (Elements.isStaticOrTopLevelField(element)) { |
| 724 recordTypeOfNonFinalField(element, type); | 708 recordTypeOfField(element, type); |
| 725 } | 709 } |
| 726 } else { | 710 } else { |
| 727 recordTypeOfNonFinalField(element, type); | 711 recordTypeOfField(element, type); |
| 728 } | 712 } |
| 729 if (Elements.isStaticOrTopLevelField(element) && | 713 if (Elements.isStaticOrTopLevelField(element) && |
| 730 resolvedAst.body != null && | 714 resolvedAst.body != null && |
| 731 !element.isConst) { | 715 !element.isConst) { |
| 732 dynamic argument = resolvedAst.body; | 716 dynamic argument = resolvedAst.body; |
| 733 // TODO(13429): We could do better here by using the | 717 // TODO(13429): We could do better here by using the |
| 734 // constant handler to figure out if it's a lazy field or not. | 718 // constant handler to figure out if it's a lazy field or not. |
| 735 if (argument.asSend() != null || | 719 if (argument.asSend() != null || |
| 736 (argument.asNewExpression() != null && !argument.isConst)) { | 720 (argument.asNewExpression() != null && !argument.isConst)) { |
| 737 recordTypeOfField(element, types.nullType); | 721 recordTypeOfField(element, types.nullType); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 TypeInformation typeOfMember(MemberElement element) { | 900 TypeInformation typeOfMember(MemberElement element) { |
| 917 if (element is MethodElement) return types.functionType; | 901 if (element is MethodElement) return types.functionType; |
| 918 return types.getInferredTypeOfMember(element); | 902 return types.getInferredTypeOfMember(element); |
| 919 } | 903 } |
| 920 | 904 |
| 921 TypeInformation returnTypeOfMember(MemberElement element) { | 905 TypeInformation returnTypeOfMember(MemberElement element) { |
| 922 if (element is! MethodElement) return types.dynamicType; | 906 if (element is! MethodElement) return types.dynamicType; |
| 923 return types.getInferredTypeOfMember(element); | 907 return types.getInferredTypeOfMember(element); |
| 924 } | 908 } |
| 925 | 909 |
| 926 void recordTypeOfFinalField(FieldElement element, TypeInformation type) { | |
| 927 types.getInferredTypeOfMember(element).addAssignment(type); | |
| 928 } | |
| 929 | |
| 930 void recordTypeOfNonFinalField(FieldElement element, TypeInformation type) { | |
| 931 types.getInferredTypeOfMember(element).addAssignment(type); | |
| 932 } | |
| 933 | |
| 934 void recordTypeOfField(FieldElement element, TypeInformation type) { | 910 void recordTypeOfField(FieldElement element, TypeInformation type) { |
| 935 types.getInferredTypeOfMember(element).addAssignment(type); | 911 types.getInferredTypeOfMember(element).addAssignment(type); |
| 936 } | 912 } |
| 937 | 913 |
| 938 void recordReturnType(MethodElement element, TypeInformation type) { | 914 void recordReturnType(MethodElement element, TypeInformation type) { |
| 939 TypeInformation info = types.getInferredTypeOfMember(element); | 915 TypeInformation info = types.getInferredTypeOfMember(element); |
| 940 if (element.name == '==') { | 916 if (element.name == '==') { |
| 941 // Even if x.== doesn't return a bool, 'x == null' evaluates to 'false'. | 917 // Even if x.== doesn't return a bool, 'x == null' evaluates to 'false'. |
| 942 info.addAssignment(types.boolType); | 918 info.addAssignment(types.boolType); |
| 943 } | 919 } |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 @override | 1243 @override |
| 1268 bool checkPhiNode(ast.Node node) { | 1244 bool checkPhiNode(ast.Node node) { |
| 1269 return true; | 1245 return true; |
| 1270 } | 1246 } |
| 1271 | 1247 |
| 1272 @override | 1248 @override |
| 1273 bool checkClassEntity(covariant ClassElement cls) { | 1249 bool checkClassEntity(covariant ClassElement cls) { |
| 1274 return cls.isDeclaration; | 1250 return cls.isDeclaration; |
| 1275 } | 1251 } |
| 1276 } | 1252 } |
| OLD | NEW |