function expression searcher: find most likely files only among of files where occurrences was found

This commit is contained in:
Dmitry Batkovich
2016-10-24 17:47:31 +03:00
parent 2e49c8b904
commit 4c72b12c6a
2 changed files with 17 additions and 14 deletions
@@ -84,7 +84,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
PsiManager manager = ReadAction.compute(() -> p.getElementToSearch().getManager());
manager.startBatchFilesProcessingMode();
try {
processOffsets(descriptors, (file, offsets) -> {
processOffsets(descriptors, project, (file, offsets) -> {
fileCount.incrementAndGet();
exprCount.addAndGet(offsets.size());
return processFile(consumer, descriptors, file, offsets);
@@ -99,9 +99,9 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
}
@TestOnly
public static Set<VirtualFile> getFilesToSearchInPsi(PsiClass samClass) {
public static Set<VirtualFile> getFilesToSearchInPsi(PsiClass samClass, Project project) {
Set<VirtualFile> result = new HashSet<>();
processOffsets(calcDescriptors(new SearchParameters(samClass, samClass.getUseScope())), (file, offsets) -> result.add(file));
processOffsets(calcDescriptors(new SearchParameters(samClass, samClass.getUseScope())), project, (file, offsets) -> result.add(file));
return result;
}
@@ -134,8 +134,9 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
}
@NotNull
private static Set<VirtualFile> getLikelyFiles(List<SamDescriptor> descriptors) {
return JBIterable.from(descriptors).flatMap(SamDescriptor::getMostLikelyFiles).toSet();
private static Set<VirtualFile> getLikelyFiles(List<SamDescriptor> descriptors, Collection<VirtualFile> candidateFiles, Project project) {
final GlobalSearchScope candidateFilesScope = GlobalSearchScope.filesScope(project, candidateFiles);
return JBIterable.from(descriptors).flatMap(descriptor -> descriptor.getMostLikelyFiles(candidateFilesScope)).toSet();
}
@NotNull
@@ -156,12 +157,14 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
return result;
}
private static void processOffsets(List<SamDescriptor> descriptors, PairProcessor<VirtualFile, List<Integer>> processor) {
private static void processOffsets(List<SamDescriptor> descriptors, Project project, PairProcessor<VirtualFile, List<Integer>> processor) {
if (descriptors.isEmpty()) return;
List<PsiClass> samClasses = ContainerUtil.map(descriptors, d -> d.samClass);
MultiMap<VirtualFile, FunExprOccurrence> allCandidates = getAllOccurrences(descriptors);
for (VirtualFile vFile : putLikelyFilesFirst(descriptors, allCandidates.keySet())) {
if (allCandidates.isEmpty()) return;
for (VirtualFile vFile : putLikelyFilesFirst(descriptors, allCandidates.keySet(), project)) {
List<FunExprOccurrence> toLoad = filterInapplicable(samClasses, vFile, allCandidates.get(vFile));
if (!toLoad.isEmpty()) {
LOG.trace("To load " + vFile.getPath() + " with values: " + toLoad);
@@ -173,9 +176,9 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
}
@NotNull
private static Set<VirtualFile> putLikelyFilesFirst(List<SamDescriptor> descriptors, Set<VirtualFile> allFiles) {
Set<VirtualFile> orderedFiles = new LinkedHashSet<>(allFiles);
orderedFiles.retainAll(getLikelyFiles(descriptors));
private static Set<VirtualFile> putLikelyFilesFirst(List<SamDescriptor> descriptors, Set<VirtualFile> allFiles, Project project) {
Set<VirtualFile> orderedFiles = new LinkedHashSet<>(allFiles.size());
orderedFiles.addAll(getLikelyFiles(descriptors, allFiles, project));
orderedFiles.addAll(allFiles);
return orderedFiles;
}
@@ -306,7 +309,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
}
@NotNull
private Set<VirtualFile> getMostLikelyFiles() {
private Set<VirtualFile> getMostLikelyFiles(GlobalSearchScope searchScope) {
Set<VirtualFile> files = ContainerUtil.newLinkedHashSet();
ReadAction.run(() -> {
if (!samClass.isValid()) return;
@@ -317,7 +320,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
Set<String> likelyNames = ContainerUtil.newLinkedHashSet(className);
StubIndex.getInstance().processElements(JavaMethodParameterTypesIndex.getInstance().getKey(), className,
project, effectiveUseScope, PsiMethod.class, method -> {
project, searchScope, PsiMethod.class, method -> {
ProgressManager.checkCanceled();
likelyNames.add(method.getName());
return true;
@@ -326,7 +329,7 @@ public class JavaFunctionalExpressionSearcher extends QueryExecutorBase<PsiFunct
PsiSearchHelperImpl helper = (PsiSearchHelperImpl)PsiSearchHelper.SERVICE.getInstance(project);
Processor<VirtualFile> processor = Processors.cancelableCollectProcessor(files);
for (String word : likelyNames) {
helper.processFilesWithText(effectiveUseScope, UsageSearchContext.IN_CODE, true, word, processor);
helper.processFilesWithText(searchScope, UsageSearchContext.IN_CODE, true, word, processor);
}
});
return files;
@@ -172,7 +172,7 @@ public class FindFunctionalInterfaceTest extends LightCodeInsightFixtureTestCase
"}");
assertSize(1, FunctionalExpressionSearch.search(sam).findAll());
for (VirtualFile file : JavaFunctionalExpressionSearcher.getFilesToSearchInPsi(sam)) {
for (VirtualFile file : JavaFunctionalExpressionSearcher.getFilesToSearchInPsi(sam, getProject())) {
assertFalse(file.getName(), file.getName().startsWith("_"));
}
}