K2: repeat K1 logic around SAM-based candidates discrimination

#KT-56614 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-11-15 18:42:45 +01:00
committed by Space Team
parent ce381f335d
commit 0fba58eee7
4 changed files with 15 additions and 5 deletions
@@ -14,7 +14,7 @@ FILE: package2.kt
}
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
R|p2/bar|(String(), String(), <L> = bar@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
R|p1/bar|(String(), String(), <L> = bar@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> {
^@bar Unit
}
)
@@ -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)
}
}
}
}
@@ -12,7 +12,7 @@ object Test1 {
fun foo(r: KRunnable) {}
fun test(f: () -> Unit) {
<!DEBUG_INFO_CALL("fqName: Test1.foo; typeCall: function")!>foo(f)<!>
<!DEBUG_INFO_CALL("fqName: Test1.Scope.foo; typeCall: function")!>foo(f)<!>
}
}
}
@@ -35,7 +35,7 @@ object Test3 {
fun test(f: () -> Unit) {
val result = foo(1, f)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>result<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>result<!>
}
}
@@ -12,7 +12,7 @@ object Test1 {
fun call(r: SuspendRunnable) {}
fun bar(f: () -> Unit) {
<!DEBUG_INFO_CALL("fqName: Test1.call; typeCall: function")!>call(f)<!>
<!DEBUG_INFO_CALL("fqName: Test1.Scope.call; typeCall: function")!>call(f)<!>
}
}
}