From a02cf76d6cf2d8f1cc3834a6438677e91652adaf Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 20 Dec 2023 17:11:46 +0100 Subject: [PATCH] K2: build SAM-based function type for a given captured type properly Before this commit, we assumed (erroneously) that a captured type cannot have an associated SAM-based function type. In this commit we changed this assumption, replacing a captured type with its lower type for this purpose #KT-63379 Fixed --- ...icCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...nosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...TreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...rPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/fir/resolve/SamResolution.kt | 5 +++-- .../unitInContravariantPosition.fir.kt | 17 ----------------- .../funInterface/unitInContravariantPosition.kt | 1 + .../funInterface/unitInCovariantPosition.fir.kt | 17 +++++++++++++++++ .../funInterface/unitInCovariantPosition.kt | 17 +++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 10 files changed, 68 insertions(+), 19 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.fir.kt create mode 100644 compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.fir.kt create mode 100644 compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.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 ac1904811a0..f39e7839318 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 @@ -13927,6 +13927,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia public void testUnitInContravariantPosition() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt"); } + + @Test + @TestMetadata("unitInCovariantPosition.kt") + public void testUnitInCovariantPosition() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt"); + } } @Nested 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 d90bfbf5363..ba3f49f2c4e 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 @@ -13927,6 +13927,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated public void testUnitInContravariantPosition() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt"); } + + @Test + @TestMetadata("unitInCovariantPosition.kt") + public void testUnitInCovariantPosition() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt"); + } } @Nested 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 f1748246244..708c976cb8e 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 @@ -13921,6 +13921,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir public void testUnitInContravariantPosition() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt"); } + + @Test + @TestMetadata("unitInCovariantPosition.kt") + public void testUnitInCovariantPosition() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt"); + } } @Nested 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 3ee12df7cef..34794394052 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 @@ -13927,6 +13927,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia public void testUnitInContravariantPosition() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt"); } + + @Test + @TestMetadata("unitInCovariantPosition.kt") + public void testUnitInCovariantPosition() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt"); + } } @Nested diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index 1c055a6c0d5..cece23d5e52 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -81,10 +81,11 @@ class FirSamResolver( } is ConeStubType, is ConeTypeParameterType, is ConeTypeVariableType, - is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType, - is ConeIntegerLiteralType, + is ConeDefinitelyNotNullType, is ConeIntersectionType, is ConeIntegerLiteralType, -> null + is ConeCapturedType -> type.lowerType?.let { getFunctionTypeForPossibleSamType(it) } + is ConeLookupTagBasedType -> unreachableBranch(type) } } diff --git a/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.fir.kt b/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.fir.kt deleted file mode 100644 index 985d190f726..00000000000 --- a/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// ISSUE: KT-63379 - -class TestDummyClass { - fun testFun(t: T) {} -} - -fun more(t: TestDummyClass) { - t.testFun { Unit } - t.testFun(CustomRunnable { Unit }) - t.testFun(object : CustomRunnable { - override fun run() {} - }) -} - -fun interface CustomRunnable { - fun run() -} diff --git a/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt b/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt index a09f01e73f8..fbd2e07d46f 100644 --- a/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt +++ b/compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-63379 class TestDummyClass { diff --git a/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.fir.kt b/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.fir.kt new file mode 100644 index 00000000000..1a138472dab --- /dev/null +++ b/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.fir.kt @@ -0,0 +1,17 @@ +// ISSUE: KT-63379 (modified example, see original in unitInContravariantPosition.kt) + +class TestDummyClass { + fun testFun(t: T) {} +} + +fun more(t: TestDummyClass) { + t.testFun { Unit } + t.testFun(CustomRunnable { Unit }) + t.testFun(object : CustomRunnable { + override fun run() {} + }) +} + +fun interface CustomRunnable { + fun run() +} diff --git a/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt b/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt new file mode 100644 index 00000000000..cb5d1e7f963 --- /dev/null +++ b/compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt @@ -0,0 +1,17 @@ +// ISSUE: KT-63379 (modified example, see original in unitInContravariantPosition.kt) + +class TestDummyClass { + fun testFun(t: T) {} +} + +fun more(t: TestDummyClass) { + t.testFun { Unit } + t.testFun(CustomRunnable { Unit }) + t.testFun(object : CustomRunnable { + override fun run() {} + }) +} + +fun interface CustomRunnable { + fun run() +} 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 e2704383dd9..d379e7480b6 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 @@ -13927,6 +13927,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testUnitInContravariantPosition() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/unitInContravariantPosition.kt"); } + + @Test + @TestMetadata("unitInCovariantPosition.kt") + public void testUnitInCovariantPosition() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/unitInCovariantPosition.kt"); + } } @Nested