From 0fba58eee7254aed60c6823599ede9fa01674326 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 15 Nov 2023 18:42:45 +0100 Subject: [PATCH] K2: repeat K1 logic around SAM-based candidates discrimination #KT-56614 Fixed --- .../resolve/samConversions/samVsLambda.fir.txt | 2 +- .../kotlin/fir/resolve/calls/ResolutionStages.kt | 12 +++++++++++- .../noCompatibilityResolveForFunInterfaces.fir.kt | 4 ++-- .../suspendAndFunConversionInDisabledMode.fir.kt | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/samConversions/samVsLambda.fir.txt b/compiler/fir/analysis-tests/testData/resolve/samConversions/samVsLambda.fir.txt index 3cea9985c2a..b4dd4c2f092 100644 --- a/compiler/fir/analysis-tests/testData/resolve/samConversions/samVsLambda.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/samConversions/samVsLambda.fir.txt @@ -14,7 +14,7 @@ FILE: package2.kt } FILE: main.kt public final fun main(): R|kotlin/Unit| { - R|p2/bar|(String(), String(), = bar@fun (): R|kotlin/Unit| { + R|p1/bar|(String(), String(), = bar@fun (): R|kotlin/Unit| { ^@bar Unit } ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 5eba2d3d71d..4c7258090c0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.utils.isFun import org.jetbrains.kotlin.fir.declarations.utils.isInfix import org.jetbrains.kotlin.fir.declarations.utils.isOperator import org.jetbrains.kotlin.fir.declarations.utils.modality @@ -486,8 +487,17 @@ internal object CheckArguments : CheckerStage() { sink.yieldDiagnostic(InapplicableCandidate) } + // Logic description: only candidates from Kotlin, but using Java SAM types, are discriminated candidate.usesSAM && !candidate.isJavaApplicableCandidate() -> { - sink.markCandidateForCompatibilityResolve(context) + if (argumentMapping.values.any { + val coneType = it.returnTypeRef.coneType + context.bodyResolveComponents.samResolver.isSamType(coneType) && + // Candidate is not from Java, so no flexible types are possible here + coneType.toRegularClassSymbol(context.session)?.isJavaOrEnhancement == true + } + ) { + sink.markCandidateForCompatibilityResolve(context) + } } } } diff --git a/compiler/testData/diagnostics/tests/funInterface/noCompatibilityResolveForFunInterfaces.fir.kt b/compiler/testData/diagnostics/tests/funInterface/noCompatibilityResolveForFunInterfaces.fir.kt index f54e65788b0..b093b5023ea 100644 --- a/compiler/testData/diagnostics/tests/funInterface/noCompatibilityResolveForFunInterfaces.fir.kt +++ b/compiler/testData/diagnostics/tests/funInterface/noCompatibilityResolveForFunInterfaces.fir.kt @@ -12,7 +12,7 @@ object Test1 { fun foo(r: KRunnable) {} fun test(f: () -> Unit) { - foo(f) + foo(f) } } } @@ -35,7 +35,7 @@ object Test3 { fun test(f: () -> Unit) { val result = foo(1, f) - result + result } } diff --git a/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt index e3d79d82558..99e9f633398 100644 --- a/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt +++ b/compiler/testData/diagnostics/tests/suspendConversion/suspendAndFunConversionInDisabledMode.fir.kt @@ -12,7 +12,7 @@ object Test1 { fun call(r: SuspendRunnable) {} fun bar(f: () -> Unit) { - call(f) + call(f) } } }