Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2905163002: Perform type inference on redirecting initializers (`C() : this(...);`). (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698