[FE] Prohibit open val deferred initialization

^KT-57553 Fixed
Review: https://jetbrains.team/p/kt/reviews/9967

Other related tests:
- testUninitializedOrReassignedVariables
- testUseOfPropertiesWithoutPrimary
- @TestMetadata("compiler/testData/diagnostics/tests/secondaryConstructors")
- testAugmentedAssignmentInInitializer
- testInitOpenSetter
- testInitOverrideInConstructorComplex
- testPropertyInitializationOrder
This commit is contained in:
Nikita Bobko
2023-05-01 15:18:51 +02:00
parent 38319c55a8
commit ac40010501
27 changed files with 399 additions and 151 deletions
@@ -2857,6 +2857,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.MUST_BE_INITIALIZED_OR_BE_FINAL_WARNING) { firDiagnostic ->
MustBeInitializedOrBeFinalWarningImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT) { firDiagnostic ->
MustBeInitializedOrBeAbstractImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -2869,6 +2875,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.MUST_BE_INITIALIZED_OR_FINAL_OR_ABSTRACT_WARNING) { firDiagnostic ->
MustBeInitializedOrFinalOrAbstractWarningImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.EXTENSION_PROPERTY_MUST_HAVE_ACCESSORS_OR_BE_ABSTRACT) { firDiagnostic ->
ExtensionPropertyMustHaveAccessorsOrBeAbstractImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -2023,6 +2023,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = MustBeInitializedOrBeFinal::class
}
abstract class MustBeInitializedOrBeFinalWarning : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrBeFinalWarning::class
}
abstract class MustBeInitializedOrBeAbstract : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrBeAbstract::class
}
@@ -2031,6 +2035,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = MustBeInitializedOrFinalOrAbstract::class
}
abstract class MustBeInitializedOrFinalOrAbstractWarning : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = MustBeInitializedOrFinalOrAbstractWarning::class
}
abstract class ExtensionPropertyMustHaveAccessorsOrBeAbstract : KtFirDiagnostic<KtProperty>() {
override val diagnosticClass get() = ExtensionPropertyMustHaveAccessorsOrBeAbstract::class
}
@@ -2430,6 +2430,11 @@ internal class MustBeInitializedOrBeFinalImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedOrBeFinal(), KtAbstractFirDiagnostic<KtProperty>
internal class MustBeInitializedOrBeFinalWarningImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedOrBeFinalWarning(), KtAbstractFirDiagnostic<KtProperty>
internal class MustBeInitializedOrBeAbstractImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
@@ -2440,6 +2445,11 @@ internal class MustBeInitializedOrFinalOrAbstractImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedOrFinalOrAbstract(), KtAbstractFirDiagnostic<KtProperty>
internal class MustBeInitializedOrFinalOrAbstractWarningImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.MustBeInitializedOrFinalOrAbstractWarning(), KtAbstractFirDiagnostic<KtProperty>
internal class ExtensionPropertyMustHaveAccessorsOrBeAbstractImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
@@ -2984,6 +2984,24 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitErrorAnyway.kt")
public void testOpenValPartialDeferredInitErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitErrorAnyway.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitSecondaryConstructorErrorAnyway.kt")
public void testOpenValPartialDeferredInitSecondaryConstructorErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitSecondaryConstructorErrorAnyway.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway.kt")
public void testOpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway.kt");
}
@Test
@TestMetadata("SetterWithExplicitType.kt")
public void testSetterWithExplicitType() throws Exception {
@@ -2997,9 +3015,15 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
}
@Test
@TestMetadata("ValDeferredInitInOpenClass.kt")
public void testValDeferredInitInOpenClass() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt");
@TestMetadata("ValDeferredInitInOpenClassOpenValError.kt")
public void testValDeferredInitInOpenClassOpenValError() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValError.kt");
}
@Test
@TestMetadata("ValDeferredInitInOpenClassOpenValWarning.kt")
public void testValDeferredInitInOpenClassOpenValWarning() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@@ -2984,6 +2984,24 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOn.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitErrorAnyway.kt")
public void testOpenValPartialDeferredInitErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitErrorAnyway.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitSecondaryConstructorErrorAnyway.kt")
public void testOpenValPartialDeferredInitSecondaryConstructorErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitSecondaryConstructorErrorAnyway.kt");
}
@Test
@TestMetadata("OpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway.kt")
public void testOpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/OpenValPartialDeferredInitTwoSecondaryConstructorsErrorAnyway.kt");
}
@Test
@TestMetadata("SetterWithExplicitType.kt")
public void testSetterWithExplicitType() throws Exception {
@@ -2997,9 +3015,15 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
}
@Test
@TestMetadata("ValDeferredInitInOpenClass.kt")
public void testValDeferredInitInOpenClass() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt");
@TestMetadata("ValDeferredInitInOpenClassOpenValError.kt")
public void testValDeferredInitInOpenClassOpenValError() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValError.kt");
}
@Test
@TestMetadata("ValDeferredInitInOpenClassOpenValWarning.kt")
public void testValDeferredInitInOpenClassOpenValWarning() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test