diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt index 68b208d5663..090b32a57f6 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt @@ -28,7 +28,6 @@ class ConeEquivalentCallConflictResolver( ) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) { override fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean ): Set { return filterOutEquivalentCalls(candidates) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmPlatformOverloadsConflictResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmPlatformOverloadsConflictResolver.kt index 0cec406cdaa..00dee73996f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmPlatformOverloadsConflictResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmPlatformOverloadsConflictResolver.kt @@ -27,7 +27,6 @@ class JvmPlatformOverloadsConflictResolver( ) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) { override fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean ): Set { if (!inferenceComponents.session.languageVersionSettings.supportsFeature(LanguageFeature.PreferJavaFieldOverload)) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index ba75414de7d..42206d21366 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -168,7 +168,7 @@ class FirCallResolver( fun chooseMostSpecific(): Set { 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( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt index 05fc4680352..790bff453f1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt @@ -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) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt index c13310f98e8..7daa20d6c16 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt @@ -14,13 +14,12 @@ import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator abstract class ConeCallConflictResolver { fun chooseMaximallySpecificCandidates( candidates: Collection, - discriminateGenerics: Boolean, + // It's set to 'true' only for `super.foo()`-like calls and used only at ConeOverloadConflictResolver discriminateAbstracts: Boolean = false - ): Set = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics, discriminateAbstracts) + ): Set = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateAbstracts) abstract fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean ): Set } @@ -33,4 +32,4 @@ abstract class ConeCallConflictResolverFactory : FirSessionComponent { ): ConeCallConflictResolver } -val FirSession.callConflictResolverFactory: ConeCallConflictResolverFactory by FirSession.sessionComponentAccessor() \ No newline at end of file +val FirSession.callConflictResolverFactory: ConeCallConflictResolverFactory by FirSession.sessionComponentAccessor() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt index 129a3cdd6ae..c2623f95b8e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt @@ -10,7 +10,6 @@ class ConeCompositeConflictResolver( ) : ConeCallConflictResolver() { override fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean ): Set { 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 } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeIntegerOperatorConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeIntegerOperatorConflictResolver.kt index 72487a876a8..f4d8fd52ec4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeIntegerOperatorConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeIntegerOperatorConflictResolver.kt @@ -17,7 +17,6 @@ class ConeIntegerOperatorConflictResolver( ) : AbstractConeCallConflictResolver(specificityComparator, inferenceComponents, transformerComponents) { override fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean ): Set { if (candidates.size <= 1) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt index 7c725028390..c049e58c737 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt @@ -36,8 +36,14 @@ class ConeOverloadConflictResolver( override fun chooseMaximallySpecificCandidates( candidates: Set, - discriminateGenerics: Boolean, discriminateAbstracts: Boolean + ): Set = chooseMaximallySpecificCandidates(candidates, discriminateAbstracts, discriminateGenerics = true) + + private fun chooseMaximallySpecificCandidates( + candidates: Set, + discriminateAbstracts: Boolean, + // Set to 'false' only for property-for-invoke case + discriminateGenerics: Boolean, ): Set { 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 }