Changed order in call completer

update resolution status (and report error) after completing all arguments
This commit is contained in:
Svetlana Isakova
2014-05-20 18:26:38 +04:00
parent c204ae2da1
commit 12ddf76df4
@@ -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 <D : CallableDescriptor> completeResolvedCall(
resolvedCall: MutableResolvedCall<D>,
private fun <D : CallableDescriptor> completeResolvedCallAndArguments(
resolvedCall: MutableResolvedCall<D>?,
results: OverloadResolutionResultsImpl<D>,
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()
}