From 7fe635d9bc81dd4cb01e7985d0f8273b6ecd5b88 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 14 Aug 2017 14:31:32 +0200 Subject: [PATCH] limit max size of files to be scanned when calculating symbol's unusedness --- .../psi/impl/search/PsiSearchHelperImpl.java | 16 +++++++++++----- platform/util/resources/misc/registry.properties | 5 +++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 7a2b2295cc14..e0351b7a6d48 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -33,6 +33,7 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.FileIndexFacade; import com.intellij.openapi.util.*; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; @@ -61,6 +62,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; public class PsiSearchHelperImpl implements PsiSearchHelper { private static final ExtensionPointName USE_SCOPE_OPTIMIZER_EP_NAME = ExtensionPointName.create("com.intellij.useScopeOptimizer"); @@ -924,18 +926,22 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return SearchCostResult.TOO_MANY_OCCURRENCES; } - final AtomicInteger count = new AtomicInteger(); - final ProgressIndicator indicator = progress == null ? new EmptyProgressIndicator() : progress; + final AtomicInteger filesCount = new AtomicInteger(); + final AtomicLong filesSizeToProcess = new AtomicLong(); + final Processor processor = new Processor() { private final VirtualFile virtualFileToIgnoreOccurrencesIn = fileToIgnoreOccurrencesIn == null ? null : fileToIgnoreOccurrencesIn.getVirtualFile(); + private final int maxFilesToProcess = Registry.intValue("ide.unused.symbol.calculation.maxFilesToSearchUsagesIn", 10); + private final int maxFilesSizeToProcess = Registry.intValue("ide.unused.symbol.calculation.maxFilesSizeToSearchUsagesIn", 524288); @Override public boolean process(VirtualFile file) { ProgressManager.checkCanceled(); if (Comparing.equal(file, virtualFileToIgnoreOccurrencesIn)) return true; - final int value = count.incrementAndGet(); - return value < 10; + int currentFilesCount = filesCount.incrementAndGet(); + long accumulatedFileSizeToProcess = filesSizeToProcess.addAndGet(file.getLength()); + return currentFilesCount < maxFilesToProcess && accumulatedFileSizeToProcess < maxFilesSizeToProcess; } }; List keys = getWordEntries(name, true); @@ -945,7 +951,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return SearchCostResult.TOO_MANY_OCCURRENCES; } - return count.get() == 0 ? SearchCostResult.ZERO_OCCURRENCES : SearchCostResult.FEW_OCCURRENCES; + return filesCount.get() == 0 ? SearchCostResult.ZERO_OCCURRENCES : SearchCostResult.FEW_OCCURRENCES; } private static boolean processFilesContainingAllKeys(@NotNull Project project, diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 0f71038f5998..1c31ede34f20 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -196,6 +196,11 @@ ide.dumb.mode.minFilesToStart.description=How many files should be changed for I ide.dumb.mode.minFilesSizeToStart=1048576 ide.dumb.mode.minFilesSizeToStart.description=How large should be updated files's size to start dumb mode in case there are a few of them +ide.unused.symbol.calculation.maxFilesToSearchUsagesIn=10 +ide.unused.symbol.calculation.maxFilesToSearchUsagesIn.description=Max number of scanned files to find usages of symbol +ide.unused.symbol.calculation.maxFilesSizeToSearchUsagesIn=524288 +ide.unused.symbol.calculation.maxFilesSizeToSearchUsagesIn.description=Max files size to find usages of symbol in case there are a few files + ide.tabbedPane.bufferedPaint=true ide.tabbedPane.dragOutMultiplier=1.2