diff --git a/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java b/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java index 7ed00857bbaf..f9efd108ed48 100644 --- a/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.searches.ClassInheritorsSearch; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.xml.XmlAttribute; @@ -299,7 +300,7 @@ public class TargetElementUtil extends TargetElementUtilBase { return super.acceptImplementationForReference(reference, element); } - private static class PsiElementFindProcessor implements Processor { + private static class PsiElementFindProcessor implements Processor { private final T myElement; public PsiElementFindProcessor(T t) { @@ -308,6 +309,7 @@ public class TargetElementUtil extends TargetElementUtilBase { @Override public boolean process(T t) { + if (InheritanceUtil.isInheritorOrSelf(t, myElement, true)) return false; return !myElement.getManager().areElementsEquivalent(myElement, t); } } diff --git a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java index 161859e05e90..bf9f09fafa9d 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java +++ b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java @@ -121,4 +121,32 @@ public class GotoImplementationHandlerTest extends JavaCodeInsightFixtureTestCas assertNotNull(aClass); assertEquals(aClass.getName(), "X"); } + + public void testImplicitInheritance() throws Throwable { + PsiFile file = myFixture.addFileToProject("Foo.java", "interface PackContainer {\n" + + " void foo();\n" + + "}\n" + + "interface PsiPackage extends PackContainer {}\n" + + "class PsiPackageBase implements PackContainer {\n" + + " public void foo() {}\n" + + "}\n" + + "class PsiPackageImpl extends PsiPackageBase implements PsiPackage {}\n" + + "\n" + + "class Foo {\n" + + " class Bar {\n" + + " void bar(PsiPackage i) {\n" + + " i.foo();\n" + + " }\n" + + " }\n" + + "}"); + myFixture.configureFromExistingVirtualFile(file.getVirtualFile()); + + final PsiElement[] impls = new GotoImplementationHandler().getSourceAndTargetElements(myFixture.getEditor(), file).targets; + assertEquals(1, impls.length); + final PsiElement meth = impls[0]; + assertTrue(meth instanceof PsiMethod); + final PsiClass aClass = ((PsiMethod)meth).getContainingClass(); + assertNotNull(aClass); + assertEquals(aClass.getName(), "PsiPackageBase"); + } } \ No newline at end of file