[FE] Prohibit missed MUST_BE_INITIALIZED when there is no primary constructor

^KT-58472 Fixed
Review: https://jetbrains.team/p/kt/reviews/9967
This commit is contained in:
Nikita Bobko
2023-05-05 17:53:25 +02:00
parent ac40010501
commit de8c3826c2
41 changed files with 934 additions and 60 deletions
@@ -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,
@@ -2019,6 +2019,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = MustBeInitialized::class
}
abstract class MustBeInitializedWarning : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedWarning::class
}
abstract class MustBeInitializedOrBeFinal : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrBeFinal::class
}
@@ -2031,6 +2035,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = MustBeInitializedOrBeAbstract::class
}
abstract class MustBeInitializedOrBeAbstractWarning : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrBeAbstractWarning::class
}
abstract class MustBeInitializedOrFinalOrAbstract : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrFinalOrAbstract::class
}
@@ -2425,6 +2425,11 @@ internal class MustBeInitializedImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitialized(), KtAbstractFirDiagnostic<KtProperty>
internal class MustBeInitializedWarningImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedWarning(), KtAbstractFirDiagnostic<KtProperty>
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<KtProperty>
internal class MustBeInitializedOrBeAbstractWarningImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedOrBeAbstractWarning(), KtAbstractFirDiagnostic<KtProperty>
internal class MustBeInitializedOrFinalOrAbstractImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
@@ -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
@@ -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