From c1de5304c2bbbb138bc4f2c93aa9b03f195d3b64 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 27 Jul 2016 15:56:36 +0200 Subject: [PATCH] IDEA-157910 Find in path should be able to search in several threads --- .../intellij/find/impl/FindInProjectTask.java | 49 ++++++++++--------- .../usages/FindUsagesProcessPresentation.java | 2 +- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index 6880cd14044f..99d43a1a2f9f 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -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 myLargeFiles = ContainerUtil.newTroveSet(); private final Set 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 filesToScanInitially) { @@ -195,23 +201,22 @@ class FindInProjectTask { private void searchInFiles(@NotNull Collection virtualFiles, @NotNull FindUsagesProcessPresentation processPresentation, @NotNull final Processor 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 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() { - @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(virtualFiles), myProgress, false, processor); } // must return non-binary files diff --git a/platform/usageView/src/com/intellij/usages/FindUsagesProcessPresentation.java b/platform/usageView/src/com/intellij/usages/FindUsagesProcessPresentation.java index 98b9f2389e30..d5127b3bd903 100644 --- a/platform/usageView/src/com/intellij/usages/FindUsagesProcessPresentation.java +++ b/platform/usageView/src/com/intellij/usages/FindUsagesProcessPresentation.java @@ -42,7 +42,7 @@ public class FindUsagesProcessPresentation { private Factory myProgressIndicatorFactory; private Collection myLargeFiles; private boolean myShowFindOptionsPrompt = true; - private Runnable mySearchWithProjectFiles; + private volatile Runnable mySearchWithProjectFiles; private boolean myCanceled; public FindUsagesProcessPresentation(@NotNull UsageViewPresentation presentation) {