Invoke call resolver extension in CallCompleter

so it is called after outer call is resolved (for calls in arguments)
This commit is contained in:
Svetlana Isakova
2014-07-08 15:42:19 +04:00
parent 62cb0d0baf
commit 24e20b2dcf
2 changed files with 13 additions and 11 deletions
@@ -69,18 +69,24 @@ public class CallCompleter(
results: OverloadResolutionResultsImpl<D>,
tracing: TracingStrategy
): OverloadResolutionResultsImpl<D> {
// for the case 'foo(a)' where 'foo' is a variable, the call 'foo.invoke(a)' shouldn't be completed separately,
// it's completed when the outer (variable as function call) is completed
if (CallResolverUtil.isInvokeCallOnVariable(context.call)) return results
val resolvedCall = if (results.isSingleResult()) results.getResultingCall() else null
val temporaryTrace = TemporaryBindingTrace.create(context.trace, "Trace to complete a resulting call")
completeResolvedCallAndArguments(resolvedCall, results, context.replaceBindingTrace(temporaryTrace), tracing)
// for the case 'foo(a)' where 'foo' is a variable, the call 'foo.invoke(a)' shouldn't be completed separately,
// it's completed when the outer (variable as function call) is completed
if (!CallResolverUtil.isInvokeCallOnVariable(context.call)) {
completeAllCandidates(context, results)
val temporaryTrace = TemporaryBindingTrace.create(context.trace, "Trace to complete a resulting call")
completeResolvedCallAndArguments(resolvedCall, results, context.replaceBindingTrace(temporaryTrace), tracing)
completeAllCandidates(context, results)
temporaryTrace.commit()
}
resolvedCall?.let { context.callResolverExtension.run(it, context) }
temporaryTrace.commit()
if (results.isSingleResult() && results.getResultingCall().getStatus().isSuccess()) {
return results.changeStatusToSuccess()
}
@@ -363,10 +363,6 @@ public class CallResolver {
results = callCompleter.completeCall(context, results, tracing);
}
if (results.isSingleResult()) {
context.callResolverExtension.run(results.getResultingCall(), context);
}
return results;
}