From 5e839de419955ca76e7cf53a4f540f3b1003bea2 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Thu, 23 Feb 2023 14:15:12 +0100 Subject: [PATCH] [java-highlighting] IDEA-313993 unreachable statement: false negative GitOrigin-RevId: 396da7635b4bee1c921444c2b23f89f8c67e5895 --- .../intellij/psi/controlFlow/ControlFlowAnalyzer.java | 2 +- .../switchExpressions/EnhancedSwitchUnreachable.java | 10 +++++++++- .../daemon/JavaSwitchExpressionsHighlightingTest.kt | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index 8c6e448ebaa2..5dc2cb59cf6c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -979,7 +979,7 @@ final class ControlFlowAnalyzer extends JavaElementVisitor { if (labelElementList != null) { for (PsiCaseLabelElement element : labelElementList.getElements()) { if (element instanceof PsiDefaultCaseLabelElement || - element instanceof PsiPattern && exprType != null && JavaPsiPatternUtil.isUnconditionalForType(element, exprType)) { + exprType != null && JavaPsiPatternUtil.isUnconditionalForType(element, exprType)) { needToCreateDefault = true; break; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/EnhancedSwitchUnreachable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/EnhancedSwitchUnreachable.java index 1273d940ead8..43d0fbd11ab8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/EnhancedSwitchUnreachable.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/EnhancedSwitchUnreachable.java @@ -1,5 +1,5 @@ class C { - void alwaysThrow(String s) { + void alwaysThrow1(String s) { switch (s) { case "a" -> throw new IllegalArgumentException(); default -> throw new IllegalStateException(); @@ -7,6 +7,14 @@ class C { System.out.println(); } + void alwaysThrow2(Integer i) { + switch (i) { + case Integer integer when true: + throw new IllegalArgumentException(); + } + System.out.println(42); + } + void breakFromEndlessLoop() { EndlessLoop: for (;;) { diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSwitchExpressionsHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSwitchExpressionsHighlightingTest.kt index 2c0066cf82a2..4923ff2a8ac0 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSwitchExpressionsHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSwitchExpressionsHighlightingTest.kt @@ -3,6 +3,8 @@ package com.intellij.java.codeInsight.daemon import com.intellij.JavaTestUtil import com.intellij.codeInspection.redundantCast.RedundantCastInspection +import com.intellij.pom.java.LanguageLevel +import com.intellij.testFramework.IdeaTestUtil import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase class JavaSwitchExpressionsHighlightingTest : LightJavaCodeInsightFixtureTestCase() { @@ -16,7 +18,7 @@ class JavaSwitchExpressionsHighlightingTest : LightJavaCodeInsightFixtureTestCas fun testSwitchNumericPromotion() = doTest() fun testSimpleInferenceCases() = doTest() fun testEnhancedSwitchDefinitelyAssigned() = doTest() - fun testEnhancedSwitchUnreachable() = doTest() + fun testEnhancedSwitchUnreachable() = IdeaTestUtil.withLevel(module, LanguageLevel.JDK_20_PREVIEW) { doTest() } fun testSwitchExpressionHasResult() = doTest() fun testYieldStatements() = doTest() fun testAssignToFinalInSwitchExpression() = doTest()