From f47870ae8a7cbf5e48526702edd589ec37a2392c Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Mon, 7 Feb 2022 11:55:45 +0700 Subject: [PATCH] EA-447738 [patterns for switch] - handle the case when permits list contains unresolved reference type GitOrigin-RevId: 5a0adb3d51d548f40771a336d3fcbe76305be524 --- .../SwitchBlockHighlightingModel.java | 4 ++- .../BrokenSealedHierarchy.java | 26 +++++++++++++++++++ ...ightPatternsForSwitchHighlightingTest.java | 4 +++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/BrokenSealedHierarchy.java 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 3bd56703bd84..222f5580a889 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 @@ -28,6 +28,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.intellij.codeInsight.daemon.impl.analysis.SwitchBlockHighlightingModel.PatternsInSwitchBlockHighlightingModel.CompletenessResult.*; import static com.intellij.psi.PsiModifier.ABSTRACT; @@ -863,7 +865,7 @@ public class SwitchBlockHighlightingModel { GlobalSearchScope fileScope = GlobalSearchScope.fileScope(psiClass.getContainingFile()); return new ArrayList<>(DirectClassInheritorsSearch.search(psiClass, fileScope).findAll()); } - return ContainerUtil.map(permitsList.getReferencedTypes(), type -> type.resolve()); + return Stream.of(permitsList.getReferencedTypes()).map(type -> type.resolve()).filter(Objects::nonNull).collect(Collectors.toSet()); } @Nullable diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/BrokenSealedHierarchy.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/BrokenSealedHierarchy.java new file mode 100644 index 000000000000..ccd6eaf6cafc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/BrokenSealedHierarchy.java @@ -0,0 +1,26 @@ + +class Test { + void test(Sealed1 s1, Sealed2 s2) { + switch (s1) { + case A1 a -> System.out.println(); + } + switch (s2) { + case A2 a -> System.out.println(); + } + } +} + +sealed abstract class Sealed1 permits A1, B1, C1 { +} + +final class A1 extends Sealed1 { +} + +final class C1 extends Sealed1 { +} + +sealed abstract class Sealed2 permits A2, A2 { +} + +final class A2 extends Sealed2 { +} \ No newline at end of file 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 677325603cbf..7d134a9ade70 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 @@ -117,6 +117,10 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight doTest(); } + public void testBrokenSealedHierarchy() { + doTest(); + } + private void doTest() { myFixture.configureByFile(getTestName(false) + ".java"); myFixture.checkHighlighting();