| 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 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 void _inferStatement(KernelTypeInferrer inferrer) { | 577 void _inferStatement(KernelTypeInferrer inferrer) { |
| 578 inferrer.listener.ifStatementEnter(this); | 578 inferrer.listener.ifStatementEnter(this); |
| 579 inferrer.inferExpression( | 579 inferrer.inferExpression( |
| 580 condition, inferrer.coreTypes.boolClass.rawType, false); | 580 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 581 inferrer.inferStatement(then); | 581 inferrer.inferStatement(then); |
| 582 if (otherwise != null) inferrer.inferStatement(otherwise); | 582 if (otherwise != null) inferrer.inferStatement(otherwise); |
| 583 inferrer.listener.ifStatementExit(this); | 583 inferrer.listener.ifStatementExit(this); |
| 584 } | 584 } |
| 585 } | 585 } |
| 586 | 586 |
| 587 /// Common base class for shadow objects representing initializers in kernel |
| 588 /// form. |
| 589 abstract class KernelInitializer implements Initializer { |
| 590 /// Performs type inference for whatever concrete type of [KernelInitializer] |
| 591 /// this is. |
| 592 void _inferInitializer(KernelTypeInferrer inferrer); |
| 593 } |
| 594 |
| 587 /// Concrete shadow object representing an integer literal in kernel form. | 595 /// Concrete shadow object representing an integer literal in kernel form. |
| 588 class KernelIntLiteral extends IntLiteral implements KernelExpression { | 596 class KernelIntLiteral extends IntLiteral implements KernelExpression { |
| 589 KernelIntLiteral(int value) : super(value); | 597 KernelIntLiteral(int value) : super(value); |
| 590 | 598 |
| 591 @override | 599 @override |
| 592 DartType _inferExpression( | 600 DartType _inferExpression( |
| 593 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 601 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 594 typeNeeded = | 602 typeNeeded = |
| 595 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded; | 603 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded; |
| 596 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null; | 604 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null; |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 : super.byReference(receiver, name, value, interfaceTargetReference); | 835 : super.byReference(receiver, name, value, interfaceTargetReference); |
| 828 | 836 |
| 829 @override | 837 @override |
| 830 DartType _inferExpression( | 838 DartType _inferExpression( |
| 831 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 839 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 832 // TODO(scheglov): implement. | 840 // TODO(scheglov): implement. |
| 833 return typeNeeded ? const DynamicType() : null; | 841 return typeNeeded ? const DynamicType() : null; |
| 834 } | 842 } |
| 835 } | 843 } |
| 836 | 844 |
| 845 /// Concrete shadow object representing a redirecting initializer in kernel |
| 846 /// form. |
| 847 class KernelRedirectingInitializer extends RedirectingInitializer |
| 848 implements KernelInitializer { |
| 849 KernelRedirectingInitializer(Constructor target, Arguments arguments) |
| 850 : super(target, arguments); |
| 851 |
| 852 @override |
| 853 _inferInitializer(KernelTypeInferrer inferrer) { |
| 854 inferrer.listener.redirectingInitializerEnter(this); |
| 855 inferrer.inferInvocation(null, false, fileOffset, |
| 856 target.function.functionType, target.enclosingClass.thisType, arguments, |
| 857 skipTypeArgumentInference: true); |
| 858 inferrer.listener.redirectingInitializerExit(this); |
| 859 } |
| 860 } |
| 861 |
| 837 /// Shadow object for [Rethrow]. | 862 /// Shadow object for [Rethrow]. |
| 838 class KernelRethrow extends Rethrow implements KernelExpression { | 863 class KernelRethrow extends Rethrow implements KernelExpression { |
| 839 @override | 864 @override |
| 840 DartType _inferExpression( | 865 DartType _inferExpression( |
| 841 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 866 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 842 // TODO(scheglov): implement. | 867 // TODO(scheglov): implement. |
| 843 return typeNeeded ? const DynamicType() : null; | 868 return typeNeeded ? const DynamicType() : null; |
| 844 } | 869 } |
| 845 } | 870 } |
| 846 | 871 |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 } | 1196 } |
| 1172 } | 1197 } |
| 1173 | 1198 |
| 1174 @override | 1199 @override |
| 1175 DartType inferFieldTopLevel( | 1200 DartType inferFieldTopLevel( |
| 1176 KernelField field, DartType type, bool typeNeeded) { | 1201 KernelField field, DartType type, bool typeNeeded) { |
| 1177 return inferExpression(field.initializer, type, typeNeeded); | 1202 return inferExpression(field.initializer, type, typeNeeded); |
| 1178 } | 1203 } |
| 1179 | 1204 |
| 1180 @override | 1205 @override |
| 1206 void inferInitializer(Initializer initializer) { |
| 1207 if (initializer is KernelInitializer) { |
| 1208 // Use polymorphic dispatch on [KernelInitializer] to perform whatever |
| 1209 // kind of type inference is correct for this kind of initializer. |
| 1210 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 1211 // so that the type hierarchy will be simpler (which may speed up "is" |
| 1212 // checks). |
| 1213 return initializer._inferInitializer(this); |
| 1214 } else { |
| 1215 // Encountered an initializer type for which type inference is not yet |
| 1216 // implemented, so just skip it for now. |
| 1217 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 1218 // everything, this case should no longer be needed. |
| 1219 } |
| 1220 } |
| 1221 |
| 1222 @override |
| 1181 void inferStatement(Statement statement) { | 1223 void inferStatement(Statement statement) { |
| 1182 if (statement is KernelStatement) { | 1224 if (statement is KernelStatement) { |
| 1183 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind | 1225 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind |
| 1184 // of type inference is correct for this kind of statement. | 1226 // of type inference is correct for this kind of statement. |
| 1185 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 1227 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 1186 // so that the type hierarchy will be simpler (which may speed up "is" | 1228 // so that the type hierarchy will be simpler (which may speed up "is" |
| 1187 // checks). | 1229 // checks). |
| 1188 return statement._inferStatement(this); | 1230 return statement._inferStatement(this); |
| 1189 } else { | 1231 } else { |
| 1190 // Encountered a statement type for which type inference is not yet | 1232 // Encountered a statement type for which type inference is not yet |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 closureContext.isAsync | 1451 closureContext.isAsync |
| 1410 ? inferrer.coreTypes.streamClass | 1452 ? inferrer.coreTypes.streamClass |
| 1411 : inferrer.coreTypes.iterableClass); | 1453 : inferrer.coreTypes.iterableClass); |
| 1412 } | 1454 } |
| 1413 var inferredType = inferrer.inferExpression( | 1455 var inferredType = inferrer.inferExpression( |
| 1414 expression, typeContext, closureContext != null); | 1456 expression, typeContext, closureContext != null); |
| 1415 closureContext.handleYield(inferrer, isYieldStar, inferredType); | 1457 closureContext.handleYield(inferrer, isYieldStar, inferredType); |
| 1416 inferrer.listener.yieldStatementExit(this); | 1458 inferrer.listener.yieldStatementExit(this); |
| 1417 } | 1459 } |
| 1418 } | 1460 } |
| OLD | NEW |