[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:
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
-3
@@ -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
|
||||
|
||||
+11
@@ -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
|
||||
}
|
||||
}
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user