final boolean allowVisitChildren(@NotNull VirtualFile file) {
    if (!file.is(VFileProperty.SYMLINK)) {
      return true;
    }

    if (!myFollowSymLinks || VfsUtilCore.isInvalidLink(file)) {
      return false;
    }

    VirtualFile target = file.getCanonicalFile();
    List<VirtualFile> links = myVisitedTargets.get(target);
    if (links == null) {
      myVisitedTargets.put(target, ContainerUtil.newSmartList(file));
      return true;
    }

    boolean hasLoop = false;
    for (VirtualFile link : links) {
      if (VfsUtilCore.isAncestor(link, file, true)) {
        hasLoop = true;
        break;
      }
    }
    links.add(file);
    return !hasLoop;
  }