boolean (@NotNull Processor<? super PsiFile> psiFileProcessor, @NotNull String word, short occurrenceMask, @NotNull GlobalSearchScope scope, boolean caseSensitively) { List<VirtualFile> result = new ArrayList<>(5); Processor<VirtualFile> processor = Processors.cancelableCollectProcessor(result); collectVirtualFilesWithWord(word, occurrenceMask, scope, caseSensitively, processor); if (result.isEmpty()) return true; PsiManager psiManager = PsiManager.getInstance(myProject); Processor<VirtualFile> virtualFileProcessor = new ReadActionProcessor<>() { @Override public boolean processInReadAction(VirtualFile virtualFile) { if (virtualFile.isValid()) { PsiFile psiFile = psiManager.findFile(virtualFile); return psiFile == null || psiFileProcessor.process(psiFile); } return true; } }; // IMPORTANT!!! // Since implementation of virtualFileProcessor.process() may call indices directly or indirectly, // we cannot call it inside FileBasedIndex.processValues() method // If we do, deadlocks are possible (IDEADEV-42137). So first we obtain files with the word specified, // and then process them not holding indices' read lock. for (VirtualFile vFile : result) { ProgressIndicatorProvider.checkCanceled(); if (!virtualFileProcessor.process(vFile)) { return false; } } return true; }