[FE] Fix "Not reachable case" exception

Review: https://jetbrains.team/p/kt/reviews/9967

This commit fixes:

    Cause 2: java.lang.IllegalStateException: Not reachable case. We can always suggest making `open val` property `final`
            at org.jetbrains.kotlin.resolve.DeclarationsChecker.reportMustBeInitialized(DeclarationsChecker.kt:845)
            at org.jetbrains.kotlin.resolve.DeclarationsChecker.checkPropertyInitializer(DeclarationsChecker.kt:778)
            at org.jetbrains.kotlin.resolve.DeclarationsChecker.checkProperty(DeclarationsChecker.kt:614)
            at org.jetbrains.kotlin.resolve.DeclarationsChecker.process(DeclarationsChecker.kt:106)
            at org.jetbrains.kotlin.resolve.BodyResolver.resolveBodies(BodyResolver.java:258)

Reproducible in K1 & K2
This commit is contained in:
Nikita Bobko
2023-05-15 11:43:38 +02:00
parent 26e45304e1
commit 771f82bcf6
8 changed files with 41 additions and 6 deletions
@@ -3026,6 +3026,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@TestMetadata("ValWithSetterDeferredInit.kt")
public void testValWithSetterDeferredInit() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValWithSetterDeferredInit.kt");
}
@Test
@TestMetadata("VarDeferredInitInFinalClass.kt")
public void testVarDeferredInitInFinalClass() throws Exception {
@@ -3026,6 +3026,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@TestMetadata("ValWithSetterDeferredInit.kt")
public void testValWithSetterDeferredInit() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValWithSetterDeferredInit.kt");
}
@Test
@TestMetadata("VarDeferredInitInFinalClass.kt")
public void testVarDeferredInitInFinalClass() throws Exception {
@@ -3026,6 +3026,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@TestMetadata("ValWithSetterDeferredInit.kt")
public void testValWithSetterDeferredInit() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValWithSetterDeferredInit.kt");
}
@Test
@TestMetadata("VarDeferredInitInFinalClass.kt")
public void testVarDeferredInitInFinalClass() throws Exception {
@@ -3032,6 +3032,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@TestMetadata("ValWithSetterDeferredInit.kt")
public void testValWithSetterDeferredInit() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValWithSetterDeferredInit.kt");
}
@Test
@TestMetadata("VarDeferredInitInFinalClass.kt")
public void testVarDeferredInitInFinalClass() throws Exception {
@@ -201,9 +201,6 @@ private fun reportMustBeInitialized(
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) {
@@ -841,9 +841,6 @@ class DeclarationsChecker(
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
@@ -0,0 +1,11 @@
// FIR_IDENTICAL
// LANGUAGE: -ProhibitOpenValDeferredInitialization
// DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS
open class A {
<!MUST_BE_INITIALIZED_WARNING!>open val c: Int<!>
<!VAL_WITH_SETTER!>set(value) {}<!>
init {
c = 1
}
}
@@ -3032,6 +3032,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClassOpenValWarning.kt");
}
@Test
@TestMetadata("ValWithSetterDeferredInit.kt")
public void testValWithSetterDeferredInit() throws Exception {
runTest("compiler/testData/diagnostics/tests/backingField/ValWithSetterDeferredInit.kt");
}
@Test
@TestMetadata("VarDeferredInitInFinalClass.kt")
public void testVarDeferredInitInFinalClass() throws Exception {