@Override
  public boolean iterateContent(@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) {
          ProgressManager.checkCanceled();
          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();
    if (rootsPair == null) return false; // project is disposed
    return iterateProvidedRootsOfContent(processor, filter, rootsPair.getFirst(), rootsPair.getSecond());
  }
@Override
  public boolean iterateContent(@NotNull ContentIterator processor, @Nullable VirtualFileFilter filter)