diff --git a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/ClassChecker.java b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/ClassChecker.java index 044b00259fd1..e11264d43a01 100644 --- a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/ClassChecker.java +++ b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/ClassChecker.java @@ -159,16 +159,10 @@ final class ClassChecker { PsiElement parent = aClass.getParent(); boolean checkSiblings; if (parent instanceof PsiClass psiClass && !PsiUtil.isLocalOrAnonymousClass(psiClass) && !PsiUtil.isLocalOrAnonymousClass(aClass)) { - // optimization: instead of iterating PsiClass children manually, we can get them all from caches - PsiClass innerClass = psiClass.findInnerClassByName(name, false); - if (innerClass != null && innerClass != aClass) { - if (innerClass.getTextOffset() > aClass.getTextOffset()) { - // report duplicate lower in text - PsiClass c = innerClass; - innerClass = aClass; - aClass = c; - } - myVisitor.report(JavaErrorKinds.CLASS_DUPLICATE.create(aClass, innerClass)); + var duplicates = ContainerUtil.filter(psiClass.getInnerClasses(), c -> Objects.equals(c.getName(), name)); + var duplicatesWithoutMe = ContainerUtil.filter(duplicates, c -> c != aClass); + if (!duplicatesWithoutMe.isEmpty()) { + myVisitor.report(JavaErrorKinds.CLASS_DUPLICATE.create(aClass, duplicatesWithoutMe.get(0))); return; } checkSiblings = false; // there still might be duplicates in parents @@ -204,6 +198,7 @@ final class ClassChecker { if (element instanceof PsiClass psiClass && name.equals(psiClass.getName())) { myVisitor.report(JavaErrorKinds.CLASS_DUPLICATE.create(aClass, psiClass)); + return; } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateClassMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateClassMethod.java index 8470ae77cf8c..cca871a9e8fb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateClassMethod.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateClassMethod.java @@ -20,6 +20,20 @@ interface ii { class a { } +class DuplicateNestedClassesTest { + public class C {} + public class C {} + public class C {} +} + +class DuplicateLocalClassesTest { + public void foo() { + class D {} + class D {} + class D {} + } +} + class Foo { void f() { class Bar { @@ -41,7 +55,7 @@ class c2 { class cont { - class B { + class B { } { class B { diff --git a/java/java-tests/testData/ig/com/siyeh/igtest/inheritance/abstract_method_with_missing_implementations/DuplicateClass.java b/java/java-tests/testData/ig/com/siyeh/igtest/inheritance/abstract_method_with_missing_implementations/DuplicateClass.java index eddc8aa89208..b1eaba9a15d9 100644 --- a/java/java-tests/testData/ig/com/siyeh/igtest/inheritance/abstract_method_with_missing_implementations/DuplicateClass.java +++ b/java/java-tests/testData/ig/com/siyeh/igtest/inheritance/abstract_method_with_missing_implementations/DuplicateClass.java @@ -5,7 +5,7 @@ class Temp35 { @Override public void work() { } }; } - public interface Workable { void work(); } + public interface Workable { void work(); } public interface Workable { void work(); } public static void main(String[] args) {