mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
allow navigation to implicit inheritor (IDEA-98022)
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user