~ temporary assume Computable is a subtype of ThrowableComputable Just to look for other cases
diff --git a/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.fir.txt b/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.fir.txt index 937b304..8b59844 100644 --- a/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.fir.txt
@@ -2,22 +2,22 @@ public final fun myUnitFun(): R|kotlin/Unit| { } public final fun main(app: R|Application|): R|kotlin/Unit| { - R|<local>/app|.R|/Application.runSomething|(<L> = SAM(runSomething@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> { - String() - } - )) - R|<local>/app|.R|/Application.runSomething|(<L> = SAM(runSomething@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> { - R|/myUnitFun|() - } - )) - R|<local>/app|.<Ambiguity: runSomething2, [/Application.runSomething2, /Application.runSomething2]>#(<L> = runSomething2@fun <anonymous>(): R|kotlin/String| <inline=Unknown> { + R|<local>/app|.R|/Application.runSomething|<R|kotlin/String!|>(<L> = SAM(runSomething@fun <anonymous>(): R|kotlin/String!| <inline=NoInline> { ^ String() } - ) - R|<local>/app|.<Ambiguity: runSomething2, [/Application.runSomething2, /Application.runSomething2]>#(<L> = runSomething2@fun <anonymous>(): R|kotlin/Unit| <inline=Unknown> { + )) + R|<local>/app|.R|/Application.runSomething|(<L> = SAM(runSomething@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> { R|/myUnitFun|() } - ) + )) + R|<local>/app|.R|/Application.runSomething2|<R|kotlin/String!|>(<L> = SAM(runSomething2@fun <anonymous>(): R|kotlin/String!| <inline=NoInline> { + ^ String() + } + )) + R|<local>/app|.R|/Application.runSomething2|<R|kotlin/Unit!|>(<L> = SAM(runSomething2@fun <anonymous>(): R|kotlin/Unit| <inline=NoInline> { + R|/myUnitFun|() + } + )) R|<local>/app|.R|/Application.runSomething3|<R|kotlin/String!|, R|kotlin/Throwable!|>(<L> = SAM(runSomething3@fun <anonymous>(): R|kotlin/String!| <inline=NoInline> { ^ String() }
diff --git a/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.kt b/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.kt index f72a2e0..4cf561e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.kt +++ b/compiler/fir/analysis-tests/testData/resolve/callResolution/orblrt/throwableJavaSam.kt
@@ -48,8 +48,8 @@ fun main(app: Application) { app.runSomething { "" } app.runSomething { myUnitFun() } - app.<!OVERLOAD_RESOLUTION_AMBIGUITY!>runSomething2<!> { "" } - app.<!OVERLOAD_RESOLUTION_AMBIGUITY!>runSomething2<!> { myUnitFun() } + app.runSomething2 { "" } + app.runSomething2 { myUnitFun() } app.runSomething3 { "" } app.runSomething3 { myUnitFun() } }
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 00f2d45..3897ec2 100644 --- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt
@@ -801,6 +801,25 @@ purelyImplementedSupertype?.let { add(buildResolvedTypeRef { coneType = it }) } + + if (owner.classId == ClassId.topLevel(FqName("com.intellij.openapi.util.Computable"))) { + add(buildResolvedTypeRef { + val tp = ConeTypeParameterTypeImpl(owner.typeParameters.first().symbol.toLookupTag(), isMarkedNullable = false) + val throwable = ConeClassLikeTypeImpl( + ClassId.topLevel(FqName("kotlin.Throwable")).toLookupTag(), + emptyArray(), + isMarkedNullable = false, + ) + coneType = ConeClassLikeTypeImpl( + ClassId.topLevel(FqName("com.intellij.openapi.util.ThrowableComputable")).toLookupTag(), + arrayOf( + ConeFlexibleType(tp, tp.withNullability(true, session.typeContext), isTrivial = true), + ConeFlexibleType(throwable, throwable.withNullability(true, session.typeContext), isTrivial = true), + ), + isMarkedNullable = false, + ) + }) + } } }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeOverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeOverloadConflictResolver.kt index 718a1ff..6f8a718 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeOverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeOverloadConflictResolver.kt
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.calls.candidate.Candidate import org.jetbrains.kotlin.fir.resolve.calls.candidate.FirNamedReferenceWithCandidate -import org.jetbrains.kotlin.fir.resolve.calls.removeTypeVariableTypes import org.jetbrains.kotlin.fir.resolve.calls.stages.shouldHaveLowPriorityDueToSAM import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable @@ -244,7 +243,7 @@ candidates, { !it.usesCoercionToUnitInLambda }, { discriminationFlags.copy(unitCoercionInLambdas = false) }, - )?.takeIf { it.size == 1 }?.let { return it } + )?.let { return it } } findMaximallySpecificCall(candidates, false)?.let { return setOf(it) }