Skip to content

Commit 2739be0

Browse files
committed
don't repeat file watchers for existing patterns
1 parent b7155f4 commit 2739be0

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

src/support/fileWatcher.ts

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ export const loadAndWatch = (
4343
createFileWatcher(patterns, leadingDebounce(load, debounceTime), events);
4444
};
4545

46+
const patternWatchers: Record<
47+
string,
48+
{
49+
watcher: vscode.FileSystemWatcher;
50+
callbacks: [
51+
{
52+
callback: (e: vscode.Uri) => void;
53+
events: FileEvent[];
54+
},
55+
];
56+
}
57+
> = {};
58+
4659
export const createFileWatcher = (
4760
patterns: string | string[],
4861
callback: (e: vscode.Uri) => void,
@@ -55,24 +68,47 @@ export const createFileWatcher = (
5568
patterns = typeof patterns === "string" ? [patterns] : patterns;
5669

5770
return patterns.map((pattern) => {
71+
if (patternWatchers[pattern]) {
72+
patternWatchers[pattern].callbacks.push({ callback, events });
73+
74+
return patternWatchers[pattern].watcher;
75+
}
76+
5877
const watcher = vscode.workspace.createFileSystemWatcher(
5978
new vscode.RelativePattern(getWorkspaceFolders()[0], pattern),
6079
!events.includes("create"),
6180
!events.includes("change"),
6281
!events.includes("delete"),
6382
);
6483

65-
if (events.includes("change")) {
66-
watcher.onDidChange(callback);
67-
}
84+
watcher.onDidChange((...args) => {
85+
patternWatchers[pattern].callbacks.forEach((cb) => {
86+
if (cb.events.includes("change")) {
87+
cb.callback(...args);
88+
}
89+
});
90+
});
6891

69-
if (events.includes("create")) {
70-
watcher.onDidCreate(callback);
71-
}
92+
watcher.onDidCreate((...args) => {
93+
patternWatchers[pattern].callbacks.forEach((cb) => {
94+
if (cb.events.includes("create")) {
95+
cb.callback(...args);
96+
}
97+
});
98+
});
7299

73-
if (events.includes("delete")) {
74-
watcher.onDidDelete(callback);
75-
}
100+
watcher.onDidDelete((...args) => {
101+
patternWatchers[pattern].callbacks.forEach((cb) => {
102+
if (cb.events.includes("delete")) {
103+
cb.callback(...args);
104+
}
105+
});
106+
});
107+
108+
patternWatchers[pattern] = {
109+
watcher,
110+
callbacks: [{ callback, events }],
111+
};
76112

77113
registerWatcher(watcher);
78114

0 commit comments

Comments
 (0)