allow navigation to implicit inheritor (IDEA-98022)

This commit is contained in:
Anna Kozlova
2013-06-21 16:20:18 +04:00
parent 9ee135e797
commit 6df1920eac
2 changed files with 31 additions and 1 deletions
@@ -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<T extends PsiElement> implements Processor<T> {
private static class PsiElementFindProcessor<T extends PsiClass> implements Processor<T> {
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);
}
}
@@ -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.fo<caret>o();\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");
}
}