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