mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fix identifier highlighting when target method has a super in JDK only visible from call site
This commit is contained in:
@@ -27,6 +27,7 @@ import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.impl.PsiSuperMethodImplUtil;
|
||||
import com.intellij.psi.impl.search.ThrowSearchUtil;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
@@ -35,7 +36,6 @@ import com.intellij.psi.search.searches.FunctionalExpressionSearch;
|
||||
import com.intellij.psi.search.searches.MethodReferencesSearch;
|
||||
import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.PropertyUtilBase;
|
||||
import com.intellij.psi.util.PsiSuperMethodUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.refactoring.util.JavaNonCodeSearchElementDescriptionProvider;
|
||||
@@ -47,10 +47,7 @@ import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author peter
|
||||
@@ -257,20 +254,27 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
|
||||
@Override
|
||||
public Collection<PsiReference> findReferencesToHighlight(@NotNull final PsiElement target, @NotNull final SearchScope searchScope) {
|
||||
if (target instanceof PsiMethod) {
|
||||
final PsiMethod[] superMethods = ((PsiMethod)target).findDeepestSuperMethods();
|
||||
Set<PsiMethod> superTargets = ContainerUtil.newLinkedHashSet();
|
||||
PsiMethod[] superMethods = ((PsiMethod)target).findDeepestSuperMethods();
|
||||
if (superMethods.length == 0) {
|
||||
return MethodReferencesSearch.search((PsiMethod)target, searchScope, true).findAll();
|
||||
superTargets.add((PsiMethod)target);
|
||||
}
|
||||
final Collection<PsiReference> result = new ArrayList<>();
|
||||
GlobalSearchScope resolveScope = null;
|
||||
if (searchScope instanceof LocalSearchScope) {
|
||||
final PsiElement[] scopeElements = ((LocalSearchScope)searchScope).getScope();
|
||||
resolveScope = GlobalSearchScope.union(ContainerUtil.map2Array(scopeElements, GlobalSearchScope.class, PsiElement::getResolveScope));
|
||||
}
|
||||
for (PsiMethod superMethod : superMethods) {
|
||||
if (resolveScope != null) {
|
||||
superMethod = PsiSuperMethodUtil.correctMethodByScope(superMethod, resolveScope).orElse(superMethod);
|
||||
PsiElement[] scopeElements = ((LocalSearchScope)searchScope).getScope();
|
||||
GlobalSearchScope resolveScope =
|
||||
GlobalSearchScope.union(ContainerUtil.map2Array(scopeElements, GlobalSearchScope.class, PsiElement::getResolveScope));
|
||||
for (HierarchicalMethodSignature superSignature : PsiSuperMethodImplUtil.getHierarchicalMethodSignature((PsiMethod)target, resolveScope)
|
||||
.getSuperSignatures()) {
|
||||
PsiMethod method = superSignature.getMethod();
|
||||
PsiMethod[] deepestSupers = method.findDeepestSuperMethods();
|
||||
Collections.addAll(superTargets, deepestSupers.length == 0 ? new PsiMethod[]{method} : deepestSupers);
|
||||
}
|
||||
} else {
|
||||
Collections.addAll(superTargets, superMethods);
|
||||
}
|
||||
|
||||
Collection<PsiReference> result = new LinkedHashSet<>();
|
||||
for (PsiMethod superMethod : superTargets) {
|
||||
result.addAll(MethodReferencesSearch.search(superMethod, searchScope, true).findAll());
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -25,7 +25,6 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public class PsiSuperMethodUtil {
|
||||
@@ -128,15 +127,4 @@ public class PsiSuperMethodUtil {
|
||||
return JavaPsiFacade.getInstance(psiClass.getProject()).findClass(qualifiedName, resolveScope);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Optional<PsiMethod> correctMethodByScope(PsiMethod method, final GlobalSearchScope resolveScope) {
|
||||
if (method == null) return Optional.empty();
|
||||
final PsiClass aClass = method.getContainingClass();
|
||||
if (aClass == null) return Optional.empty();
|
||||
final PsiClass correctedClass = correctClassByScope(aClass, resolveScope);
|
||||
if (correctedClass == null) return Optional.empty();
|
||||
else if (correctedClass == aClass) return Optional.of(method);
|
||||
final PsiMethod correctedClassMethodBySignature = correctedClass.findMethodBySignature(method, false);
|
||||
return correctedClassMethodBySignature == null ? Optional.empty() : Optional.of(correctedClassMethodBySignature);
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -311,6 +311,9 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase {
|
||||
"");
|
||||
myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
|
||||
myFixture.checkHighlighting();
|
||||
|
||||
HighlightUsagesHandler.invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile());
|
||||
assertSize(2, myFixture.getEditor().getMarkupModel().getAllHighlighters());
|
||||
}
|
||||
|
||||
private void doTestWithoutLibrary() {
|
||||
|
||||
Reference in New Issue
Block a user