From aeb1714a62b31ad30a574763f7ab1ca60fbe51e3 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 11 Jul 2023 13:21:38 +0200 Subject: [PATCH] [java-highlighting] IDEA-324641 Allow fallthrough for empty block GitOrigin-RevId: e60d99c7c4e142d0df91601e9bcee02f4ff4cd7e --- .../daemon/impl/analysis/SwitchBlockHighlightingModel.java | 6 ++++++ .../IllegalFallthroughIn21Java.java | 7 +++++++ .../daemon/LightPatternsForSwitchHighlightingTest.java | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java index 612be171b604..e70e39ade426 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java @@ -925,6 +925,12 @@ public class SwitchBlockHighlightingModel { addIllegalFallThroughError(problem.element(), problem.message(), holder, alreadyFallThroughElements); } else if (JavaPsiPatternUtil.containsPatternVariable(first)) { + PsiElement nextNotLabel = PsiTreeUtil.skipSiblingsForward(switchLabelElement, PsiWhiteSpace.class, PsiComment.class, + PsiSwitchLabelStatement.class); + //there is no statement, it is allowed to go through (14.11.1 JEP 440-441) + if (!(nextNotLabel instanceof PsiStatement)) { + continue; + } if (PsiTreeUtil.skipWhitespacesAndCommentsForward(switchLabelElement) instanceof PsiSwitchLabelStatement) { addIllegalFallThroughError(first, "multiple.switch.labels", holder, alreadyFallThroughElements); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IllegalFallthroughIn21Java.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IllegalFallthroughIn21Java.java index 46ebeaf3a140..682ddc18dd35 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IllegalFallthroughIn21Java.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IllegalFallthroughIn21Java.java @@ -187,4 +187,11 @@ class IllegalFallthroughIn21Java { } } + void emptyCase(Object o) { + switch (o) { + case Integer a1: + case Object a222: + // System.out.println("1"); + } + } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java index 8e8c5555e8f8..86e3dc7a017d 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java @@ -52,7 +52,8 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight } public void testIllegalFallthroughIn20Java() { - IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_20_PREVIEW, this::doTest); + //there are no changes in 20->21 + IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21, this::doTest); } public void testIllegalFallthroughIn21Java() { IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21, this::doTest);