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 09cc16385b2ca1ce0666d6b15011ef484cf10dcc..9cf0688b1e7d6e5cc635408f90083e868de95588 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 |
@@ -4,6 +4,7 @@ |
import 'package:front_end/src/base/instrumentation.dart'; |
import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
+import 'package:front_end/src/fasta/names.dart' show callName; |
import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'; |
import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'; |
import 'package:front_end/src/fasta/type_inference/type_promotion.dart'; |
@@ -236,14 +237,19 @@ abstract class TypeInferrerImpl extends TypeInferrer { |
/// inference. |
TypePromoter get typePromoter; |
- FunctionType getCalleeFunctionType( |
- Member interfaceMember, DartType receiverType, Name methodName) { |
+ FunctionType getCalleeFunctionType(Member interfaceMember, |
+ DartType receiverType, Name methodName, bool followCall) { |
var type = getCalleeType(interfaceMember, receiverType, methodName); |
if (type is FunctionType) { |
return type; |
- } else { |
- return _functionReturningDynamic; |
+ } else if (followCall && type is InterfaceType) { |
+ var member = classHierarchy.getInterfaceMember(type.classNode, callName); |
+ var callType = member?.getterType; |
+ if (callType is FunctionType) { |
+ return callType; |
+ } |
} |
+ return _functionReturningDynamic; |
} |
DartType getCalleeType( |