From 39223c2ce3c23f0746993af734e48488b58599e7 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Wed, 29 Oct 2025 11:28:06 +0100 Subject: [PATCH] [test frameworks] KTIJ-36152 Fix abstract inherited method check GitOrigin-RevId: dc74892ac1a507b4d66226010dbb02736f0844bf --- java/java-impl/BUILD.bazel | 1 + java/java-impl/intellij.java.impl.iml | 1 + .../testIntegration/TestIntegrationUtils.java | 30 ++++++++++--------- .../TestIntegrationUtilsTest.java | 1 + 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/java/java-impl/BUILD.bazel b/java/java-impl/BUILD.bazel index eea15f66025f..453f9122ffd9 100644 --- a/java/java-impl/BUILD.bazel +++ b/java/java-impl/BUILD.bazel @@ -100,6 +100,7 @@ jvm_library( "//java/codeserver/core", "//xml/xml-psi-api:psi", "//java/java-syntax:syntax", + "//java/java-psi-api:psi", ], exports = [ "//platform/lang-impl", diff --git a/java/java-impl/intellij.java.impl.iml b/java/java-impl/intellij.java.impl.iml index 100811d7185d..06e65bcea3c8 100644 --- a/java/java-impl/intellij.java.impl.iml +++ b/java/java-impl/intellij.java.impl.iml @@ -123,6 +123,7 @@ + diff --git a/java/java-impl/src/com/intellij/testIntegration/TestIntegrationUtils.java b/java/java-impl/src/com/intellij/testIntegration/TestIntegrationUtils.java index 420f880e7832..5646f7133253 100644 --- a/java/java-impl/src/com/intellij/testIntegration/TestIntegrationUtils.java +++ b/java/java-impl/src/com/intellij/testIntegration/TestIntegrationUtils.java @@ -21,6 +21,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiSuperMethodUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.util.SmartList; @@ -128,30 +129,31 @@ public final class TestIntegrationUtils { classes.addAll(InheritanceUtil.getSuperClasses(clazz).reversed()); } - List temp = new ArrayList<>(); + List result = new ArrayList<>(); + Map> methodsByName = new HashMap<>(); for (PsiClass aClass : classes) { if (CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) continue; - MemberInfo.extractClassMembers(aClass, temp, new MemberInfo.Filter<>() { + MemberInfo.extractClassMembers(aClass, result, new MemberInfo.Filter<>() { @Override public boolean includeMember(PsiMember member) { - if (!(member instanceof PsiMethod)) return false; - if (member.hasModifierProperty(PsiModifier.PRIVATE)) { - return false; + if (!(member instanceof PsiMethod method)) return false; + if (member.hasModifierProperty(PsiModifier.PRIVATE)) return false; + + String name = method.getName(); + List methods = methodsByName.computeIfAbsent(name, __ -> new ArrayList<>()); + for (PsiMethod psiMethod : methods) { + // rely on the order of collected classes: from descendant to ancestors + if (PsiSuperMethodUtil.isSuperMethod(psiMethod, method)) { + return false; + } } + methods.add(method); + return true; } }, false); } - // to avoid duplicates due to abstract default methods - Set uniqueDisplayNames = new HashSet<>(); - List result = new ArrayList<>(); - for (MemberInfo info : temp) { - if (uniqueDisplayNames.add(info.getDisplayName())) { - result.add(info); - } - } - return result; } diff --git a/java/java-tests/testSrc/com/intellij/testIntegration/TestIntegrationUtilsTest.java b/java/java-tests/testSrc/com/intellij/testIntegration/TestIntegrationUtilsTest.java index 4adb1c5ee489..16c1e48bd38f 100644 --- a/java/java-tests/testSrc/com/intellij/testIntegration/TestIntegrationUtilsTest.java +++ b/java/java-tests/testSrc/com/intellij/testIntegration/TestIntegrationUtilsTest.java @@ -23,6 +23,7 @@ public class TestIntegrationUtilsTest extends LightPlatformTestCase { doTest("class Foo implements I {void bar() {}} interface I {void qux();}", true, "bar(): void", "qux(): void"); doTest("class Foo implements I {void bar() {}} interface I {default void qux() {}}", true, "bar(): void", "qux(): void"); doTest("interface Foo extends I {void bar();} interface I {void qux();}", true, "bar(): void", "qux(): void"); + doTest("interface Foo extends I {void bar();} interface I extends B {} interface B {void qux();}", true, "bar(): void", "qux(): void"); doTest("class Foo extends I {@Override void bar();} interface I {void bar();default void foo(){}}", true, "bar(): void", "foo(): void"); }