From 0dc86293124c34ccbb15990edd048b5dcfdaed9b Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Mon, 15 Jan 2024 16:21:17 +0100 Subject: [PATCH] [FIR] Don't report MUST_BE_INITIALIZED on private open properites ^KT-59074 Fixed This solution is not ideal. Ideally, the allopen compiler plugin shouldn't report `private` properites as `open` KT-64980, but it will unpredictably break other things. --- .../DiagnosticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...versedDiagnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ .../FirLightTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../checkers/declaration/FirTopLevelPropertiesChecker.kt | 4 +++- .../tests/backingField/OpenPrivateValDeferredInit.fir.kt | 8 ++++++++ .../tests/backingField/OpenPrivateValDeferredInit.kt | 8 ++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ 8 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.fir.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.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 3afb35bc051..27b68b44d70 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 @@ -3578,6 +3578,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt"); } + @Test + @TestMetadata("OpenPrivateValDeferredInit.kt") + public void testOpenPrivateValDeferredInit() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt"); + } + @Test @TestMetadata("OpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal.kt") public void testOpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal() 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 bb62c4e8202..750355fe8a8 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 @@ -3578,6 +3578,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt"); } + @Test + @TestMetadata("OpenPrivateValDeferredInit.kt") + public void testOpenPrivateValDeferredInit() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt"); + } + @Test @TestMetadata("OpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal.kt") public void testOpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal() 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 656b0113dc9..280aad3543d 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 @@ -3572,6 +3572,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt"); } + @Test + @TestMetadata("OpenPrivateValDeferredInit.kt") + public void testOpenPrivateValDeferredInit() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt"); + } + @Test @TestMetadata("OpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal.kt") public void testOpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal() 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 cf6563359a1..1f38d0c16ab 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 @@ -3578,6 +3578,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt"); } + @Test + @TestMetadata("OpenPrivateValDeferredInit.kt") + public void testOpenPrivateValDeferredInit() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt"); + } + @Test @TestMetadata("OpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal.kt") public void testOpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt index 1823b2e4437..939bc30df1d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt @@ -149,7 +149,9 @@ internal fun checkPropertyInitializer( val isExternal = property.isEffectivelyExternal(containingClass, context) val isCorrectlyInitialized = property.initializer != null || isDefinitelyAssigned && !property.hasSetterAccessorImplementation && - property.getEffectiveModality(containingClass, context.languageVersionSettings) != Modality.OPEN + (property.getEffectiveModality(containingClass, context.languageVersionSettings) != Modality.OPEN || + // Drop this workaround after KT-64980 is fixed + property.effectiveVisibility == org.jetbrains.kotlin.descriptors.EffectiveVisibility.PrivateInClass) if ( backingFieldRequired && !inInterface && diff --git a/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.fir.kt b/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.fir.kt new file mode 100644 index 00000000000..6636cd10fe5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.fir.kt @@ -0,0 +1,8 @@ +// LANGUAGE:+ProhibitOpenValDeferredInitialization +open class Foo { + private open val foo: Int + + init { + foo = 1 + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt b/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt new file mode 100644 index 00000000000..64599879f9c --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt @@ -0,0 +1,8 @@ +// LANGUAGE:+ProhibitOpenValDeferredInitialization +open class Foo { + private open val foo: Int + + init { + foo = 1 + } +} 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 8ef3f5add4c..3784ae31f25 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 @@ -3578,6 +3578,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt"); } + @Test + @TestMetadata("OpenPrivateValDeferredInit.kt") + public void testOpenPrivateValDeferredInit() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/OpenPrivateValDeferredInit.kt"); + } + @Test @TestMetadata("OpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal.kt") public void testOpenValDeferredInitError_InFinalClass_DisableEffectivelyFinal() throws Exception {