| 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 /// This file declares a "shadow hierarchy" of concrete classes which extend | 5 /// This file declares a "shadow hierarchy" of concrete classes which extend |
| 6 /// the kernel class hierarchy, adding methods and fields needed by the | 6 /// the kernel class hierarchy, adding methods and fields needed by the |
| 7 /// BodyBuilder. | 7 /// BodyBuilder. |
| 8 /// | 8 /// |
| 9 /// Instances of these classes may be created using the factory methods in | 9 /// Instances of these classes may be created using the factory methods in |
| 10 /// `ast_factory.dart`. | 10 /// `ast_factory.dart`. |
| (...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 @override | 1063 @override |
| 1064 FieldNode createFieldNode(KernelField field) { | 1064 FieldNode createFieldNode(KernelField field) { |
| 1065 FieldNode fieldNode = new FieldNode(this, field); | 1065 FieldNode fieldNode = new FieldNode(this, field); |
| 1066 field._fieldNode = fieldNode; | 1066 field._fieldNode = fieldNode; |
| 1067 return fieldNode; | 1067 return fieldNode; |
| 1068 } | 1068 } |
| 1069 | 1069 |
| 1070 @override | 1070 @override |
| 1071 KernelTypeInferrer createLocalTypeInferrer( | 1071 KernelTypeInferrer createLocalTypeInferrer( |
| 1072 Uri uri, TypeInferenceListener listener) { | 1072 Uri uri, TypeInferenceListener listener) { |
| 1073 return new KernelTypeInferrer._(this, uri.toString(), listener); | 1073 return new KernelTypeInferrer._(this, uri.toString(), listener, false); |
| 1074 } | 1074 } |
| 1075 | 1075 |
| 1076 @override | 1076 @override |
| 1077 KernelTypeInferrer createTopLevelTypeInferrer( | 1077 KernelTypeInferrer createTopLevelTypeInferrer( |
| 1078 KernelField field, TypeInferenceListener listener) { | 1078 KernelField field, TypeInferenceListener listener) { |
| 1079 return field._typeInferrer = | 1079 return field._typeInferrer = |
| 1080 new KernelTypeInferrer._(this, getFieldUri(field), listener); | 1080 new KernelTypeInferrer._(this, getFieldUri(field), listener, true); |
| 1081 } | 1081 } |
| 1082 | 1082 |
| 1083 @override | 1083 @override |
| 1084 bool fieldHasInitializer(KernelField field) { | 1084 bool fieldHasInitializer(KernelField field) { |
| 1085 return field.initializer != null; | 1085 return field.initializer != null; |
| 1086 } | 1086 } |
| 1087 | 1087 |
| 1088 @override | 1088 @override |
| 1089 DartType getFieldDeclaredType(KernelField field) { | 1089 DartType getFieldDeclaredType(KernelField field) { |
| 1090 return field._implicitlyTyped ? null : field.type; | 1090 return field._implicitlyTyped ? null : field.type; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1121 } | 1121 } |
| 1122 } | 1122 } |
| 1123 | 1123 |
| 1124 /// Concrete implementation of [TypeInferrer] specialized to work with kernel | 1124 /// Concrete implementation of [TypeInferrer] specialized to work with kernel |
| 1125 /// objects. | 1125 /// objects. |
| 1126 class KernelTypeInferrer extends TypeInferrerImpl { | 1126 class KernelTypeInferrer extends TypeInferrerImpl { |
| 1127 @override | 1127 @override |
| 1128 final typePromoter = new KernelTypePromoter(); | 1128 final typePromoter = new KernelTypePromoter(); |
| 1129 | 1129 |
| 1130 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri, | 1130 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri, |
| 1131 TypeInferenceListener listener) | 1131 TypeInferenceListener listener, bool topLevel) |
| 1132 : super(engine, uri, listener); | 1132 : super(engine, uri, listener, topLevel); |
| 1133 | 1133 |
| 1134 @override | 1134 @override |
| 1135 Expression getFieldInitializer(KernelField field) { | 1135 Expression getFieldInitializer(KernelField field) { |
| 1136 return field.initializer; | 1136 return field.initializer; |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 @override | 1139 @override |
| 1140 FieldNode getFieldNodeForReadTarget(Member readTarget) { | 1140 FieldNode getFieldNodeForReadTarget(Member readTarget) { |
| 1141 if (readTarget is KernelField) { | 1141 if (readTarget is KernelField) { |
| 1142 return readTarget._fieldNode; | 1142 return readTarget._fieldNode; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1158 } else { | 1158 } else { |
| 1159 // Encountered an expression type for which type inference is not yet | 1159 // Encountered an expression type for which type inference is not yet |
| 1160 // implemented, so just infer dynamic for now. | 1160 // implemented, so just infer dynamic for now. |
| 1161 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 1161 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 1162 // everything, this case should no longer be needed. | 1162 // everything, this case should no longer be needed. |
| 1163 return typeNeeded ? const DynamicType() : null; | 1163 return typeNeeded ? const DynamicType() : null; |
| 1164 } | 1164 } |
| 1165 } | 1165 } |
| 1166 | 1166 |
| 1167 @override | 1167 @override |
| 1168 DartType inferFieldInitializer( | 1168 DartType inferFieldTopLevel( |
| 1169 KernelField field, DartType type, bool typeNeeded) { | 1169 KernelField field, DartType type, bool typeNeeded) { |
| 1170 return inferExpression(field.initializer, type, typeNeeded); | 1170 return inferExpression(field.initializer, type, typeNeeded); |
| 1171 } | 1171 } |
| 1172 | 1172 |
| 1173 @override | 1173 @override |
| 1174 void inferStatement(Statement statement) { | 1174 void inferStatement(Statement statement) { |
| 1175 if (statement is KernelStatement) { | 1175 if (statement is KernelStatement) { |
| 1176 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind | 1176 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind |
| 1177 // of type inference is correct for this kind of statement. | 1177 // of type inference is correct for this kind of statement. |
| 1178 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 1178 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 closureContext.isAsync | 1402 closureContext.isAsync |
| 1403 ? inferrer.coreTypes.streamClass | 1403 ? inferrer.coreTypes.streamClass |
| 1404 : inferrer.coreTypes.iterableClass); | 1404 : inferrer.coreTypes.iterableClass); |
| 1405 } | 1405 } |
| 1406 var inferredType = inferrer.inferExpression( | 1406 var inferredType = inferrer.inferExpression( |
| 1407 expression, typeContext, closureContext != null); | 1407 expression, typeContext, closureContext != null); |
| 1408 closureContext.handleYield(inferrer, isYieldStar, inferredType); | 1408 closureContext.handleYield(inferrer, isYieldStar, inferredType); |
| 1409 inferrer.listener.yieldStatementExit(this); | 1409 inferrer.listener.yieldStatementExit(this); |
| 1410 } | 1410 } |
| 1411 } | 1411 } |
| OLD | NEW |