diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java index 243f30baab7..6e6daf6dd74 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/results/OverloadingConflictResolver.java @@ -20,10 +20,7 @@ import gnu.trove.THashSet; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; -import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; -import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; @@ -58,21 +55,30 @@ public class OverloadingConflictResolver { return object == null ? 0 : object.getResultingDescriptor().hashCode(); } }); - meLoop: for (ResolvedCallWithTrace candidateCall : candidates) { - D me = candidateCall.getResultingDescriptor(); - for (ResolvedCallWithTrace otherCall : candidates) { - D other = otherCall.getResultingDescriptor(); - if (other == me) continue; - if (!moreSpecific(me, other, discriminateGenericDescriptors) || moreSpecific(other, me, discriminateGenericDescriptors)) { - continue meLoop; - } + if (isMaximallySpecific(candidateCall, candidates, discriminateGenericDescriptors)) { + maximallySpecific.add(candidateCall); } - maximallySpecific.add(candidateCall); } return maximallySpecific.size() == 1 ? maximallySpecific.iterator().next() : null; } + private boolean isMaximallySpecific( + @NotNull ResolvedCallWithTrace candidateCall, + @NotNull Set> candidates, + boolean discriminateGenericDescriptors + ) { + D me = candidateCall.getResultingDescriptor(); + for (ResolvedCallWithTrace otherCall : candidates) { + D other = otherCall.getResultingDescriptor(); + if (other == me) continue; + if (!moreSpecific(me, other, discriminateGenericDescriptors) || moreSpecific(other, me, discriminateGenericDescriptors)) { + return false; + } + } + return true; + } + /** * Let < mean "more specific" * Subtype < supertype