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 ceddac428b49d3beb1a46617614ff907f9ac5ff8..344851102078e9336c4436672b256e80337c4714 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 |
@@ -25,6 +25,7 @@ import 'package:kernel/ast.dart' |
FunctionType, |
Initializer, |
InterfaceType, |
+ InvocationExpression, |
Member, |
MethodInvocation, |
Name, |
@@ -33,6 +34,7 @@ import 'package:kernel/ast.dart' |
PropertyGet, |
PropertySet, |
Statement, |
+ SuperMethodInvocation, |
SuperPropertyGet, |
SuperPropertySet, |
TypeParameterType, |
@@ -266,19 +268,34 @@ abstract class TypeInferrerImpl extends TypeInferrer { |
/// Finds a member of [receiverType] called [name], and if it is found, |
/// reports it through instrumentation and records it in [methodInvocation]. |
Member findMethodInvocationMember( |
- DartType receiverType, MethodInvocation methodInvocation, |
+ DartType receiverType, InvocationExpression methodInvocation, |
{bool silent: false}) { |
- var interfaceMember = findInterfaceMember( |
- receiverType, methodInvocation.name, methodInvocation.fileOffset, |
- silent: silent); |
- methodInvocation.interfaceTarget = interfaceMember; |
- return interfaceMember; |
+ // TODO(paulberry): could we add getters to InvocationExpression to make |
+ // these is-checks unnecessary? |
+ if (methodInvocation is MethodInvocation) { |
+ var interfaceMember = findInterfaceMember( |
+ receiverType, methodInvocation.name, methodInvocation.fileOffset, |
+ silent: silent); |
+ methodInvocation.interfaceTarget = interfaceMember; |
+ return interfaceMember; |
+ } else if (methodInvocation is SuperMethodInvocation) { |
+ var interfaceMember = findInterfaceMember( |
+ receiverType, methodInvocation.name, methodInvocation.fileOffset, |
+ silent: silent); |
+ methodInvocation.interfaceTarget = interfaceMember; |
+ return interfaceMember; |
+ } else { |
+ throw internalError( |
+ 'Unexpected invocation type: ${methodInvocation.runtimeType}'); |
+ } |
} |
/// Finds a member of [receiverType] called [name], and if it is found, |
/// reports it through instrumentation and records it in [propertyGet]. |
Member findPropertyGetMember(DartType receiverType, Expression propertyGet, |
{bool silent: false}) { |
+ // TODO(paulberry): could we add a common base class to PropertyGet and |
+ // SuperPropertyGet to make these is-checks unnecessary? |
if (propertyGet is PropertyGet) { |
var interfaceMember = findInterfaceMember( |
receiverType, propertyGet.name, propertyGet.fileOffset, |