diff --git a/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java b/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java index 35d333a28910..7ed00857bbaf 100644 --- a/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/TargetElementUtil.java @@ -20,13 +20,14 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; -import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlText; +import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -281,8 +282,11 @@ public class TargetElementUtil extends TargetElementUtilBase { if (containingClass == null && psiClass == null) return true; if (containingClass != null) { + PsiElementFindProcessor processor1 = new PsiElementFindProcessor(containingClass); while (psiClass != null) { - if (InheritanceUtil.isInheritorOrSelf(containingClass, psiClass, true) || InheritanceUtil.isInheritorOrSelf(psiClass, containingClass, true)) { + if (!processor1.process(psiClass) || + !ClassInheritorsSearch.search(containingClass).forEach(new PsiElementFindProcessor(psiClass)) || + !ClassInheritorsSearch.search(psiClass).forEach(processor1)) { return true; } psiClass = psiClass.getContainingClass(); @@ -294,4 +298,17 @@ public class TargetElementUtil extends TargetElementUtilBase { } return super.acceptImplementationForReference(reference, element); } + + private static class PsiElementFindProcessor implements Processor { + private final T myElement; + + public PsiElementFindProcessor(T t) { + myElement = t; + } + + @Override + public boolean process(T t) { + return !myElement.getManager().areElementsEquivalent(myElement, t); + } + } }