mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 06:05:01 +07:00
use getUseScope()
This commit is contained in:
+22
-11
@@ -28,6 +28,7 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.java.stubs.index.JavaAnonymousClassBaseRefOccurenceIndex;
|
||||
import com.intellij.psi.impl.java.stubs.index.JavaSuperClassNameOccurenceIndex;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.PsiSearchScopeUtil;
|
||||
import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.search.searches.AllClassesSearch;
|
||||
@@ -41,11 +42,9 @@ import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author max
|
||||
@@ -71,7 +70,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
|
||||
}
|
||||
|
||||
SearchScope scope = parameters.getScope();
|
||||
PsiClass[] cache = getOrCalculateDirectSubClasses(project, baseClass);
|
||||
PsiClass[] cache = getOrCalculateDirectSubClasses(project, baseClass, useScope);
|
||||
|
||||
if (cache.length == 0) {
|
||||
return true;
|
||||
@@ -132,7 +131,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
|
||||
// The list starts with non-anonymous classes, ends with anonymous sub classes
|
||||
// Classes grouped by their FQN. (Because among the same-named subclasses we should return only the same-jar ones, or all of them if there were none)
|
||||
@NotNull
|
||||
private static PsiClass[] getOrCalculateDirectSubClasses(@NotNull Project project, @NotNull PsiClass baseClass) {
|
||||
private static PsiClass[] getOrCalculateDirectSubClasses(@NotNull Project project, @NotNull PsiClass baseClass, @NotNull SearchScope useScope) {
|
||||
ConcurrentMap<PsiClass, PsiClass[]> map = HighlightingCaches.getInstance(project).DIRECT_SUB_CLASSES;
|
||||
PsiClass[] cache = map.get(baseClass);
|
||||
if (cache != null) {
|
||||
@@ -143,7 +142,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
|
||||
if (StringUtil.isEmpty(baseClassName)) {
|
||||
return PsiClass.EMPTY_ARRAY;
|
||||
}
|
||||
cache = calculateDirectSubClasses(project, baseClass, baseClassName);
|
||||
cache = calculateDirectSubClasses(project, baseClass, baseClassName, useScope);
|
||||
// for non-physical elements ignore the cache completely because non-physical elements created so often/unpredictably so I can't figure out when to clear caches in this case
|
||||
if (ApplicationManager.getApplication().runReadAction((Computable<Boolean>)baseClass::isPhysical)) {
|
||||
cache = ConcurrencyUtil.cacheOrGet(map, baseClass, cache);
|
||||
@@ -163,10 +162,22 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static PsiClass[] calculateDirectSubClasses(@NotNull Project project, @NotNull PsiClass baseClass, @NotNull String baseClassName) {
|
||||
GlobalSearchScope allScope = GlobalSearchScope.allScope(project);
|
||||
private static GlobalSearchScope toGlobal(@NotNull final SearchScope scope, @NotNull Project project) {
|
||||
if (scope instanceof GlobalSearchScope) {
|
||||
return (GlobalSearchScope)scope;
|
||||
}
|
||||
Set<VirtualFile> files = Arrays.stream(((LocalSearchScope)scope).getScope()).map(PsiUtil::getVirtualFile).collect(Collectors.toSet());
|
||||
return GlobalSearchScope.filesScope(project, files);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static PsiClass[] calculateDirectSubClasses(@NotNull Project project,
|
||||
@NotNull PsiClass baseClass,
|
||||
@NotNull String baseClassName,
|
||||
@NotNull SearchScope useScope) {
|
||||
GlobalSearchScope globalUseScope = toGlobal(useScope, project);
|
||||
Collection<PsiReferenceList> candidates =
|
||||
MethodUsagesSearcher.resolveInReadAction(project, () -> JavaSuperClassNameOccurenceIndex.getInstance().get(baseClassName, project, allScope));
|
||||
MethodUsagesSearcher.resolveInReadAction(project, () -> JavaSuperClassNameOccurenceIndex.getInstance().get(baseClassName, project, globalUseScope));
|
||||
|
||||
// memory/speed optimisation: it really is a map(string -> PsiClass or List<PsiClass>)
|
||||
final Map<String, Object> classes = new HashMap<>();
|
||||
@@ -215,7 +226,7 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
|
||||
}
|
||||
|
||||
Collection<PsiAnonymousClass> anonymousCandidates =
|
||||
MethodUsagesSearcher.resolveInReadAction(project, () -> JavaAnonymousClassBaseRefOccurenceIndex.getInstance().get(baseClassName, project, allScope));
|
||||
MethodUsagesSearcher.resolveInReadAction(project, () -> JavaAnonymousClassBaseRefOccurenceIndex.getInstance().get(baseClassName, project, globalUseScope));
|
||||
|
||||
processConcurrentlyIfTooMany(anonymousCandidates,
|
||||
candidate-> {
|
||||
|
||||
Reference in New Issue
Block a user