diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 2a07534a769..a041282b937 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -345,7 +345,7 @@ public class CallResolver { } if (results == null) { BasicCallResolutionContext newContext = context.replaceBindingTrace(traceToResolveCall); - results = doResolveCall(newContext, prioritizedTasks, callTransformer, tracing); + results = doResolveCallAndRecordDebugInfo(newContext, prioritizedTasks, callTransformer, tracing); DelegatingBindingTrace deltasTraceForTypeInference = ((OverloadResolutionResultsImpl) results).getTrace(); if (deltasTraceForTypeInference != null) { deltasTraceForTypeInference.addAllMyDataTo(traceToResolveCall); @@ -459,7 +459,7 @@ public class CallResolver { } @NotNull - private OverloadResolutionResultsImpl doResolveCall( + private OverloadResolutionResultsImpl doResolveCallAndRecordDebugInfo( @NotNull BasicCallResolutionContext context, @NotNull List> prioritizedTasks, // high to low priority @NotNull CallTransformer callTransformer, @@ -477,6 +477,20 @@ public class CallResolver { debugInfo.set(ResolutionDebugInfo.TASKS, prioritizedTasks); + OverloadResolutionResultsImpl results = doResolveCall(context, prioritizedTasks, callTransformer, tracing); + if (results.isSingleResult()) { + debugInfo.set(ResolutionDebugInfo.RESULT, results.getResultingCall()); + } + return results; + } + + @NotNull + private OverloadResolutionResultsImpl doResolveCall( + @NotNull BasicCallResolutionContext context, + @NotNull List> prioritizedTasks, // high to low priority + @NotNull CallTransformer callTransformer, + @NotNull TracingStrategy tracing + ) { if (context.checkArguments == CheckValueArgumentsMode.ENABLED) { argumentTypeResolver.analyzeArgumentsAndRecordTypes(context); } @@ -484,15 +498,12 @@ public class CallResolver { TemporaryBindingTrace traceForFirstNonemptyCandidateSet = null; OverloadResolutionResultsImpl resultsForFirstNonemptyCandidateSet = null; for (ResolutionTask task : prioritizedTasks) { - TemporaryBindingTrace taskTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve a task for", task.call.getCalleeExpression()); + TemporaryBindingTrace taskTrace = + TemporaryBindingTrace.create(context.trace, "trace to resolve a task for", task.call.getCalleeExpression()); OverloadResolutionResultsImpl results = performResolutionGuardedForExtraFunctionLiteralArguments( task.replaceBindingTrace(taskTrace), callTransformer); if (results.isSuccess() || results.isAmbiguity()) { taskTrace.commit(); - - if (results.isSuccess()) { - debugInfo.set(ResolutionDebugInfo.RESULT, results.getResultingCall()); - } return results; } if (results.getResultCode() == INCOMPLETE_TYPE_INFERENCE) { @@ -500,25 +511,20 @@ public class CallResolver { return results; } boolean updateResults = traceForFirstNonemptyCandidateSet == null - || (resultsForFirstNonemptyCandidateSet.getResultCode() == CANDIDATES_WITH_WRONG_RECEIVER && - results.getResultCode() != CANDIDATES_WITH_WRONG_RECEIVER); + || (resultsForFirstNonemptyCandidateSet.getResultCode() == CANDIDATES_WITH_WRONG_RECEIVER + && results.getResultCode() != CANDIDATES_WITH_WRONG_RECEIVER); if (!task.getCandidates().isEmpty() && !results.isNothing() && updateResults) { traceForFirstNonemptyCandidateSet = taskTrace; resultsForFirstNonemptyCandidateSet = results; } } - if (traceForFirstNonemptyCandidateSet != null) { - traceForFirstNonemptyCandidateSet.commit(); - if (resultsForFirstNonemptyCandidateSet.isSingleResult()) { - - debugInfo.set(ResolutionDebugInfo.RESULT, resultsForFirstNonemptyCandidateSet.getResultingCall()); - } - } - else { + if (traceForFirstNonemptyCandidateSet == null) { tracing.unresolvedReference(context.trace); argumentTypeResolver.checkTypesWithNoCallee(context, SHAPE_FUNCTION_ARGUMENTS); + return OverloadResolutionResultsImpl.nameNotFound(); } - return resultsForFirstNonemptyCandidateSet != null ? resultsForFirstNonemptyCandidateSet : OverloadResolutionResultsImpl.nameNotFound(); + traceForFirstNonemptyCandidateSet.commit(); + return resultsForFirstNonemptyCandidateSet; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////