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) {