K2: Get rid of redundant parameter of ConeCallConflictResolver methods

discriminateGenerics was only set to false in recursive calls of
ConeOverloadConflictResolver
This commit is contained in:
Denis.Zharkov
2023-02-10 18:40:45 +01:00
committed by Space Team
parent 61e9f98b9f
commit 427b221eaf
8 changed files with 19 additions and 20 deletions
@@ -28,7 +28,6 @@ class ConeEquivalentCallConflictResolver(
) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) {
override fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate> {
return filterOutEquivalentCalls(candidates)
@@ -27,7 +27,6 @@ class JvmPlatformOverloadsConflictResolver(
) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) {
override fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate> {
if (!inferenceComponents.session.languageVersionSettings.supportsFeature(LanguageFeature.PreferJavaFieldOverload)) {
@@ -168,7 +168,7 @@ class FirCallResolver(
fun chooseMostSpecific(): Set<Candidate> {
val onSuperReference = (explicitReceiver as? FirQualifiedAccessExpression)?.calleeReference is FirSuperReference
return conflictResolver.chooseMaximallySpecificCandidates(
bestCandidates, discriminateGenerics = true, discriminateAbstracts = onSuperReference
bestCandidates, discriminateAbstracts = onSuperReference
)
}
@@ -367,7 +367,7 @@ class FirCallResolver(
val reducedCandidates = if (noSuccessfulCandidates) {
bestCandidates.toSet()
} else {
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = true)
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates)
}
(callableReferenceAccess.explicitReceiver as? FirResolvedQualifier)?.replaceResolvedToCompanionObject(
@@ -586,7 +586,7 @@ class FirCallResolver(
val reducedCandidates = if (!result.currentApplicability.isSuccess) {
bestCandidates.toSet()
} else {
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates, discriminateGenerics = true)
conflictResolver.chooseMaximallySpecificCandidates(bestCandidates)
}
val nameReference = createResolvedNamedReference(
@@ -78,12 +78,10 @@ class FirOverloadByLambdaReturnTypeResolver(
}
if (candidatesWithAnnotation.isEmpty()) return null
val candidatesWithoutAnnotation = reducedCandidates - candidatesWithAnnotation
val newCandidates = analyzeLambdaAndReduceNumberOfCandidatesRegardingOverloadResolutionByLambdaReturnType(call, reducedCandidates) ?: return null
var maximallySpecificCandidates = components.callResolver.conflictResolver.chooseMaximallySpecificCandidates(
newCandidates,
discriminateGenerics = true,
discriminateAbstracts = false
)
val newCandidates =
analyzeLambdaAndReduceNumberOfCandidatesRegardingOverloadResolutionByLambdaReturnType(call, reducedCandidates) ?: return null
var maximallySpecificCandidates = components.callResolver.conflictResolver.chooseMaximallySpecificCandidates(newCandidates)
if (maximallySpecificCandidates.size > 1 && candidatesWithoutAnnotation.any { it in maximallySpecificCandidates }) {
maximallySpecificCandidates = maximallySpecificCandidates.toMutableSet().apply { removeAll(candidatesWithAnnotation) }
maximallySpecificCandidates.singleOrNull()?.addDiagnostic(CandidateChosenUsingOverloadResolutionByLambdaAnnotation)
@@ -14,13 +14,12 @@ import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
abstract class ConeCallConflictResolver {
fun chooseMaximallySpecificCandidates(
candidates: Collection<Candidate>,
discriminateGenerics: Boolean,
// It's set to 'true' only for `super.foo()`-like calls and used only at ConeOverloadConflictResolver
discriminateAbstracts: Boolean = false
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics, discriminateAbstracts)
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateAbstracts)
abstract fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate>
}
@@ -33,4 +32,4 @@ abstract class ConeCallConflictResolverFactory : FirSessionComponent {
): ConeCallConflictResolver
}
val FirSession.callConflictResolverFactory: ConeCallConflictResolverFactory by FirSession.sessionComponentAccessor()
val FirSession.callConflictResolverFactory: ConeCallConflictResolverFactory by FirSession.sessionComponentAccessor()
@@ -10,7 +10,6 @@ class ConeCompositeConflictResolver(
) : ConeCallConflictResolver() {
override fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate> {
if (candidates.size <= 1) return candidates
@@ -18,7 +17,7 @@ class ConeCompositeConflictResolver(
var index = 0
while (currentCandidates.size > 1 && index < conflictResolvers.size) {
val conflictResolver = conflictResolvers[index++]
currentCandidates = conflictResolver.chooseMaximallySpecificCandidates(candidates, discriminateGenerics, discriminateAbstracts)
currentCandidates = conflictResolver.chooseMaximallySpecificCandidates(candidates, discriminateAbstracts)
}
return currentCandidates
}
@@ -17,7 +17,6 @@ class ConeIntegerOperatorConflictResolver(
) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) {
override fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate> {
if (candidates.size <= 1) {
@@ -36,8 +36,14 @@ class ConeOverloadConflictResolver(
override fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean,
discriminateAbstracts: Boolean
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates, discriminateAbstracts, discriminateGenerics = true)
private fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateAbstracts: Boolean,
// Set to 'false' only for property-for-invoke case
discriminateGenerics: Boolean,
): Set<Candidate> {
if (candidates.size == 1) return candidates
val fixedCandidates =
@@ -62,7 +68,7 @@ class ConeOverloadConflictResolver(
}
val bestInvokeReceiver =
chooseMaximallySpecificCandidates(propertyReceiverCandidates, discriminateGenerics = false)
chooseMaximallySpecificCandidates(propertyReceiverCandidates, discriminateGenerics = false, discriminateAbstracts = false)
.singleOrNull() ?: return candidates
return candidates.filterTo(mutableSetOf()) { it.callInfo.candidateForCommonInvokeReceiver == bestInvokeReceiver }