Skip to content

Commit 5d279b5

Browse files
authored
Dispose test watchers on workspace folder removal (#481)
1 parent 59eb11b commit 5d279b5

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/extension.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import { WorkspaceTracker } from "./project";
88
import { TaskProvider } from "./taskProvider";
99
import { configureTelemetry, reporter } from "./telemetry";
1010
import { configureTerminalLinkProvider } from "./terminalLinkProvider";
11-
import { configureTestController } from "./testController";
11+
import {
12+
configureTestController,
13+
handleWorkspaceFolderRemoved as handleTestControllerWorkspaceFolderRemoved,
14+
} from "./testController";
1215
import { testElixir } from "./testElixir";
1316

1417
console.log("ElixirLS: Loading extension");
@@ -78,6 +81,7 @@ export function activate(context: vscode.ExtensionContext): ElixirLS {
7881
vscode.workspace.onDidChangeWorkspaceFolders(async (event) => {
7982
for (const folder of event.removed) {
8083
await languageClientManager.handleWorkspaceFolderRemoved(folder);
84+
handleTestControllerWorkspaceFolderRemoved(folder);
8185
}
8286
// we might have closed client for some nested workspace folder child
8387
// reopen all needed

src/testController.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ import type { LanguageClientManager } from "./languageClientManager";
1010
import { type WorkspaceTracker, getProjectDir } from "./project";
1111
import { reporter } from "./telemetry";
1212

13+
const workspaceWatchers = new Map<string, vscode.FileSystemWatcher>();
14+
15+
export function handleWorkspaceFolderRemoved(folder: vscode.WorkspaceFolder) {
16+
const watcher = workspaceWatchers.get(folder.uri.toString());
17+
if (watcher) {
18+
watcher.dispose();
19+
workspaceWatchers.delete(folder.uri.toString());
20+
}
21+
}
22+
1323
export function configureTestController(
1424
context: vscode.ExtensionContext,
1525
languageClientManager: LanguageClientManager,
@@ -350,6 +360,9 @@ export function configureTestController(
350360

351361
await Promise.all(
352362
outerMostWorkspaceFolders.map(async (workspaceFolder) => {
363+
if (workspaceWatchers.has(workspaceFolder.uri.toString())) {
364+
return workspaceWatchers.get(workspaceFolder.uri.toString());
365+
}
353366
const projectDir = getProjectDir(workspaceFolder);
354367
console.log(
355368
"ElixirLS: registering watcher in",
@@ -361,6 +374,8 @@ export function configureTestController(
361374
const pattern = new vscode.RelativePattern(projectDir, "**/*_test.exs");
362375
const watcher = vscode.workspace.createFileSystemWatcher(pattern);
363376

377+
workspaceWatchers.set(workspaceFolder.uri.toString(), watcher);
378+
364379
context.subscriptions.push(watcher);
365380

366381
// When files are created, make sure there's a corresponding "file" node in the tree

0 commit comments

Comments
 (0)