diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt index a9ddcc01721..530bc0b2361 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallCompleter.kt @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.calls import javax.inject.Inject import kotlin.properties.Delegates -import java.util.ArrayList import org.jetbrains.jet.lang.descriptors.CallableDescriptor import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl @@ -41,7 +40,6 @@ import org.jetbrains.jet.lang.psi.ValueArgument import org.jetbrains.jet.lang.resolve.calls.model.ArgumentMapping import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo import org.jetbrains.jet.lang.resolve.calls.model.ArgumentUnmapped -import org.jetbrains.jet.lang.resolve.calls.util.CallMaker import org.jetbrains.jet.lang.resolve.calls.model.ArgumentMatch import org.jetbrains.jet.lang.psi.JetWhenExpression import org.jetbrains.jet.lang.resolve.BindingContext @@ -73,14 +71,14 @@ public class CallCompleter( // it's completed when the outer (variable as function call) is completed if (CallResolverUtil.isInvokeCallOnVariable(context.call)) return results - if (results.isSingleResult()) { - completeResolvedCall(results.getResultingCall(), context, tracing) - } - if (context.checkArguments == CheckValueArgumentsMode.ENABLED) { - completeArguments(context, 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) completeAllCandidates(context, results) + + temporaryTrace.commit() if (results.isSingleResult() && results.getResultingCall().getStatus().isSuccess()) { return results.changeStatusToSuccess() } @@ -103,21 +101,26 @@ public class CallCompleter( resolvedCall -> val temporaryBindingTrace = TemporaryBindingTrace.create(context.trace, "Trace to complete a candidate that is not a resulting call") - completeResolvedCall(resolvedCall, context.replaceBindingTrace(temporaryBindingTrace), TracingStrategy.EMPTY) + completeResolvedCallAndArguments(resolvedCall, results, context.replaceBindingTrace(temporaryBindingTrace), TracingStrategy.EMPTY) } } - private fun completeResolvedCall( - resolvedCall: MutableResolvedCall, + private fun completeResolvedCallAndArguments( + resolvedCall: MutableResolvedCall?, + results: OverloadResolutionResultsImpl, context: BasicCallResolutionContext, tracing: TracingStrategy ) { - if (resolvedCall.isCompleted() || resolvedCall.getConstraintSystem() == null) { - resolvedCall.markCallAsCompleted() + if (resolvedCall == null || resolvedCall.isCompleted() || resolvedCall.getConstraintSystem() == null) { + completeArguments(context, results) + resolvedCall?.markCallAsCompleted() return } resolvedCall.completeConstraintSystem(context.expectedType, context.trace) + + completeArguments(context, results) + resolvedCall.updateResolutionStatusFromConstraintSystem(context, tracing) resolvedCall.markCallAsCompleted() }