IDEA-157910 Find in path should be able to search in several threads

This commit is contained in:
peter
2016-07-27 17:07:10 +02:00
parent 1da42e6777
commit c1de5304c2
2 changed files with 26 additions and 25 deletions
@@ -17,12 +17,14 @@ package com.intellij.find.impl;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import com.intellij.concurrency.JobLauncher;
import com.intellij.find.FindBundle;
import com.intellij.find.FindModel;
import com.intellij.find.findInProject.FindInProjectManager;
import com.intellij.find.ngrams.TrigramIndex;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
@@ -66,6 +68,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author peter
@@ -85,7 +90,8 @@ class FindInProjectTask {
@Nullable private final Module myModule;
private final Set<VirtualFile> myLargeFiles = ContainerUtil.newTroveSet();
private final Set<VirtualFile> myFilesToScanInitially;
private boolean myWarningShown;
private final AtomicBoolean myWarningShown = new AtomicBoolean();
private final AtomicLong myTotalFilesSize = new AtomicLong();
private final String myStringToFindInIndices;
FindInProjectTask(@NotNull final FindModel findModel, @NotNull final Project project, @NotNull Set<VirtualFile> filesToScanInitially) {
@@ -195,23 +201,22 @@ class FindInProjectTask {
private void searchInFiles(@NotNull Collection<VirtualFile> virtualFiles,
@NotNull FindUsagesProcessPresentation processPresentation,
@NotNull final Processor<UsageInfo> consumer) {
int i = 0;
long totalFilesSize = 0;
int count = 0;
AtomicInteger i = new AtomicInteger();
AtomicInteger count = new AtomicInteger();
for (final VirtualFile virtualFile : virtualFiles) {
final int index = i++;
if (!virtualFile.isValid()) continue;
Processor<VirtualFile> processor = virtualFile -> {
final int index = i.incrementAndGet();
if (!virtualFile.isValid()) return true;
long fileLength = UsageViewManagerImpl.getFileLength(virtualFile);
if (fileLength == -1) continue; // Binary or invalid
if (fileLength == -1) return true; // Binary or invalid
final boolean skipProjectFile = ProjectCoreUtil.isProjectOrWorkspaceFile(virtualFile) && !myFindModel.isSearchInProjectFiles();
if (skipProjectFile && !Registry.is("find.search.in.project.files")) continue;
if (skipProjectFile && !Registry.is("find.search.in.project.files")) return true;
if (fileLength > SINGLE_FILE_SIZE_LIMIT) {
myLargeFiles.add(virtualFile);
continue;
return true;
}
myProgress.checkCanceled();
@@ -221,13 +226,8 @@ class FindInProjectTask {
myProgress.setText(text);
myProgress.setText2(FindBundle.message("find.searching.for.string.in.file.occurrences.progress", count));
PsiFile psiFile = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile>() {
@Override
public PsiFile compute() {
return findFile(virtualFile);
}
});
if (psiFile == null) continue;
PsiFile psiFile = ReadAction.compute(() -> findFile(virtualFile));
if (psiFile == null) return true;
int countInFile = FindInProjectUtil.processUsagesInFile(psiFile, myFindModel, info -> skipProjectFile || consumer.process(info));
@@ -237,21 +237,22 @@ class FindInProjectTask {
model.setSearchInProjectFiles(true);
FindInProjectManager.getInstance(myProject).startFindInProject(model);
});
continue;
return true;
}
count += countInFile;
count.addAndGet(countInFile);
if (countInFile > 0) {
totalFilesSize += fileLength;
if (totalFilesSize > FILES_SIZE_LIMIT && !myWarningShown) {
myWarningShown = true;
if (myTotalFilesSize.addAndGet(fileLength) > FILES_SIZE_LIMIT && myWarningShown.compareAndSet(false, true)) {
String message = FindBundle.message("find.excessive.total.size.prompt",
UsageViewManagerImpl.presentableSize(totalFilesSize),
UsageViewManagerImpl.presentableSize(myTotalFilesSize.longValue()),
ApplicationNamesInfo.getInstance().getProductName());
UsageLimitUtil.showAndCancelIfAborted(myProject, message, processPresentation.getUsageViewPresentation());
}
}
}
return true;
};
//virtualFiles.forEach(processor::process);
JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList<VirtualFile>(virtualFiles), myProgress, false, processor);
}
// must return non-binary files
@@ -42,7 +42,7 @@ public class FindUsagesProcessPresentation {
private Factory<ProgressIndicator> myProgressIndicatorFactory;
private Collection<VirtualFile> myLargeFiles;
private boolean myShowFindOptionsPrompt = true;
private Runnable mySearchWithProjectFiles;
private volatile Runnable mySearchWithProjectFiles;
private boolean myCanceled;
public FindUsagesProcessPresentation(@NotNull UsageViewPresentation presentation) {