mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
java highlight usages in file: highlight usages of a method when its super method is from alternative jdk
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
+7
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user