docs: public Collection<String> getPaths() {
          final List<String> index = new ArrayList<String>();
          // First check for an index file
          final VirtualFile indexFile = VFS.getChild(root.getPathName() + ".index");
          if (indexFile.exists()) {
              try {
                  final BufferedReader r = new BufferedReader(new InputStreamReader(indexFile.openStream(), StandardCharsets.UTF_8));
                  try {
                      String s;
                      while ((s = r.readLine()) != null) {
                          index.add(s.trim());
                      }
                      return index;
                  } finally {
                      // if exception is thrown, undo index creation
                      r.close();
                  }
              } catch (IOException e) {
                  index.clear();
              }
          }
  
          FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(new VirtualFileFilter() {
              @Override
              public boolean accepts(VirtualFile file) {
                  return file.isDirectory();
              }
          }, VisitorAttributes.RECURSE);
          try {
              root.visit(visitor);
          } catch (IOException e) {
              index.clear();
          }
  
          index.add("");
          for (VirtualFile dir : visitor.getMatched()) {
              index.add(dir.getPathNameRelativeTo(root));
          }
  
          return index;
      }