diff --git a/src/extension.ts b/src/extension.ts index 1da9e6c..61fb408 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,7 +8,10 @@ import { WorkspaceTracker } from "./project"; import { TaskProvider } from "./taskProvider"; import { configureTelemetry, reporter } from "./telemetry"; import { configureTerminalLinkProvider } from "./terminalLinkProvider"; -import { configureTestController } from "./testController"; +import { + configureTestController, + handleWorkspaceFolderRemoved as handleTestControllerWorkspaceFolderRemoved, +} from "./testController"; import { testElixir } from "./testElixir"; console.log("ElixirLS: Loading extension"); @@ -78,6 +81,7 @@ export function activate(context: vscode.ExtensionContext): ElixirLS { vscode.workspace.onDidChangeWorkspaceFolders(async (event) => { for (const folder of event.removed) { await languageClientManager.handleWorkspaceFolderRemoved(folder); + handleTestControllerWorkspaceFolderRemoved(folder); } // we might have closed client for some nested workspace folder child // reopen all needed diff --git a/src/testController.ts b/src/testController.ts index fa5866e..e3332fa 100644 --- a/src/testController.ts +++ b/src/testController.ts @@ -10,6 +10,16 @@ import type { LanguageClientManager } from "./languageClientManager"; import { type WorkspaceTracker, getProjectDir } from "./project"; import { reporter } from "./telemetry"; +const workspaceWatchers = new Map(); + +export function handleWorkspaceFolderRemoved(folder: vscode.WorkspaceFolder) { + const watcher = workspaceWatchers.get(folder.uri.toString()); + if (watcher) { + watcher.dispose(); + workspaceWatchers.delete(folder.uri.toString()); + } +} + export function configureTestController( context: vscode.ExtensionContext, languageClientManager: LanguageClientManager, @@ -350,6 +360,9 @@ export function configureTestController( await Promise.all( outerMostWorkspaceFolders.map(async (workspaceFolder) => { + if (workspaceWatchers.has(workspaceFolder.uri.toString())) { + return workspaceWatchers.get(workspaceFolder.uri.toString()); + } const projectDir = getProjectDir(workspaceFolder); console.log( "ElixirLS: registering watcher in", @@ -361,6 +374,8 @@ export function configureTestController( const pattern = new vscode.RelativePattern(projectDir, "**/*_test.exs"); const watcher = vscode.workspace.createFileSystemWatcher(pattern); + workspaceWatchers.set(workspaceFolder.uri.toString(), watcher); + context.subscriptions.push(watcher); // When files are created, make sure there's a corresponding "file" node in the tree