Set<VirtualFile> (@NotNull Collection<? extends FilePath> files, @NotNull Set<? extends VirtualFile> roots) { Set<VirtualFile> selectedRoots = new HashSet<>(); List<VirtualFile> sortedRoots = ContainerUtil.sorted(roots, Comparator.comparing(VirtualFile::getPath)); for (FilePath filePath : files) { VirtualFile virtualFile = filePath.getVirtualFile(); if (virtualFile != null && roots.contains(virtualFile)) { // if a root itself is selected, add this root selectedRoots.add(virtualFile); } else { VirtualFile candidateAncestorRoot = null; for (VirtualFile root : sortedRoots) { if (FileUtil.isAncestor(VfsUtilCore.virtualToIoFile(root), filePath.getIOFile(), false)) { candidateAncestorRoot = root; } } if (candidateAncestorRoot != null) { selectedRoots.add(candidateAncestorRoot); } } // add all roots under selected path if (virtualFile != null) { for (VirtualFile root : roots) { if (VfsUtilCore.isAncestor(virtualFile, root, false)) { selectedRoots.add(root); } } } } return selectedRoots; }