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 bf486def3fca..c3f297c124f6 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 @@ -656,7 +656,7 @@ public class SwitchBlockHighlightingModel { break; } } - return new SealedResult(missingClasses, coveredClasses) ; + return new SealedResult(missingClasses, coveredClasses); } static boolean isAbstractSealed(@Nullable PsiClass psiClass) { @@ -1385,6 +1385,8 @@ public class SwitchBlockHighlightingModel { if (permitsList == null) { results = SyntaxTraverser.psiTraverser(psiClass.getContainingFile()) .filter(PsiClass.class) + //local classes and anonymous classes must not extend sealed + .filter(cls -> !(cls instanceof PsiAnonymousClass || PsiUtil.isLocalClass(cls))) .filter(cls -> cls.isInheritor(psiClass, false)) .toList(); } diff --git a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SealedUtils.java b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SealedUtils.java index 89f49d6c3afc..b7ccc8d16102 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SealedUtils.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SealedUtils.java @@ -89,6 +89,8 @@ public final class SealedUtils { GlobalSearchScope fileScope = GlobalSearchScope.fileScope(psiClass.getContainingFile().getOriginalFile()); return DirectClassInheritorsSearch.search(psiClass, fileScope) .filtering(inheritor -> !ArrayUtil.contains(inheritor, classesToExclude)) + //local classes and anonymous classes must not extend sealed + .filtering(cls -> !(cls instanceof PsiAnonymousClass || PsiUtil.isLocalClass(cls))) .mapping(mapper) .findAll(); } diff --git a/java/java-tests/testData/codeInsight/completion/normal/variants/CompletionAnonymousAndLocalNotShow.java b/java/java-tests/testData/codeInsight/completion/normal/variants/CompletionAnonymousAndLocalNotShow.java new file mode 100644 index 000000000000..fcf86b6df085 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/variants/CompletionAnonymousAndLocalNotShow.java @@ -0,0 +1,25 @@ +public class Main { + + sealed interface I { + final class C1 implements I { + } + + static void test() { + final class TT implements I { + + } + + I i2 = new I() { + }; + + I i = getI(); + switch (i) { + + } + } + + private static I getI() { + return null; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/SealedWithLocalAndAnonymousClasses.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/SealedWithLocalAndAnonymousClasses.java new file mode 100644 index 000000000000..b9d1f7808625 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/SealedWithLocalAndAnonymousClasses.java @@ -0,0 +1,27 @@ +public class SealedWithLocalAndAnonymousClasses { + + sealed interface I { + final class C1 implements I { + } + + static void test() { + final class TT implements I { + + } + + I i2 = new I() { + }; + + I i = getI(); + switch (i) { + case C1 c1 -> { + System.out.println("1"); + } + } + } + + private static I getI() { + return null; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalSwitchCompletionVariantsTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalSwitchCompletionVariantsTest.java index d1d134e04320..bf47d5d5b0c1 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalSwitchCompletionVariantsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalSwitchCompletionVariantsTest.java @@ -78,6 +78,12 @@ public class NormalSwitchCompletionVariantsTest extends LightFixtureCompletionTe assertDoesntContain(lookup, "case A"); assertContainsElements(lookup, "case B"); } + @NeedsIndex.Full + public void testCompletionAnonymousAndLocalNotShow() { + List lookup = doTestAndGetLookup(); + assertNotNull(lookup); + assertContainsElements(lookup, "case C1"); + } @NeedsIndex.Full public void testCompletionSmartCase() { 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 18e24f17cd3e..26bf0587e5de 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 @@ -208,6 +208,10 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight doTest(); } + public void testSealedWithLocalAndAnonymousClasses() { + doTest(); + } + private void doTest() { myFixture.configureByFile(getTestName(false) + ".java"); myFixture.checkHighlighting();