mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-157910 Find in path should be able to search in several threads
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user