diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 71de5d3993e..74ec8e35bf3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -2851,6 +2851,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.MUST_BE_INITIALIZED_WARNING) { firDiagnostic -> + MustBeInitializedWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL) { firDiagnostic -> MustBeInitializedOrBeFinalImpl( firDiagnostic as KtPsiDiagnostic, @@ -2869,6 +2875,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING) { firDiagnostic -> + MustBeInitializedOrBeAbstractWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT) { firDiagnostic -> MustBeInitializedOrFinalOrAbstractImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 279eaf48bfb..c7291ef151d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2019,6 +2019,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = MustBeInitialized::class } + abstract class MustBeInitializedWarning : KtFirDiagnostic() { + override val diagnosticClass get() = MustBeInitializedWarning::class + } + abstract class MustBeInitializedOrBeFinal : KtFirDiagnostic() { override val diagnosticClass get() = MustBeInitializedOrBeFinal::class } @@ -2031,6 +2035,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = MustBeInitializedOrBeAbstract::class } + abstract class MustBeInitializedOrBeAbstractWarning : KtFirDiagnostic() { + override val diagnosticClass get() = MustBeInitializedOrBeAbstractWarning::class + } + abstract class MustBeInitializedOrFinalOrAbstract : KtFirDiagnostic() { override val diagnosticClass get() = MustBeInitializedOrFinalOrAbstract::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 380cac05059..d81fbf7b378 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2425,6 +2425,11 @@ internal class MustBeInitializedImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.MustBeInitialized(), KtAbstractFirDiagnostic +internal class MustBeInitializedWarningImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.MustBeInitializedWarning(), KtAbstractFirDiagnostic + internal class MustBeInitializedOrBeFinalImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, @@ -2440,6 +2445,11 @@ internal class MustBeInitializedOrBeAbstractImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.MustBeInitializedOrBeAbstract(), KtAbstractFirDiagnostic +internal class MustBeInitializedOrBeAbstractWarningImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.MustBeInitializedOrBeAbstractWarning(), KtAbstractFirDiagnostic + internal class MustBeInitializedOrFinalOrAbstractImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, 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 7861b4a7693..83023bab8c2 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 @@ -3037,6 +3037,124 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia public void testVarDeferredInitInOpenClass() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); } + + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor") + @TestDataPath("$PROJECT_ROOT") + public class ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor { + @Test + public void testAllFilesPresentInProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "multiplatform"); + } + + @Test + @TestMetadata("implicitPrimaryConstructor_errorAnyway.kt") + public void testImplicitPrimaryConstructor_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInSecondary_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInTwoSecondaries_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedError.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("onePrimary_oneSecondary_errorAnyway.kt") + public void testOnePrimary_oneSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.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 3da23e3804a..be931873b64 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 @@ -3037,6 +3037,124 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated public void testVarDeferredInitInOpenClass() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); } + + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor") + @TestDataPath("$PROJECT_ROOT") + public class ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor { + @Test + public void testAllFilesPresentInProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "multiplatform"); + } + + @Test + @TestMetadata("implicitPrimaryConstructor_errorAnyway.kt") + public void testImplicitPrimaryConstructor_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInSecondary_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInTwoSecondaries_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedError.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("onePrimary_oneSecondary_errorAnyway.kt") + public void testOnePrimary_oneSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.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 5f98f67b151..8025ac4125e 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 @@ -3037,6 +3037,124 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir public void testVarDeferredInitInOpenClass() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); } + + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor") + @TestDataPath("$PROJECT_ROOT") + public class ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor { + @Test + public void testAllFilesPresentInProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "multiplatform"); + } + + @Test + @TestMetadata("implicitPrimaryConstructor_errorAnyway.kt") + public void testImplicitPrimaryConstructor_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInSecondary_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInTwoSecondaries_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedError.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("onePrimary_oneSecondary_errorAnyway.kt") + public void testOnePrimary_oneSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.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 ac4251274f4..a5bc56fdd3d 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 @@ -3043,6 +3043,124 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia public void testVarDeferredInitInOpenClass() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); } + + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor") + @TestDataPath("$PROJECT_ROOT") + public class ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor { + @Test + public void testAllFilesPresentInProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true, "multiplatform"); + } + + @Test + @TestMetadata("implicitPrimaryConstructor_errorAnyway.kt") + public void testImplicitPrimaryConstructor_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInSecondary_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInTwoSecondaries_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedError.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("onePrimary_oneSecondary_errorAnyway.kt") + public void testOnePrimary_oneSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.kt"); + } + } } @Nested diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 4fdac53f3a1..e7104769364 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1009,9 +1009,11 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED by error(PositioningStrategy.DECLARATION_SIGNATURE) + val MUST_BE_INITIALIZED_WARNING by warning(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_FINAL by error(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING by warning(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_ABSTRACT by error(PositioningStrategy.DECLARATION_SIGNATURE) + val MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING by warning(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT by error(PositioningStrategy.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING by warning(PositioningStrategy.DECLARATION_SIGNATURE) diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 408d44df46e..15a0bff50bd 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -533,9 +533,11 @@ object FirErrors { val PROPERTY_INITIALIZER_IN_INTERFACE by error0() val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val MUST_BE_INITIALIZED_WARNING by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_FINAL by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_BE_ABSTRACT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val EXTENSION_PROPERTY_MUST_HAVE_ACCESSORS_OR_BE_ABSTRACT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) 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 285b411e27e..d612ba1f7ba 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 @@ -12,16 +12,14 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory0 import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.FirModifierList import org.jetbrains.kotlin.fir.analysis.checkers.contains import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeLocalVariableNoTypeOrInitializer @@ -189,28 +187,42 @@ private fun reportMustBeInitialized( !context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitOpenValDeferredInitialization) && property.getEffectiveModality(containingClass, context.languageVersionSettings) == Modality.OPEN && property.isVal && isDefinitelyAssignedInConstructor - - val factory = when { - suggestMakingItFinal && suggestMakingItAbstract -> when (isOpenValDeferredInitDeprecationWarning) { - true -> FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING - false -> FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT - } - suggestMakingItFinal -> when (isOpenValDeferredInitDeprecationWarning) { - true -> FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING - false -> FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL - } - suggestMakingItAbstract -> when (isOpenValDeferredInitDeprecationWarning) { - true -> error("Not reachable case. Every \"open val + deferred init\" case that could be made `abstract`, also could be made `final`") - false -> FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT - } - else -> when (isOpenValDeferredInitDeprecationWarning) { - true -> error("Not reachable case. We can always suggest making `open val` property `final`") - false -> FirErrors.MUST_BE_INITIALIZED - } + if (isOpenValDeferredInitDeprecationWarning && !suggestMakingItFinal && suggestMakingItAbstract) { + error("Not reachable case. Every \"open val + deferred init\" case that could be made `abstract`, also could be made `final`") } - reporter.reportOn(propertySource, factory, context) + val isMissedMustBeInitializedDeprecationWarning = + !context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor) && + containingClass != null && + containingClass.primaryConstructorIfAny(context.session) == null && + isDefinitelyAssignedInConstructor + val factory = when { + suggestMakingItFinal && suggestMakingItAbstract -> FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT + suggestMakingItFinal -> FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL + suggestMakingItAbstract -> FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT + else -> FirErrors.MUST_BE_INITIALIZED + } + if (isOpenValDeferredInitDeprecationWarning && factory == FirErrors.MUST_BE_INITIALIZED) { + error("Not reachable case. We can always suggest making `open val` property `final`") + } + reporter.reportOn( + propertySource, + when (isMissedMustBeInitializedDeprecationWarning || isOpenValDeferredInitDeprecationWarning) { + true -> factory.deprecationWarning + false -> factory + }, + context + ) } +private val KtDiagnosticFactory0.deprecationWarning + get() = when (this) { + FirErrors.MUST_BE_INITIALIZED -> FirErrors.MUST_BE_INITIALIZED_WARNING + FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT -> FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING + FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL -> FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING + FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT -> FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING + else -> error("Only MUST_BE_INITIALIZED is supported") + } + private val FirPropertyAccessor?.hasImplementation: Boolean get() = (this !is FirDefaultPropertyAccessor && this?.hasBody == true) private val FirProperty.hasSetterAccessorImplementation: Boolean diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 35d445302cf..65c3b70ce49 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -337,10 +337,12 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_P import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTI_FIELD_VALUE_CLASS_PRIMARY_CONSTRUCTOR_DEFAULT_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NAMED_ARGUMENTS_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NAMED_PARAMETER_NOT_FOUND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NAME_FOR_AMBIGUOUS_PARAMETER @@ -1633,9 +1635,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly") map.put(MUST_BE_INITIALIZED, "Property must be initialized") + map.put(MUST_BE_INITIALIZED_WARNING, "Property must be initialized. This warning will become an error in future releases.") map.put(MUST_BE_INITIALIZED_OR_BE_FINAL, "Property must be initialized or be final") map.put(MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING, "Property must be initialized or be final. This warning will become an error in future releases.") map.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract") + map.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING, "Property must be initialized or be abstract. This warning will become an error in future releases.") map.put(MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT, "Property must be initialized, be final, or be abstract") map.put(MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING, "Property must be initialized, be final, or be abstract. This warning will become an error in future releases.") diff --git a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt index d11a67736ec..3309e5c2967 100644 --- a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt +++ b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt @@ -327,7 +327,7 @@ class ControlFlowInformationProviderImpl private constructor( private fun markUninitializedVariables() { val varWithUninitializedErrorGenerated = hashSetOf() val varWithValReassignErrorGenerated = hashSetOf() - val processClassOrObject = subroutine is KtClassOrObject + val processClassOrObject = subroutine is KtClassOrObject || subroutine is KtSecondaryConstructor val initializers = pseudocodeVariablesData.variableInitializers val declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, true) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 60a1617cb34..3a494b85d4f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -673,9 +673,11 @@ public interface Errors { DiagnosticFactory0 PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); + DiagnosticFactory0 MUST_BE_INITIALIZED_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED_OR_BE_FINAL = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED_OR_BE_ABSTRACT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); + DiagnosticFactory0 MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 5b6ac0786f4..30d7eec62c4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -307,9 +307,11 @@ public class DefaultErrorMessages { MAP.put(BACKING_FIELD_IN_INTERFACE, "Property in an interface cannot have a backing field"); MAP.put(MUST_BE_INITIALIZED, "Property must be initialized"); + MAP.put(MUST_BE_INITIALIZED_WARNING, "Property must be initialized. This warning will become an error in future releases."); MAP.put(MUST_BE_INITIALIZED_OR_BE_FINAL, "Property must be initialized or be final"); MAP.put(MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING, "Property must be initialized or be final. This warning will become an error in future releases."); MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); + MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING, "Property must be initialized or be abstract. This warning will become an error in future releases."); MAP.put(MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT, "Property must be initialized, be final, or be abstract"); MAP.put(MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING, "Property must be initialized, be final, or be abstract. This warning will become an error in future releases."); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 20cacec0d78..0336599ffe8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -827,28 +827,40 @@ class DeclarationsChecker( propertyDescriptor.getEffectiveModality(languageVersionSettings) == Modality.OPEN && !propertyDescriptor.isVar && trace.bindingContext.get(IS_DEFINITELY_NOT_ASSIGNED_IN_CONSTRUCTOR, propertyDescriptor) == false - - val factory = when { - suggestMakingItFinal && suggestMakingItAbstract -> when (isOpenValDeferredInitDeprecationWarning) { - true -> MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING - false -> MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT - } - suggestMakingItFinal -> when (isOpenValDeferredInitDeprecationWarning) { - true -> MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING - false -> MUST_BE_INITIALIZED_OR_BE_FINAL - } - suggestMakingItAbstract -> when (isOpenValDeferredInitDeprecationWarning) { - true -> error("Not reachable case. Every \"open val + deferred init\" case that could be made `abstract`, also could be made `final`") - false -> MUST_BE_INITIALIZED_OR_BE_ABSTRACT - } - else -> when (isOpenValDeferredInitDeprecationWarning) { - true -> error("Not reachable case. We can always suggest making `open val` property `final`") - false -> MUST_BE_INITIALIZED - } + if (isOpenValDeferredInitDeprecationWarning && !suggestMakingItFinal && suggestMakingItAbstract) { + error("Not reachable case. Every \"open val + deferred init\" case that could be made `abstract`, also could be made `final`") } - trace.report(factory.on(property)) + val isMissedMustBeInitializedDeprecationWarning = + !languageVersionSettings.supportsFeature(LanguageFeature.ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor) && + containingDeclaration is ClassDescriptor && + containingDeclaration.constructors.none { it.isPrimary } && + trace.bindingContext.get(IS_DEFINITELY_NOT_ASSIGNED_IN_CONSTRUCTOR, propertyDescriptor) == false + val factory = when { + suggestMakingItFinal && suggestMakingItAbstract -> MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT + suggestMakingItFinal -> MUST_BE_INITIALIZED_OR_BE_FINAL + suggestMakingItAbstract -> MUST_BE_INITIALIZED_OR_BE_ABSTRACT + else -> MUST_BE_INITIALIZED + } + if (isOpenValDeferredInitDeprecationWarning && factory == MUST_BE_INITIALIZED) { + error("Not reachable case. We can always suggest making `open val` property `final`") + } + trace.report( + when (isMissedMustBeInitializedDeprecationWarning || isOpenValDeferredInitDeprecationWarning) { + true -> factory.deprecationWarning + false -> factory + }.on(property) + ) } + private val DiagnosticFactory0.deprecationWarning: DiagnosticFactory0 + get() = when (this) { + MUST_BE_INITIALIZED -> MUST_BE_INITIALIZED_WARNING + MUST_BE_INITIALIZED_OR_BE_ABSTRACT -> MUST_BE_INITIALIZED_OR_BE_ABSTRACT_WARNING + MUST_BE_INITIALIZED_OR_BE_FINAL -> MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING + MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT -> MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING + else -> error("Only MUST_BE_INITIALIZED is supported") + } + private fun noExplicitTypeOrGetterType(property: KtProperty) = property.typeReference == null && (property.getter == null || (property.getter!!.hasBlockBody() && property.getter!!.returnTypeReference == null)) diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt new file mode 100644 index 00000000000..f013be1c732 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt new file mode 100644 index 00000000000..418bdb35e12 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Base(x: Int) +class Foo : Base { + constructor() : super(1) + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..48fe7ae7932 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Base(x: Int) +class Foo : Base { + constructor() : super(1) + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt new file mode 100644 index 00000000000..986497f94ce --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + var x: String + set(value) {} + + constructor() { + x = "" + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..bca8ea09f11 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + var x: String + set(value) {} + + constructor() { + x = "" + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt new file mode 100644 index 00000000000..6d0c88ef4a9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + constructor() + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..10b04fee39a --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + constructor() + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt new file mode 100644 index 00000000000..d1915c53fd6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor, +ProhibitOpenValDeferredInitialization +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open val x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..934a7c5aa09 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor, +ProhibitOpenValDeferredInitialization +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open val x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt new file mode 100644 index 00000000000..8f1ec9368d4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor, -ProhibitOpenValDeferredInitialization +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open val x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..0237987d302 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor, -ProhibitOpenValDeferredInitialization +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open val x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt new file mode 100644 index 00000000000..b16ad04ef6c --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open var x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..683499fa5ca --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +open class Foo { + constructor() + + open var x: String + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt new file mode 100644 index 00000000000..b2bd816d33f --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +class Foo { + var foo: Int + set(value) {} + + constructor() { + if (1 != 1) { + foo = 1 + } + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt new file mode 100644 index 00000000000..50674c998a3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +class Foo { + var foo: Int + set(value) {} + + constructor(x: Int) {} + constructor() { + foo = 1 + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt new file mode 100644 index 00000000000..ed8fbe0c90b --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !LANGUAGE:+ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + constructor() + constructor(x: Int) + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt new file mode 100644 index 00000000000..5643a45bfcc --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo { + constructor() + constructor(x: Int) + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.kt b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.kt new file mode 100644 index 00000000000..238b8e4ac5b --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// !LANGUAGE:-ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +class Foo() { + constructor(x: Int) : this() + + var x: String + set(value) {} + + init { + x = "" + } +} diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.fir.kt b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.fir.kt index deb9cb25b2b..c052936972f 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.fir.kt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.fir.kt @@ -33,8 +33,8 @@ class SecondDerived : Second() { override fun foo() = y } -open class Third { - open var x: String +abstract class Third { + abstract var x: String constructor() { x = "X" // Non-final property access diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.kt b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.kt index 91c74f34021..e1ce1a7b985 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.kt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.kt @@ -33,8 +33,8 @@ class SecondDerived : Second() { override fun foo() = y } -open class Third { - open var x: String +abstract class Third { + abstract var x: String constructor() { x = "X" // Non-final property access diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.txt b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.txt index 71fbb2e8b45..065189d8348 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/inspection.txt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/inspection.txt @@ -42,9 +42,9 @@ public final class SecondDerived : Second { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } -public open class Third { +public abstract class Third { public constructor Third() - public open var x: kotlin.String + public abstract var x: kotlin.String public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.fir.kt b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.fir.kt index 35a6ae666fb..896c7e6536a 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.fir.kt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.fir.kt @@ -1,7 +1,7 @@ -open class Base { - open var x: Int +abstract class Base { + abstract var x: Int - open var y: Int + abstract var y: Int constructor() { x = 42 @@ -9,6 +9,5 @@ open class Base { val temp = this.x this.x = y y = temp - } } diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.kt b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.kt index 980f541ebf4..c239b6e5b3d 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.kt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.kt @@ -1,7 +1,7 @@ -open class Base { - open var x: Int +abstract class Base { + abstract var x: Int - open var y: Int + abstract var y: Int constructor() { x = 42 @@ -9,6 +9,5 @@ open class Base { val temp = this.x this.x = y y = temp - } } diff --git a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.txt b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.txt index a0f9b3a38d6..597f960158f 100644 --- a/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.txt +++ b/compiler/testData/diagnostics/tests/constructorConsistency/openProperty.txt @@ -1,9 +1,9 @@ package -public open class Base { +public abstract class Base { public constructor Base() - public open var x: kotlin.Int - public open var y: kotlin.Int + public abstract var x: kotlin.Int + public abstract var y: kotlin.Int public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String 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 23c74d9b1bd..effa1b49dd0 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 @@ -3043,6 +3043,124 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testVarDeferredInitInOpenClass() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); } + + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor") + @TestDataPath("$PROJECT_ROOT") + public class ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor { + @Test + public void testAllFilesPresentInProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true); + } + + @Test + @TestMetadata("implicitPrimaryConstructor_errorAnyway.kt") + public void testImplicitPrimaryConstructor_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/implicitPrimaryConstructor_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneInheritedSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneInheritedSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_deferredInitInSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValError_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValError_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openValWarning_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openValWarning_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedError.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt") + public void testNoPrimary_oneSecondary_openVar_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_oneSecondary_openVar_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInSecondary_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInSecondary_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt") + public void testNoPrimary_partialDeferredInitInTwoSecondaries_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_partialDeferredInitInTwoSecondaries_errorAnyway.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedError.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedError() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedError.kt"); + } + + @Test + @TestMetadata("noPrimary_twoSecondary_mustBeInitializedWarning.kt") + public void testNoPrimary_twoSecondary_mustBeInitializedWarning() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/noPrimary_twoSecondary_mustBeInitializedWarning.kt"); + } + + @Test + @TestMetadata("onePrimary_oneSecondary_errorAnyway.kt") + public void testOnePrimary_oneSecondary_errorAnyway() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/prohibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor/onePrimary_oneSecondary_errorAnyway.kt"); + } + } } @Nested diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 351ab787b66..40a0ad0a2f5 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -289,6 +289,7 @@ enum class LanguageFeature( KeepNullabilityWhenApproximatingLocalType(KOTLIN_2_0, kind = BUG_FIX), // KT-53982 ProhibitAccessToInvisibleSetterFromDerivedClass(KOTLIN_2_0, kind = BUG_FIX), // KT-56662 ProhibitOpenValDeferredInitialization(KOTLIN_2_0, kind = BUG_FIX), // KT-57553 + ProhibitMissedMustBeInitializedWhenThereIsNoPrimaryConstructor(KOTLIN_2_0, kind = BUG_FIX), // KT-58472 // 2.1