[FIR] Remove usage of FirSamResolver in call conflict resolution

#KT-63703 Fixed
This commit is contained in:
Kirill Rakhman
2024-01-04 13:31:37 +01:00
committed by Space Team
parent ad8d4051b8
commit 50bfd19959
7 changed files with 53 additions and 7 deletions
@@ -32470,6 +32470,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt"); runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
} }
@Test
@TestMetadata("multipleSamConversionConflictResolution.kt")
public void testMultipleSamConversionConflictResolution() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt");
}
@Test @Test
@TestMetadata("OverloadPriority.kt") @TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception { public void testOverloadPriority() throws Exception {
@@ -32470,6 +32470,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt"); runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
} }
@Test
@TestMetadata("multipleSamConversionConflictResolution.kt")
public void testMultipleSamConversionConflictResolution() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt");
}
@Test @Test
@TestMetadata("OverloadPriority.kt") @TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception { public void testOverloadPriority() throws Exception {
@@ -30304,6 +30304,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt"); runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
} }
@Test
@TestMetadata("multipleSamConversionConflictResolution.kt")
public void testMultipleSamConversionConflictResolution() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt");
}
@Test @Test
@TestMetadata("OverloadPriority.kt") @TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception { public void testOverloadPriority() throws Exception {
@@ -30316,6 +30316,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt"); runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
} }
@Test
@TestMetadata("multipleSamConversionConflictResolution.kt")
public void testMultipleSamConversionConflictResolution() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt");
}
@Test @Test
@TestMetadata("OverloadPriority.kt") @TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception { public void testOverloadPriority() throws Exception {
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.expressions.unwrapArgument
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.FirSamResolver
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.results.*
import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.requireOrDescribe import org.jetbrains.kotlin.types.model.requireOrDescribe
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
abstract class AbstractConeCallConflictResolver( abstract class AbstractConeCallConflictResolver(
@@ -39,8 +40,6 @@ abstract class AbstractConeCallConflictResolver(
private val considerMissingArgumentsInSignatures: Boolean, private val considerMissingArgumentsInSignatures: Boolean,
) : ConeCallConflictResolver() { ) : ConeCallConflictResolver() {
private val samResolver: FirSamResolver get() = transformerComponents.samResolver
/** /**
* Returns `true` if [call1] is definitely more or equally specific [call2], * Returns `true` if [call1] is definitely more or equally specific [call2],
* `false` otherwise. * `false` otherwise.
@@ -212,12 +211,18 @@ abstract class AbstractConeCallConflictResolver(
private fun FirValueParameter.toTypeWithConversion(session: FirSession, call: Candidate): TypeWithConversion { private fun FirValueParameter.toTypeWithConversion(session: FirSession, call: Candidate): TypeWithConversion {
val argumentType = argumentType().fullyExpandedType(session) val argumentType = argumentType().fullyExpandedType(session)
return if (!call.usesSAM) { val functionTypeForSam = toFunctionTypeForSamOrNull(call)
return if (functionTypeForSam == null) {
TypeWithConversion(argumentType) TypeWithConversion(argumentType)
} else { } else {
val functionType = samResolver.getFunctionTypeForPossibleSamType(argumentType) TypeWithConversion(functionTypeForSam, argumentType)
if (functionType == null) TypeWithConversion(argumentType) }
else TypeWithConversion(functionType, argumentType) }
private fun FirValueParameter.toFunctionTypeForSamOrNull(call: Candidate): ConeKotlinType? {
val functionTypesOfSamConversions = call.functionTypesOfSamConversions ?: return null
return call.argumentMapping?.entries?.firstNotNullOfOrNull {
runIf(it.value == this) { functionTypesOfSamConversions[it.key.unwrapArgument()] }
} }
} }
@@ -0,0 +1,11 @@
// FIR_IDENTICAL
fun interface Runnable {
fun run()
}
fun foo(r: Runnable, f: Runnable) = 1
fun foo(r: Runnable, f: () -> Unit) = ""
fun test(): String {
return foo(Runnable {}, {})
}
@@ -32470,6 +32470,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt"); runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
} }
@Test
@TestMetadata("multipleSamConversionConflictResolution.kt")
public void testMultipleSamConversionConflictResolution() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt");
}
@Test @Test
@TestMetadata("OverloadPriority.kt") @TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception { public void testOverloadPriority() throws Exception {