Index: pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
index c390ac4a8fc1755ce3746c92951c20231ef82f54..11e8bb3d222c6db8f2742592e8bfb741a206d80a 100644 |
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart |
@@ -627,6 +627,46 @@ abstract class TypeInferrerImpl extends TypeInferrer { |
inferExpression(initializer, declaredType, false); |
} |
+ /// Performs the core type inference algorithm for property gets (this handles |
+ /// both null-aware and non-null-aware property gets). |
+ DartType inferPropertyGet( |
+ Expression expression, |
+ Expression receiver, |
+ int fileOffset, |
+ PropertyGet desugaredGet, |
+ DartType typeContext, |
+ bool typeNeeded) { |
+ typeNeeded = |
+ listener.propertyGetEnter(expression, typeContext) || typeNeeded; |
+ // First infer the receiver so we can look up the getter that was invoked. |
+ var receiverType = inferExpression(receiver, null, true); |
+ Member interfaceMember = |
+ findInterfaceMember(receiverType, desugaredGet.name, fileOffset); |
+ if (isTopLevel && |
+ ((interfaceMember is Procedure && |
+ interfaceMember.kind == ProcedureKind.Getter) || |
+ interfaceMember is Field)) { |
+ if (TypeInferenceEngineImpl.fullTopLevelInference) { |
+ if (interfaceMember is KernelField) { |
+ var fieldNode = KernelMember.getFieldNode(interfaceMember); |
+ if (fieldNode != null) { |
+ engine.inferFieldFused(fieldNode, this.fieldNode); |
+ } |
+ } |
+ } else { |
+ // References to fields and getters can't be relied upon for top level |
+ // inference. |
+ recordNotImmediatelyEvident(fileOffset); |
+ } |
+ } |
+ desugaredGet.interfaceTarget = interfaceMember; |
+ var inferredType = |
+ getCalleeType(interfaceMember, receiverType, desugaredGet.name); |
+ // TODO(paulberry): Infer tear-off type arguments if appropriate. |
+ listener.propertyGetExit(expression, inferredType); |
+ return typeNeeded ? inferredType : null; |
+ } |
+ |
/// Modifies a type as appropriate when inferring a closure return type. |
DartType inferReturnType(DartType returnType, bool isExpressionFunction) { |
if (returnType == null) { |