From 50bfd199590bb015a1e77fbc73d08f3f201688d4 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 4 Jan 2024 13:31:37 +0100 Subject: [PATCH] [FIR] Remove usage of FirSamResolver in call conflict resolution #KT-63703 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../calls/AbstractConeCallConflictResolver.kt | 19 ++++++++++++------- ...multipleSamConversionConflictResolution.kt | 11 +++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 3f825dae118..03f4aeb684f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -32470,6 +32470,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia 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 @TestMetadata("OverloadPriority.kt") public void testOverloadPriority() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 39841f39348..d3dbbc145a1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -32470,6 +32470,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated 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 @TestMetadata("OverloadPriority.kt") public void testOverloadPriority() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 028552243dd..42f539cb84b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -30304,6 +30304,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir 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 @TestMetadata("OverloadPriority.kt") public void testOverloadPriority() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index be00615db5a..7da7ea3636c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -30316,6 +30316,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia 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 @TestMetadata("OverloadPriority.kt") public void testOverloadPriority() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt index 5a519530a51..9809227d412 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt @@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* 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.FirSamResolver import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents 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.requireOrDescribe import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment abstract class AbstractConeCallConflictResolver( @@ -39,8 +40,6 @@ abstract class AbstractConeCallConflictResolver( private val considerMissingArgumentsInSignatures: Boolean, ) : ConeCallConflictResolver() { - private val samResolver: FirSamResolver get() = transformerComponents.samResolver - /** * Returns `true` if [call1] is definitely more or equally specific [call2], * `false` otherwise. @@ -212,12 +211,18 @@ abstract class AbstractConeCallConflictResolver( private fun FirValueParameter.toTypeWithConversion(session: FirSession, call: Candidate): TypeWithConversion { val argumentType = argumentType().fullyExpandedType(session) - return if (!call.usesSAM) { + val functionTypeForSam = toFunctionTypeForSamOrNull(call) + return if (functionTypeForSam == null) { TypeWithConversion(argumentType) } else { - val functionType = samResolver.getFunctionTypeForPossibleSamType(argumentType) - if (functionType == null) TypeWithConversion(argumentType) - else TypeWithConversion(functionType, argumentType) + TypeWithConversion(functionTypeForSam, 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()] } } } diff --git a/compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt b/compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt new file mode 100644 index 00000000000..bfd9c95d296 --- /dev/null +++ b/compiler/testData/diagnostics/tests/samConversions/multipleSamConversionConflictResolution.kt @@ -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 {}, {}) +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 223e46f5cae..3916ace7922 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -32470,6 +32470,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { 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 @TestMetadata("OverloadPriority.kt") public void testOverloadPriority() throws Exception {