limit max size of files to be scanned when calculating symbol's unusedness

This commit is contained in:
Maxim.Mossienko
2017-08-14 14:32:56 +02:00
parent f47f23c248
commit 7fe635d9bc
2 changed files with 16 additions and 5 deletions
@@ -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<ScopeOptimizer> 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<VirtualFile> processor = new Processor<VirtualFile>() {
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<IdIndexEntry> 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,
@@ -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