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

Unified Diff: pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart

Issue 2944933002: Implement type inference for null-aware property gets. (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 side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698