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

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

Issue 2905123002: Perform type inference on explicitly typed fields. (Closed)
Patch Set: Created 3 years, 6 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 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698