fix identifier highlighting when target method has a super in JDK only visible from call site

This commit is contained in:
peter
2018-11-09 17:41:37 +01:00
parent c306be2ddb
commit cfffd077af
3 changed files with 22 additions and 27 deletions
@@ -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);
}
}
@@ -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() {