From bb548e3df4782d97606a74d9d471d6c35a192cc2 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Sun, 26 Nov 2023 14:13:33 +0100 Subject: [PATCH] K2: Fix exception for PropertyDelegateProvider + lazy case ^KT-63646 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 +++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 +++++ .../FirDeclarationsResolveTransformer.kt | 4 --- .../provideDelegateUsesOuterCS.fir.kt | 26 +++++++++++++++++++ .../inference/provideDelegateUsesOuterCS.kt | 26 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 8 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.fir.kt create mode 100644 compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.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 e171449382f..d7a8b4c5d71 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 @@ -10263,6 +10263,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateReturningOuterTypeVariable.kt"); } + @Test + @TestMetadata("provideDelegateUsesOuterCS.kt") + public void testProvideDelegateUsesOuterCS() throws Exception { + runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt"); + } + @Test @TestMetadata("resultTypeOfLambdaForConventionMethods.kt") public void testResultTypeOfLambdaForConventionMethods() 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 4b798bfe427..ef0fe33e4ae 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 @@ -10263,6 +10263,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateReturningOuterTypeVariable.kt"); } + @Test + @TestMetadata("provideDelegateUsesOuterCS.kt") + public void testProvideDelegateUsesOuterCS() throws Exception { + runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt"); + } + @Test @TestMetadata("resultTypeOfLambdaForConventionMethods.kt") public void testResultTypeOfLambdaForConventionMethods() 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 eef4c47ff31..bdc8a226896 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 @@ -10257,6 +10257,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateReturningOuterTypeVariable.kt"); } + @Test + @TestMetadata("provideDelegateUsesOuterCS.kt") + public void testProvideDelegateUsesOuterCS() throws Exception { + runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt"); + } + @Test @TestMetadata("resultTypeOfLambdaForConventionMethods.kt") public void testResultTypeOfLambdaForConventionMethods() 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 49b16ce2912..fbf44997f4c 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 @@ -10263,6 +10263,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateReturningOuterTypeVariable.kt"); } + @Test + @TestMetadata("provideDelegateUsesOuterCS.kt") + public void testProvideDelegateUsesOuterCS() throws Exception { + runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt"); + } + @Test @TestMetadata("resultTypeOfLambdaForConventionMethods.kt") public void testResultTypeOfLambdaForConventionMethods() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 6aa90c4634d..b75f41e3e66 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -474,10 +474,6 @@ open class FirDeclarationsResolveTransformer( val typeVariablesRelatedToProvideDelegate = allTypeVariables.subList(candidateStorage.outerSystemVariablesPrefixSize, allTypeVariables.size).toSet() - check(typeVariable in typeVariablesRelatedToProvideDelegate) { - "Return type of provideDelegate is expected to be one of the type variables of a candidate, but $typeVariable was found" - } - val variableWithConstraints = candidateSystem.notFixedTypeVariables[typeVariable] ?: error("Not found type variable $typeVariable") diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.fir.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.fir.kt new file mode 100644 index 00000000000..7c733d78497 --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.fir.kt @@ -0,0 +1,26 @@ +// ISSUE: KT-63646 +// WITH_STDLIB +interface MyPropertyDelegateProvider { + operator fun provideDelegate(thisRef: Nothing?, property: kotlin.reflect.KProperty<*>): Y1 +} + +// To look for `getValue` we need to fix Y2 after `provideDelegate` call +fun foo(x: () -> Y2): MyPropertyDelegateProvider = TODO() + +interface MyLazy { + operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): X1 = TODO() +} +fun myLazy(x: () -> X3): MyLazy = TODO() + +val property1 by foo { + myLazy { "1" } +} + +val property2 by foo { + lazy { "2" } // Regular lazy has `getValue` as an extension +} + +fun main() { + property1.length + property2.length +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt new file mode 100644 index 00000000000..0bd471f6e7a --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt @@ -0,0 +1,26 @@ +// ISSUE: KT-63646 +// WITH_STDLIB +interface MyPropertyDelegateProvider { + operator fun provideDelegate(thisRef: Nothing?, property: kotlin.reflect.KProperty<*>): Y1 +} + +// To look for `getValue` we need to fix Y2 after `provideDelegate` call +fun foo(x: () -> Y2): MyPropertyDelegateProvider = TODO() + +interface MyLazy { + operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): X1 = TODO() +} +fun myLazy(x: () -> X3): MyLazy = TODO() + +val property1 by foo { + myLazy { "1" } +} + +val property2 by foo { + lazy { "2" } // Regular lazy has `getValue` as an extension +} + +fun main() { + property1.length + property2.length +} \ 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 ab1cf325bea..120291e1ce1 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 @@ -10263,6 +10263,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateReturningOuterTypeVariable.kt"); } + @Test + @TestMetadata("provideDelegateUsesOuterCS.kt") + public void testProvideDelegateUsesOuterCS() throws Exception { + runTest("compiler/testData/diagnostics/tests/delegatedProperty/inference/provideDelegateUsesOuterCS.kt"); + } + @Test @TestMetadata("resultTypeOfLambdaForConventionMethods.kt") public void testResultTypeOfLambdaForConventionMethods() throws Exception {