mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[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:
committed by
intellij-monorepo-bot
parent
3ff47764d5
commit
dc005115cd
+5
-10
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user