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 d40bfda16b4..5a1b5923a77 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 @@ -403,7 +403,7 @@ public class CallResolver { for (ResolutionTask task : prioritizedTasks) { TemporaryBindingTrace taskTrace = TemporaryBindingTrace.create(context.trace, "trace to resolve a task for", task.reference); OverloadResolutionResultsImpl results = performResolutionGuardedForExtraFunctionLiteralArguments( - task.replaceBindingTrace(taskTrace), callTransformer, context.trace); + task.replaceBindingTrace(taskTrace), callTransformer); if (results.isSuccess() || results.isAmbiguity()) { taskTrace.commit(); @@ -456,9 +456,9 @@ public class CallResolver { @NotNull private OverloadResolutionResultsImpl performResolutionGuardedForExtraFunctionLiteralArguments( @NotNull ResolutionTask task, - @NotNull CallTransformer callTransformer, - @NotNull BindingTrace traceForResolutionCache) { - OverloadResolutionResultsImpl results = performResolution(task, callTransformer, traceForResolutionCache); + @NotNull CallTransformer callTransformer + ) { + OverloadResolutionResultsImpl results = performResolution(task, callTransformer); // If resolution fails, we should check for some of the following situations: // class A { @@ -482,17 +482,18 @@ public class CallResolver { // We have some candidates that failed for some reason // And we have a suspect: the function literal argument // Now, we try to remove this argument and see if it helps - ResolutionTask newTask = new ResolutionTask(task.getCandidates(), task.reference, task.tracing, - TemporaryBindingTrace.create(task.trace, "trace for resolution guarded for extra function literal arguments"), - task.scope, new DelegatingCall(task.call) { - @NotNull - @Override - public List getFunctionLiteralArguments() { - return Collections.emptyList(); - } - }, task.expectedType, task.dataFlowInfo, task.resolveMode, task.checkArguments, - task.expressionPosition, task.resolutionResultsCache); - OverloadResolutionResultsImpl resultsWithFunctionLiteralsStripped = performResolution(newTask, callTransformer, traceForResolutionCache); + DelegatingCall callWithoutFLArgs = new DelegatingCall(task.call) { + @NotNull + @Override + public List getFunctionLiteralArguments() { + return Collections.emptyList(); + } + }; + TemporaryBindingTrace temporaryTrace = + TemporaryBindingTrace.create(task.trace, "trace for resolution guarded for extra function literal arguments"); + ResolutionTask newTask = task.replaceBindingTrace(temporaryTrace).replaceCall(callWithoutFLArgs); + + OverloadResolutionResultsImpl resultsWithFunctionLiteralsStripped = performResolution(newTask, callTransformer); if (resultsWithFunctionLiteralsStripped.isSuccess() || resultsWithFunctionLiteralsStripped.isAmbiguity()) { task.tracing.danglingFunctionLiteralArgumentSuspected(task.trace, task.call.getFunctionLiteralArguments()); } @@ -504,8 +505,8 @@ public class CallResolver { @NotNull private OverloadResolutionResultsImpl performResolution( @NotNull ResolutionTask task, - @NotNull CallTransformer callTransformer, - @NotNull BindingTrace traceForResolutionCache) { + @NotNull CallTransformer callTransformer + ) { for (ResolutionCandidate resolutionCandidate : task.getCandidates()) { TemporaryBindingTrace candidateTrace = TemporaryBindingTrace.create( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/ResolutionTask.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/ResolutionTask.java index 49fa57a12f6..9ac1869200a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/ResolutionTask.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/ResolutionTask.java @@ -100,6 +100,12 @@ public class ResolutionTask extends C return this; } + public ResolutionTask replaceCall(@NotNull Call newCall) { + return new ResolutionTask( + candidates, reference, tracing, trace, scope, newCall, expectedType, dataFlowInfo, resolveMode, checkArguments, + expressionPosition, resolutionResultsCache); + } + public interface DescriptorCheckStrategy { boolean performAdvancedChecks(D descriptor, BindingTrace trace, TracingStrategy tracing); }