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; }