Added 'LowPriorityInOverloadResolution' annotation

This commit is contained in:
Svetlana Isakova
2015-10-16 17:51:27 +03:00
parent 1cfb7d8f57
commit ded62686a0
5 changed files with 33 additions and 2 deletions
@@ -25,9 +25,9 @@ import org.jetbrains.kotlin.psi.Call
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.doNotAnalyze
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getUnaryPlusOrMinusOperatorFunctionName
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isConventionCall
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isOrOverridesSynthesized
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getUnaryPlusOrMinusOperatorFunctionName
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.collectors.CallableDescriptorCol
import org.jetbrains.kotlin.resolve.calls.tasks.collectors.CallableDescriptorCollectors
import org.jetbrains.kotlin.resolve.calls.tasks.collectors.filtered
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.kotlin.resolve.descriptorUtil.hasLowPriorityInOverloadResolution
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
@@ -480,7 +481,7 @@ public class TaskPrioritizer(
override fun getPriority(candidate: ResolutionCandidate<D>)
= if (hasImplicitDynamicReceiver(candidate)) 0
else (if (isVisible(candidate)) 2 else 0) + (if (isSynthesized(candidate)) 0 else 1)
else (if (!isVisible(candidate) || hasLowPriority(candidate)) 0 else 2) + (if (isSynthesized(candidate)) 0 else 1)
override fun getMaxPriority() = 3
@@ -492,6 +493,11 @@ public class TaskPrioritizer(
return Visibilities.isVisible(receiverValue, candidateDescriptor, context.scope.ownerDescriptor)
}
private fun hasLowPriority(candidate: ResolutionCandidate<D>?): Boolean {
if (candidate == null) return false
return candidate.descriptor.hasLowPriorityInOverloadResolution()
}
private fun isSynthesized(candidate: ResolutionCandidate<D>): Boolean {
val descriptor = candidate.getDescriptor()
return descriptor is CallableMemberDescriptor && isOrOverridesSynthesized(descriptor)