[java] IDEA-376793 Fix 'Duplicate class' error check to highlight each duplicate class exactly once

Merge-request: IJ-MR-171426
Merged-by: Marcin Mikosik <marcin.mikosik@jetbrains.com>

GitOrigin-RevId: 882e7e6b7ee66083be0376bbc84b23bd60903977
This commit is contained in:
Marcin Mikosik
2025-08-19 09:20:45 +00:00
committed by intellij-monorepo-bot
parent 3ff47764d5
commit dc005115cd
3 changed files with 21 additions and 12 deletions
@@ -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;
}
}
}
@@ -20,6 +20,20 @@ interface ii {
class <error descr="Duplicate class: 'a'">a</error> {
}
class DuplicateNestedClassesTest {
public class <error descr="Duplicate class: 'C'">C</error> {}
public class <error descr="Duplicate class: 'C'">C</error> {}
public class <error descr="Duplicate class: 'C'">C</error> {}
}
class DuplicateLocalClassesTest {
public void foo() {
class D {}
class <error descr="Duplicate class: 'D'">D</error> {}
class <error descr="Duplicate class: 'D'">D</error> {}
}
}
class Foo {
void f() {
class Bar {
@@ -41,7 +55,7 @@ class c2 {
class cont {
class B {
class <error descr="Duplicate class: 'B'">B</error> {
}
{
class B {
@@ -5,7 +5,7 @@ class Temp35 {
@Override public void work() { }
}; }
public interface Workable { void work(); }
public interface <error descr="Duplicate class: 'Workable'">Workable</error> { void work(); }
public interface <error descr="Duplicate class: 'Workable'">Workable</error> { void work(); }
public static void main(String[] args) {