boolean (@NotNull ContentIterator processor, @Nullable VirtualFileFilter filter) { Pair<Collection<VirtualFile>, Collection<VirtualFile>> rootsPair = ReadAction.nonBlocking(() -> { Project project = myModule.getProject(); if (project.isDisposed()) return null; WorkspaceFileIndexEx index = (WorkspaceFileIndexEx)WorkspaceFileIndex.getInstance(project); Collection<VirtualFile> recursiveRoots = new HashSet<>(); Collection<VirtualFile> nonRecursiveRoots = new SmartList<>(); index.visitFileSets(new WorkspaceFileSetVisitor() { @Override public void visitIncludedRoot(@NotNull WorkspaceFileSet fileSet) { if (!(fileSet instanceof WorkspaceFileSetWithCustomData<?>) || !isInContent((WorkspaceFileSetWithCustomData<?>)fileSet)) { return; } VirtualFile root = fileSet.getRoot(); if (fileSet instanceof WorkspaceFileSetImpl && !((WorkspaceFileSetImpl)fileSet).getRecursive()) { nonRecursiveRoots.add(fileSet.getRoot()); } else { recursiveRoots.add(root); } } }); Collection<VirtualFile> filteredRecursiveRoots = ContainerUtil.filter(recursiveRoots, root -> !isNestedRootOfModuleContent(root)); return new Pair<>(filteredRecursiveRoots, nonRecursiveRoots); }).executeSynchronously(); return iterateProvidedRootsOfContent(processor, filter, rootsPair.getFirst(), rootsPair.getSecond()); }