java highlight usages in file: highlight usages of a method when its super method is from alternative jdk

This commit is contained in:
Dmitry Batkovich
2017-01-18 19:17:19 +03:00
parent e323aa8b9c
commit de021824a4
5 changed files with 53 additions and 0 deletions
@@ -27,10 +27,13 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.impl.search.ThrowSearchUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.MethodReferencesSearch;
import com.intellij.psi.search.searches.OverridingMethodsSearch;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiSuperMethodUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.refactoring.util.JavaNonCodeSearchElementDescriptionProvider;
@@ -46,6 +49,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
/**
* @author peter
@@ -240,7 +244,17 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
return MethodReferencesSearch.search((PsiMethod)target, searchScope, true).findAll();
}
final Collection<PsiReference> result = new ArrayList<>();
GlobalSearchScope resolveScope = null;
if (searchScope instanceof LocalSearchScope) {
resolveScope = Stream.of(((LocalSearchScope)searchScope).getScope())
.map(PsiElement::getResolveScope)
.reduce(GlobalSearchScope.EMPTY_SCOPE, (s1, s2) -> s1.union(s2));
}
for (PsiMethod superMethod : superMethods) {
if (resolveScope != null) {
superMethod = PsiSuperMethodUtil.correctMethodByScope(superMethod, resolveScope);
}
result.addAll(MethodReferencesSearch.search(superMethod, searchScope, true).findAll());
}
return result;
@@ -21,6 +21,7 @@ import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.HashSet;
import gnu.trove.THashMap;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -174,4 +175,15 @@ public class PsiSuperMethodUtil {
return JavaPsiFacade.getInstance(psiClass.getProject()).findClass(qualifiedName, resolveScope);
}
@Contract("null, _ -> null")
public static PsiMethod correctMethodByScope(PsiMethod method, final GlobalSearchScope resolveScope) {
if (method == null) return null;
final PsiClass aClass = method.getContainingClass();
if (aClass == null) return method;
final PsiClass correctedClass = correctClassByScope(aClass, resolveScope);
if (correctedClass == null || correctedClass == aClass) return method;
final PsiMethod correctedClassMethodBySignature = correctedClass.findMethodBySignature(method, false);
return correctedClassMethodBySignature == null ? method : correctedClassMethodBySignature;
}
}
@@ -0,0 +1,8 @@
package p;
public class Object7 {
@Override
public int hashCode() {
return 78;
}
}
@@ -0,0 +1,7 @@
package p;
class Test {
static void mmm(p.Object7 o) {
o.has<caret>hCode();
}
}
@@ -16,7 +16,9 @@
package com.intellij.codeInsight;
import com.intellij.codeInsight.highlighting.HighlightUsagesHandler;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.FileIndexFacade;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
@@ -271,6 +273,16 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase {
myFixture.checkHighlighting();
}
public void testInFileReferencesHighlighting() {
ModuleRootModificationUtil.addDependency(myJava8Module, myJava7Module);
myFixture.copyFileToProject("java7/p/Object7.java");
myFixture.configureByFiles("java8/p/" + getTestName(false) + ".java");
HighlightUsagesHandler.invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile());
final RangeHighlighter highlighter = assertOneElement(myFixture.getEditor().getMarkupModel().getAllHighlighters());
assertEquals(64, highlighter.getStartOffset());
assertEquals(72, highlighter.getEndOffset());
}
private void doTestWithoutLibrary() {
final String name = getTestName(false);
myFixture.configureByFiles("java7/p/" + name + ".java", "java8/p/" + name + ".java");