From de12771c0f35f18d80d2fffb032b4894a54f431e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 May 2015 15:28:13 +0300 Subject: [PATCH] Warning generation on non-exhaustive whens over enums + a set of tests + fixed test #KT-6227 Fixed --- .../cfg/JetFlowInformationProvider.java | 17 ++++-- .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + .../testData/diagnostics/tests/j+k/kt2619.kt | 2 +- .../tests/when/NonExhaustiveWarning.kt | 11 ++++ .../tests/when/NonExhaustiveWarning.txt | 57 +++++++++++++++++++ .../tests/when/NonExhaustiveWarningElse.kt | 12 ++++ .../tests/when/NonExhaustiveWarningElse.txt | 57 +++++++++++++++++++ .../tests/when/NonExhaustiveWarningFalse.kt | 13 +++++ .../tests/when/NonExhaustiveWarningFalse.txt | 57 +++++++++++++++++++ .../tests/when/NonExhaustiveWarningNull.kt | 14 +++++ .../tests/when/NonExhaustiveWarningNull.txt | 57 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 24 ++++++++ 13 files changed, 318 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.kt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.txt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.kt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.txt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.kt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.txt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.kt create mode 100644 compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java index 2df6b12d706..c1b722ef01b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java @@ -759,10 +759,19 @@ public class JetFlowInformationProvider { ? ((InstructionWithValue) instruction).getOutputValue() : null; for (JetElement element : instruction.getOwner().getValueElements(value)) { - if (element instanceof JetWhenExpression) { - JetWhenExpression whenExpression = (JetWhenExpression) element; - if (whenExpression.getElseExpression() == null && WhenChecker.mustHaveElse(whenExpression, trace)) { - trace.report(NO_ELSE_IN_WHEN.on(whenExpression)); + if (!(element instanceof JetWhenExpression)) continue; + JetWhenExpression whenExpression = (JetWhenExpression) element; + if (whenExpression.getElseExpression() != null) continue; + + if (WhenChecker.mustHaveElse(whenExpression, trace)) { + trace.report(NO_ELSE_IN_WHEN.on(whenExpression)); + } + else if (whenExpression.getSubjectExpression() != null) { + ClassDescriptor enumClassDescriptor = WhenChecker.getClassDescriptorOfTypeIfEnum( + trace.getType(whenExpression.getSubjectExpression())); + if (enumClassDescriptor != null + && !WhenChecker.isWhenOnEnumExhaustive(whenExpression, trace, enumClassDescriptor)) { + trace.report(NON_EXHAUSTIVE_WHEN.on(whenExpression)); } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 2d1e6e5b875..4cca818234c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -619,6 +619,7 @@ public interface Errors { DiagnosticFactory0 EXPECTED_CONDITION = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ELSE_MISPLACED_IN_WHEN = DiagnosticFactory0.create(ERROR, ELSE_ENTRY); DiagnosticFactory0 NO_ELSE_IN_WHEN = DiagnosticFactory0.create(ERROR, WHEN_EXPRESSION); + DiagnosticFactory0 NON_EXHAUSTIVE_WHEN = DiagnosticFactory0.create(WARNING, WHEN_EXPRESSION); // Type mismatch 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 61e916b6fbc..2dee914eebe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -387,6 +387,7 @@ public class DefaultErrorMessages { MAP.put(ELSE_MISPLACED_IN_WHEN, "'else' entry must be the last one in a when-expression"); MAP.put(NO_ELSE_IN_WHEN, "'when' expression must contain 'else' branch"); + MAP.put(NON_EXHAUSTIVE_WHEN, "'when' expression contains only some variants and no 'else' branch"); MAP.put(TYPE_MISMATCH_IN_RANGE, "Type mismatch: incompatible types of range and element checked in it"); MAP.put(CYCLIC_INHERITANCE_HIERARCHY, "There's a cycle in the inheritance hierarchy for this type"); diff --git a/compiler/testData/diagnostics/tests/j+k/kt2619.kt b/compiler/testData/diagnostics/tests/j+k/kt2619.kt index 8918e35a301..89e5b6e623a 100644 --- a/compiler/testData/diagnostics/tests/j+k/kt2619.kt +++ b/compiler/testData/diagnostics/tests/j+k/kt2619.kt @@ -1,7 +1,7 @@ //FILE: foo.kt fun main(args: Array) { val c: Type - when (c) { + when (c) { } } diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.kt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.kt new file mode 100644 index 00000000000..fea80b4b2c8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.kt @@ -0,0 +1,11 @@ +// Base for KT-6227 +enum class X { A, B, C, D } + +fun foo(arg: X): String { + var res = "XXX" + when (arg) { + X.A -> res = "A" + X.B -> res = "B" + } + return res +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.txt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.txt new file mode 100644 index 00000000000..a168907e08d --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.txt @@ -0,0 +1,57 @@ +package + +internal fun foo(/*0*/ arg: X): kotlin.String + +internal final enum class X : kotlin.Enum { + public enum entry A : X { + private constructor A() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry B : X { + private constructor B() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry C : X { + private constructor C() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry D : X { + private constructor D() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor X() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): X + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.kt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.kt new file mode 100644 index 00000000000..673943fa385 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.kt @@ -0,0 +1,12 @@ +// Base for KT-6227 +enum class X { A, B, C, D } + +fun foo(arg: X): String { + val res: String + when (arg) { + X.A -> res = "A" + X.B -> res = "B" + else -> res = "CD" + } + return res +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.txt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.txt new file mode 100644 index 00000000000..a168907e08d --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.txt @@ -0,0 +1,57 @@ +package + +internal fun foo(/*0*/ arg: X): kotlin.String + +internal final enum class X : kotlin.Enum { + public enum entry A : X { + private constructor A() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry B : X { + private constructor B() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry C : X { + private constructor C() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry D : X { + private constructor D() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor X() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): X + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.kt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.kt new file mode 100644 index 00000000000..c78080fd833 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.kt @@ -0,0 +1,13 @@ +// Base for KT-6227 +enum class X { A, B, C, D } + +fun foo(arg: X): String { + val res: String + when (arg) { + X.A -> res = "A" + X.B -> res = "B" + X.C -> res = "C" + X.D -> res = "D" + } + return res +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.txt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.txt new file mode 100644 index 00000000000..a168907e08d --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.txt @@ -0,0 +1,57 @@ +package + +internal fun foo(/*0*/ arg: X): kotlin.String + +internal final enum class X : kotlin.Enum { + public enum entry A : X { + private constructor A() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry B : X { + private constructor B() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry C : X { + private constructor C() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry D : X { + private constructor D() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor X() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): X + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.kt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.kt new file mode 100644 index 00000000000..a71a3c99564 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.kt @@ -0,0 +1,14 @@ +// Base for KT-6227 +enum class X { A, B, C, D } + +fun foo(arg: X?): String { + var res = "XXX" + // Should we report something here? Probably not, null is not an enum entry + when (arg) { + X.A -> res = "A" + X.B -> res = "B" + X.C -> res = "C" + X.D -> res = "D" + } + return res +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.txt b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.txt new file mode 100644 index 00000000000..050b3bc832b --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.txt @@ -0,0 +1,57 @@ +package + +internal fun foo(/*0*/ arg: X?): kotlin.String + +internal final enum class X : kotlin.Enum { + public enum entry A : X { + private constructor A() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry B : X { + private constructor B() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry C : X { + private constructor C() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public enum entry D : X { + private constructor D() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor X() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: X): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): X + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index f3b9c0ca615..7831087ef06 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -13728,6 +13728,30 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("NonExhaustiveWarning.kt") + public void testNonExhaustiveWarning() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/NonExhaustiveWarning.kt"); + doTest(fileName); + } + + @TestMetadata("NonExhaustiveWarningElse.kt") + public void testNonExhaustiveWarningElse() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/NonExhaustiveWarningElse.kt"); + doTest(fileName); + } + + @TestMetadata("NonExhaustiveWarningFalse.kt") + public void testNonExhaustiveWarningFalse() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/NonExhaustiveWarningFalse.kt"); + doTest(fileName); + } + + @TestMetadata("NonExhaustiveWarningNull.kt") + public void testNonExhaustiveWarningNull() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/NonExhaustiveWarningNull.kt"); + doTest(fileName); + } + @TestMetadata("PropertyNotInitialized.kt") public void testPropertyNotInitialized() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/when/PropertyNotInitialized.kt");