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");
}