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 cc6204cb1abfff1a370568e46c58bb2a1fd9a997..5a2029a3d9ab3b8132af9f70d3b1661eaa2ab71b 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 |
@@ -780,11 +780,14 @@ abstract class TypeInferrerImpl extends TypeInferrer { |
Expression expression, |
Expression receiver, |
int fileOffset, |
- MethodInvocation desugaredInvocation, |
bool isImplicitCall, |
DartType typeContext, |
bool typeNeeded, |
- {VariableDeclaration receiverVariable}) { |
+ {VariableDeclaration receiverVariable, |
+ MethodInvocation desugaredInvocation, |
+ Member interfaceMember, |
+ Name methodName, |
+ Arguments arguments}) { |
typeNeeded = |
listener.methodInvocationEnter(expression, typeContext) || typeNeeded; |
// First infer the receiver so we can look up the method that was invoked. |
@@ -793,31 +796,32 @@ abstract class TypeInferrerImpl extends TypeInferrer { |
receiverVariable?.type = receiverType; |
} |
bool isOverloadedArithmeticOperator = false; |
- Member interfaceMember = |
+ interfaceMember ??= |
findMethodInvocationMember(receiverType, desugaredInvocation); |
+ methodName ??= desugaredInvocation.name; |
+ arguments ??= desugaredInvocation.arguments; |
if (interfaceMember is Procedure) { |
isOverloadedArithmeticOperator = typeSchemaEnvironment |
.isOverloadedArithmeticOperatorAndType(interfaceMember, receiverType); |
} |
- var calleeType = getCalleeFunctionType(interfaceMember, receiverType, |
- desugaredInvocation.name, !isImplicitCall); |
+ var calleeType = getCalleeFunctionType( |
+ interfaceMember, receiverType, methodName, !isImplicitCall); |
bool forceArgumentInference = false; |
if (isDryRun) { |
- if (_isUserDefinableOperator(desugaredInvocation.name.name)) { |
+ if (_isUserDefinableOperator(methodName.name)) { |
// If this is an overloadable arithmetic operator, then type inference |
// might depend on the RHS, so conservatively assume it does. |
forceArgumentInference = |
- isOverloadableArithmeticOperator(desugaredInvocation.name.name); |
+ isOverloadableArithmeticOperator(methodName.name); |
} else { |
// If no type arguments were given, then type inference might depend on |
// the arguments (because the called method might be generic), so |
// conservatively assume it does. |
- forceArgumentInference = |
- getExplicitTypeArguments(desugaredInvocation.arguments) == null; |
+ forceArgumentInference = getExplicitTypeArguments(arguments) == null; |
} |
} |
var inferredType = inferInvocation(typeContext, typeNeeded, fileOffset, |
- calleeType, calleeType.returnType, desugaredInvocation.arguments, |
+ calleeType, calleeType.returnType, arguments, |
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator, |
receiverType: receiverType, |
forceArgumentInference: forceArgumentInference); |