Changed order in call completer
update resolution status (and report error) after completing all arguments
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user