private static boolean processFilesContainingAllKeys(@NotNull Project project, @NotNull final GlobalSearchScope scope, @Nullable final Condition<Integer> checker, @NotNull final Collection<IdIndexEntry> keys, @NotNull final Processor<VirtualFile> processor) { final FileIndexFacade index = FileIndexFacade.getInstance(project); return DumbService.getInstance(project).runReadActionInSmartMode(new Computable<Boolean>() { @Override public Boolean compute() { return FileBasedIndex.getInstance().processFilesContainingAllKeys(IdIndex.NAME, keys, scope, checker, new Processor<VirtualFile>() { @Override public boolean process(VirtualFile file) { return !index.shouldBeFound(scope, file) || processor.process(file); } }); } }); }
@Override protected void setUp() throws Exception { super.setUp(); FileBasedIndex.getInstance().requestRebuild(IdIndex.NAME); FileBasedIndex.getInstance().requestRebuild(TodoIndex.NAME); String root = JavaTestUtil.getJavaTestDataPath()+ "/psi/impl/cache/"; PsiTestUtil.removeAllRoots(myModule, IdeaTestUtil.getMockJdk17()); myRootDir = PsiTestUtil.createTestProjectStructure(myProject, myModule, root, myFilesToDelete); myCacheFile = FileUtil.createTempFile("cache", ""); myCacheFile.delete(); myFilesToDelete.add(myCacheFile); }
private boolean collectVirtualFilesWithWord(@NotNull final Processor<VirtualFile> fileProcessor, @NotNull final String word, final short occurrenceMask, @NotNull final GlobalSearchScope scope, final boolean caseSensitively) { if (myProject.isDefault()) { return true; } try { return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { @Override public Boolean compute() { return FileBasedIndex.getInstance().processValues(IdIndex.NAME, new IdIndexEntry(word, caseSensitively), null, new FileBasedIndex.ValueProcessor<Integer>() { final FileIndexFacade index = FileIndexFacade.getInstance(myProject); @Override public boolean process(final VirtualFile file, final Integer value) { ProgressIndicatorProvider.checkCanceled(); final int mask = value.intValue(); if ((mask & occurrenceMask) != 0 && index.shouldBeFound(scope, file)) { if (!fileProcessor.process(file)) return false; } return true; } }, scope); } }); } catch (IndexNotReadyException e) { throw new ProcessCanceledException(); } }
@NotNull private <K, V> UpdatableIndex<K, V, FileContent> createIndex(@NotNull final ID<K, V> indexId, @NotNull final FileBasedIndexExtension<K, V> extension, @NotNull final MemoryIndexStorage<K, V> storage) throws StorageException, IOException { final MapReduceIndex<K, V, FileContent> index; if (extension instanceof CustomImplementationFileBasedIndexExtension) { final UpdatableIndex<K, V, FileContent> custom = ((CustomImplementationFileBasedIndexExtension<K, V, FileContent>)extension).createIndexImplementation(indexId, this, storage); if (!(custom instanceof MapReduceIndex)) { return custom; } index = (MapReduceIndex<K, V, FileContent>)custom; } else { DataExternalizer<Collection<K>> externalizer = extension.hasSnapshotMapping() && IdIndex.ourSnapshotMappingsEnabled ? createInputsIndexExternalizer(extension, indexId, extension.getKeyDescriptor()) : null; index = new MapReduceIndex<K, V, FileContent>( indexId, extension.getIndexer(), storage, externalizer, extension.getValueExternalizer(), extension instanceof PsiDependentIndex); } index.setInputIdToDataKeysIndex(new Factory<PersistentHashMap<Integer, Collection<K>>>() { @Override public PersistentHashMap<Integer, Collection<K>> create() { try { return createIdToDataKeysIndex(extension, storage); } catch (IOException e) { throw new RuntimeException(e); } } }); return index; }
@Override protected void setUp() throws Exception { super.setUp(); FileBasedIndex.getInstance().requestRebuild(IdIndex.NAME); FileBasedIndex.getInstance().requestRebuild(TodoIndex.NAME); }
@NotNull private static MultiMap<VirtualFile, RequestWithProcessor> findFilesWithIndexEntry(@NotNull final IdIndexEntry entry, @NotNull final FileIndexFacade index, @NotNull final Collection<RequestWithProcessor> data, @NotNull final GlobalSearchScope commonScope, final ProgressIndicator progress) { final MultiMap<VirtualFile, RequestWithProcessor> local = createMultiMap(); ApplicationManager.getApplication().runReadAction(new Runnable() { @Override public void run() { if (progress != null) progress.checkCanceled(); FileBasedIndex.getInstance().processValues(IdIndex.NAME, entry, null, new FileBasedIndex.ValueProcessor<Integer>() { @Override public boolean process(VirtualFile file, Integer value) { if (progress != null) progress.checkCanceled(); if (index.shouldBeFound(commonScope, file)) { int mask = value.intValue(); for (RequestWithProcessor single : data) { final PsiSearchRequest request = single.request; if ((mask & request.searchContext) != 0 && ((GlobalSearchScope)request.searchScope).contains(file)) { local.putValue(file, single); } } } return true; } }, commonScope); } }); return local; }
private static boolean processFilesContainingAllKeys(@NotNull final GlobalSearchScope scope, @Nullable final Condition<Integer> checker, @NotNull final Processor<VirtualFile> processor, @NotNull final Collection<IdIndexEntry> keys) { return ApplicationManager.getApplication().runReadAction(new NullableComputable<Boolean>() { @Override public Boolean compute() { return FileBasedIndex.getInstance().processFilesContainingAllKeys(IdIndex.NAME, keys, scope, checker, processor); } }); }
private void collectFiles(@Nonnull MultiMap<Set<IdIndexEntry>, RequestWithProcessor> singles, @Nonnull ProgressIndicator progress, @Nonnull final MultiMap<VirtualFile, RequestWithProcessor> intersectionResult, @Nonnull final MultiMap<VirtualFile, RequestWithProcessor> restResult) { for (Map.Entry<Set<IdIndexEntry>, Collection<RequestWithProcessor>> entry : singles.entrySet()) { final Set<IdIndexEntry> keys = entry.getKey(); if (keys.isEmpty()) { continue; } final Collection<RequestWithProcessor> processors = entry.getValue(); final GlobalSearchScope commonScope = uniteScopes(processors); final Set<VirtualFile> intersectionWithContainerNameFiles = intersectionWithContainerNameFiles(commonScope, processors, keys); List<VirtualFile> result = new ArrayList<>(); Processor<VirtualFile> processor = Processors.cancelableCollectProcessor(result); processFilesContainingAllKeys(myManager.getProject(), commonScope, null, keys, processor); for (final VirtualFile file : result) { progress.checkCanceled(); for (final IdIndexEntry indexEntry : keys) { myDumbService.runReadActionInSmartMode( () -> FileBasedIndex.getInstance().processValues(IdIndex.NAME, indexEntry, file, (file1, value) -> { int mask = value.intValue(); for (RequestWithProcessor single : processors) { final PsiSearchRequest request = single.request; if ((mask & request.searchContext) != 0 && request.searchScope.contains(file1)) { MultiMap<VirtualFile, RequestWithProcessor> result1 = intersectionWithContainerNameFiles == null || !intersectionWithContainerNameFiles.contains(file1) ? restResult : intersectionResult; result1.putValue(file1, single); } } return true; }, commonScope)); } } } }
private static boolean processFilesContainingAllKeys(@Nonnull Project project, @Nonnull final GlobalSearchScope scope, @javax.annotation.Nullable final Condition<Integer> checker, @Nonnull final Collection<IdIndexEntry> keys, @Nonnull final Processor<VirtualFile> processor) { final FileIndexFacade index = FileIndexFacade.getInstance(project); return DumbService.getInstance(project).runReadActionInSmartMode( () -> FileBasedIndex.getInstance().processFilesContainingAllKeys(IdIndex.NAME, keys, scope, checker, file -> !index.shouldBeFound(scope, file) || processor.process(file))); }
private boolean collectVirtualFilesWithWord(@Nonnull final Processor<VirtualFile> fileProcessor, @Nonnull final String word, final short occurrenceMask, @Nonnull final GlobalSearchScope scope, final boolean caseSensitively) { if (myProject.isDefault()) { return true; } try { return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { @Override public Boolean compute() { return FileBasedIndex.getInstance().processValues(IdIndex.NAME, new IdIndexEntry(word, caseSensitively), null, new FileBasedIndex.ValueProcessor<Integer>() { final FileIndexFacade index = FileIndexFacade.getInstance(myProject); @Override public boolean process(final VirtualFile file, final Integer value) { ProgressIndicatorProvider.checkCanceled(); final int mask = value.intValue(); if ((mask & occurrenceMask) != 0 && index.shouldBeFound(scope, file)) { if (!fileProcessor.process(file)) return false; } return true; } }, scope); } }); } catch (IndexNotReadyException e) { throw new ProcessCanceledException(); } }
@Nullable private static <Key, Value> ForwardIndex<Key, Value> getForwardIndex(@Nonnull IndexExtension<Key, Value, ?> indexExtension) throws IOException { final boolean hasSnapshotMapping = indexExtension instanceof FileBasedIndexExtension && ((FileBasedIndexExtension<Key, Value>)indexExtension).hasSnapshotMapping() && IdIndex.ourSnapshotMappingsEnabled; if (hasSnapshotMapping) return null; MapBasedForwardIndex<Key, Value> backgroundIndex = !SharedIndicesData.ourFileSharedIndicesEnabled || SharedIndicesData.DO_CHECKS ? new MyForwardIndex<>(indexExtension) : null; return new SharedMapBasedForwardIndex<>(indexExtension, backgroundIndex); }
@Override public int getVersion() { return ENABLED ? 3 + (IdIndex.ourSnapshotMappingsEnabled ? 0xFF:0) : 1; }