From a3ce4185c2a6731790361ee20f8366f3d51c86cc Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 18 Feb 2016 16:59:50 +0100 Subject: [PATCH] don't store duplicates in file watcher output data --- .../openapi/vfs/impl/local/FileWatcher.java | 29 ++++++++++++++----- .../vfs/impl/local/LocalFileSystemImpl.java | 6 ++-- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/FileWatcher.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/FileWatcher.java index 49ff76822218..fe9c836e8353 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/FileWatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/FileWatcher.java @@ -54,9 +54,9 @@ public class FileWatcher { }; public static class DirtyPaths { - public final List dirtyPaths = ContainerUtil.newSmartList(); - public final List dirtyPathsRecursive = ContainerUtil.newSmartList(); - public final List dirtyDirectories = ContainerUtil.newSmartList(); + public final Set dirtyPaths = ContainerUtil.newTroveSet(); + public final Set dirtyPathsRecursive = ContainerUtil.newTroveSet(); + public final Set dirtyDirectories = ContainerUtil.newTroveSet(); public static final DirtyPaths EMPTY = new DirtyPaths(); @@ -199,22 +199,35 @@ public class FileWatcher { Collection paths = myPathMap.getWatchedPaths(path, true, false); if (!paths.isEmpty()) { synchronized (myLock) { - myDirtyPaths.dirtyPaths.addAll(paths); + for (String eachPath : paths) { + doAddDirtyPath(eachPath); + } } } notifyOnAnyEvent(); } + private void doAddDirtyPath(String path) { + if (!myDirtyPaths.dirtyPathsRecursive.contains(path)) { + myDirtyPaths.dirtyPaths.add(path); + } + } + + private void doAddDirtyPathRecursive(String path) { + myDirtyPaths.dirtyPaths.remove(path); + myDirtyPaths.dirtyPathsRecursive.add(path); + } + @Override public void notifyPathCreatedOrDeleted(@NotNull String path) { Collection paths = myPathMap.getWatchedPaths(path, true, false); if (!paths.isEmpty()) { synchronized (myLock) { for (String p : paths) { - myDirtyPaths.dirtyPathsRecursive.add(p); + doAddDirtyPathRecursive(p); String parentPath = new File(p).getParent(); if (parentPath != null) { - myDirtyPaths.dirtyPaths.add(parentPath); + doAddDirtyPath(parentPath); } } } @@ -238,7 +251,9 @@ public class FileWatcher { Collection paths = myPathMap.getWatchedPaths(path, false, false); if (!paths.isEmpty()) { synchronized (myLock) { - myDirtyPaths.dirtyPathsRecursive.addAll(paths); + for (String each : paths) { + doAddDirtyPathRecursive(each); + } } } notifyOnAnyEvent(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java index 6fa10f8ce5f2..1503b669d72a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java @@ -271,7 +271,7 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap } } - private void markPathsDirty(List dirtyPaths) { + private void markPathsDirty(Iterable dirtyPaths) { for (String dirtyPath : dirtyPaths) { VirtualFile file = findFileByPathIfCached(dirtyPath); if (file instanceof NewVirtualFile) { @@ -280,7 +280,7 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap } } - private void markFlatDirsDirty(List dirtyPaths) { + private void markFlatDirsDirty(Iterable dirtyPaths) { for (String dirtyPath : dirtyPaths) { VirtualFile file = findFileOrParentIfCached(dirtyPath); if (file instanceof NewVirtualFile) { @@ -293,7 +293,7 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap } } - private void markRecursiveDirsDirty(List dirtyPaths) { + private void markRecursiveDirsDirty(Iterable dirtyPaths) { for (String dirtyPath : dirtyPaths) { VirtualFile file = findFileOrParentIfCached(dirtyPath); if (file instanceof NewVirtualFile) {