From a5d0d1f5bdb3a387c4343bb507b51ba5f2020eba Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 17 Jul 2024 12:12:29 -0700 Subject: [PATCH 01/12] wip --- src/cmakeProject.ts | 2 +- src/presetsController.ts | 17 ++++++++++++++++- src/projectController.ts | 7 ++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/cmakeProject.ts b/src/cmakeProject.ts index 01468901fc..02122df085 100644 --- a/src/cmakeProject.ts +++ b/src/cmakeProject.ts @@ -139,7 +139,7 @@ export class CMakeProject { private onDidOpenTextDocumentListener: vscode.Disposable | undefined; private disposables: vscode.Disposable[] = []; private readonly onUseCMakePresetsChangedEmitter = new vscode.EventEmitter(); - private projectController: ProjectController | undefined; + public projectController: ProjectController | undefined; public readonly cTestController: CTestDriver; public readonly cPackageController: CPackDriver; public readonly workflowController: WorkflowDriver; diff --git a/src/presetsController.ts b/src/presetsController.ts index 45214aee98..1080fea898 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -26,6 +26,7 @@ type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefin export class PresetsController { private _presetsWatcher: chokidar.FSWatcher | undefined; + private _presetCreatedWatcher: chokidar.FSWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; private _presetsFileExists = false; @@ -1761,24 +1762,38 @@ export class PresetsController { return vscode.window.showTextDocument(vscode.Uri.file(presetsFilePath)); } + // TODO: update this for when a new preset file is added! private async watchPresetsChange() { if (this._presetsWatcher) { this._presetsWatcher.close().then(() => {}, () => {}); } + if (this._presetCreatedWatcher) { + this._presetCreatedWatcher.close().then(() => {}, () => {}); + } const handler = () => { void this.reapplyPresets(); }; this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) - .on('add', handler) .on('change', handler) .on('unlink', handler); + + const handler2 = () => { + log.debug(localize('preset.created', 'A new preset file was created!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')); + void this.reapplyPresets(); + }; + this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) + .on('add', handler2); + this._presetCreatedWatcher?.add("CMakePresets.json"); }; dispose() { if (this._presetsWatcher) { this._presetsWatcher.close().then(() => {}, () => {}); } + if (this._presetCreatedWatcher) { + this._presetCreatedWatcher.close().then(() => {}, () => {}); + } if (this._sourceDirChangedSub) { this._sourceDirChangedSub.dispose(); } diff --git a/src/projectController.ts b/src/projectController.ts index 027e178421..4583b28315 100644 --- a/src/projectController.ts +++ b/src/projectController.ts @@ -460,7 +460,7 @@ export class ProjectController implements vscode.Disposable { } } - private async doUseCMakePresetsChange(folder: vscode.WorkspaceFolder, useCMakePresets: string): Promise { + private async doUseCMakePresetsChange(folder: vscode.WorkspaceFolder, useCMakePresets?: string): Promise { const projects: CMakeProject[] | undefined = this.getProjectsForWorkspaceFolder(folder); if (projects) { for (const project of projects) { @@ -542,6 +542,11 @@ export class ProjectController implements vscode.Disposable { private async doSaveTextDocument(textDocument: vscode.TextDocument): Promise { await this.doCMakeFileChangeReconfigure(textDocument.uri); + + if (textDocument.fileName.endsWith("CMakePreset.json")) { + log.debug(localize('cmake.preset.file.save', 'CMake Preset file saved: {0}', textDocument.fileName)); + await this.updateActiveProject(this.activeProject?.workspaceFolder); + } } private async onDidRenameFiles(renamedFileEvt: vscode.FileRenameEvent): Promise { From 132948fe19755e01fd69a118818d3aedd206fcb9 Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 24 Jul 2024 11:54:59 -0700 Subject: [PATCH 02/12] works, but need to clean up and check for double configures --- src/cmakeProject.ts | 2 -- src/presetsController.ts | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cmakeProject.ts b/src/cmakeProject.ts index 5c4ca074b6..d25f820baa 100644 --- a/src/cmakeProject.ts +++ b/src/cmakeProject.ts @@ -2914,8 +2914,6 @@ export class CMakeProject { } } - await this.projectController?.updateActiveProject(this.workspaceFolder); - // Regardless of the following configure return code, // we want full feature set view for the whole workspace. await enableFullFeatureSet(true); diff --git a/src/presetsController.ts b/src/presetsController.ts index 209066a0cf..364d0e80da 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -219,6 +219,12 @@ export class PresetsController { // Don't need to set build/test presets here since they are reapplied in setConfigurePreset } + // this is used for the file watcher on adding a new presets file + async onCreatePresetsFile() { + await this.reapplyPresets(); + await this.project.projectController?.updateActiveProject(this.workspaceFolder); + } + private showNameInputBox() { return vscode.window.showInputBox({ placeHolder: localize('preset.name', 'Preset name') }); } @@ -1951,20 +1957,21 @@ export class PresetsController { this._presetCreatedWatcher.close().then(() => {}, () => {}); } - const handler = () => { + const presetChangeHandler = () => { void this.reapplyPresets(); }; this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) - .on('change', handler) - .on('unlink', handler); + .on('change', presetChangeHandler) + .on('unlink', presetChangeHandler); - const handler2 = () => { + const presetCreatedHandler = () => { log.debug(localize('preset.created', 'A new preset file was created!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')); - void this.reapplyPresets(); + void this.onCreatePresetsFile(); }; this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) - .on('add', handler2); + .on('add', presetCreatedHandler); this._presetCreatedWatcher?.add("CMakePresets.json"); + this._presetCreatedWatcher?.add("CMakeUserPresets.json"); }; dispose() { From f71501860b0bd497feeeba592a2c465e0ad47cdb Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 24 Jul 2024 13:34:39 -0700 Subject: [PATCH 03/12] cleanup --- src/presetsController.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 364d0e80da..e8bc57e1ca 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -219,12 +219,6 @@ export class PresetsController { // Don't need to set build/test presets here since they are reapplied in setConfigurePreset } - // this is used for the file watcher on adding a new presets file - async onCreatePresetsFile() { - await this.reapplyPresets(); - await this.project.projectController?.updateActiveProject(this.workspaceFolder); - } - private showNameInputBox() { return vscode.window.showInputBox({ placeHolder: localize('preset.name', 'Preset name') }); } @@ -1948,7 +1942,12 @@ export class PresetsController { return vscode.window.showTextDocument(vscode.Uri.file(presetsFilePath)); } - // TODO: update this for when a new preset file is added! + // this is used for the file watcher on adding a new presets file + async onCreatePresetsFile() { + await this.reapplyPresets(); + await this.project.projectController?.updateActiveProject(this.workspaceFolder); + } + private async watchPresetsChange() { if (this._presetsWatcher) { this._presetsWatcher.close().then(() => {}, () => {}); From 676f9a341cb8a79282409dd928852fa522992599 Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 24 Jul 2024 14:00:06 -0700 Subject: [PATCH 04/12] remove unnecessary edits --- src/projectController.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/projectController.ts b/src/projectController.ts index 4583b28315..027e178421 100644 --- a/src/projectController.ts +++ b/src/projectController.ts @@ -460,7 +460,7 @@ export class ProjectController implements vscode.Disposable { } } - private async doUseCMakePresetsChange(folder: vscode.WorkspaceFolder, useCMakePresets?: string): Promise { + private async doUseCMakePresetsChange(folder: vscode.WorkspaceFolder, useCMakePresets: string): Promise { const projects: CMakeProject[] | undefined = this.getProjectsForWorkspaceFolder(folder); if (projects) { for (const project of projects) { @@ -542,11 +542,6 @@ export class ProjectController implements vscode.Disposable { private async doSaveTextDocument(textDocument: vscode.TextDocument): Promise { await this.doCMakeFileChangeReconfigure(textDocument.uri); - - if (textDocument.fileName.endsWith("CMakePreset.json")) { - log.debug(localize('cmake.preset.file.save', 'CMake Preset file saved: {0}', textDocument.fileName)); - await this.updateActiveProject(this.activeProject?.workspaceFolder); - } } private async onDidRenameFiles(renamedFileEvt: vscode.FileRenameEvent): Promise { From 5536e4ac077e7f0dbbc29fc869aee6c3e3d5d111 Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 24 Jul 2024 14:08:29 -0700 Subject: [PATCH 05/12] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64f084ff5b..1b81aab66d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ Bug Fixes: - Fix re-using a terminal for launching even when the environment has changed. [#3478](https://github.com/microsoft/vscode-cmake-tools/issues/3478) - Don't require Ninja or Make on command line when checking for supported generators. [#3924](https://github.com/microsoft/vscode-cmake-tools/issues/3924) - Fix our keybindings for debug and run without debugging to better match VS Code. [#3507](https://github.com/microsoft/vscode-cmake-tools/issues/3507) +- Set usepresets context after manually creating a CMakePresets.json/CMakeUserPresets.json or using QuickStart to create it. [#3854](https://github.com/microsoft/vscode-cmake-tools/issues/3854) ## 1.18.43 From b3be1ffb455c1b9718c8abe8b9c25cd66e15ea55 Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Tue, 30 Jul 2024 17:17:39 -0700 Subject: [PATCH 06/12] added second watcher for userpresets bc chokidar is only watching the first file in the list for some reason..... need to follow up --- src/presetsController.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 0f97389cef..6606b2c75a 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -19,6 +19,7 @@ import { loadSchema } from '@cmt/schema'; import json5 = require('json5'); import { Diagnostic, DiagnosticSeverity, Position, Range } from 'vscode'; import collections from '@cmt/diagnostics/collections'; +import { debug } from 'console'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -29,7 +30,8 @@ type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefin export class PresetsController { private _presetsWatcher: chokidar.FSWatcher | undefined; - private _presetCreatedWatcher: chokidar.FSWatcher | undefined; + private _presetsCreatedWatcher: chokidar.FSWatcher | undefined; + private _userPresetsCreatedWatcher: chokidar.FSWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; private _presetsFileExists = false; @@ -1954,8 +1956,11 @@ export class PresetsController { if (this._presetsWatcher) { this._presetsWatcher.close().then(() => {}, () => {}); } - if (this._presetCreatedWatcher) { - this._presetCreatedWatcher.close().then(() => {}, () => {}); + if (this._presetsCreatedWatcher) { + this._presetsCreatedWatcher.close().then(() => {}, () => {}); + } + if (this._userPresetsCreatedWatcher) { + this._userPresetsCreatedWatcher.close().then(() => {}, () => {}); } const presetChangeHandler = () => { @@ -1966,21 +1971,23 @@ export class PresetsController { .on('unlink', presetChangeHandler); const presetCreatedHandler = () => { - log.debug(localize('preset.created', 'A new preset file was created!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')); void this.onCreatePresetsFile(); }; - this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) + this._presetsCreatedWatcher = chokidar.watch(this.presetsPath, { ignoreInitial: true }) + .on('add', presetCreatedHandler); + this._userPresetsCreatedWatcher = chokidar.watch(this.userPresetsPath, { ignoreInitial: true }) .on('add', presetCreatedHandler); - this._presetCreatedWatcher?.add("CMakePresets.json"); - this._presetCreatedWatcher?.add("CMakeUserPresets.json"); }; dispose() { if (this._presetsWatcher) { this._presetsWatcher.close().then(() => {}, () => {}); } - if (this._presetCreatedWatcher) { - this._presetCreatedWatcher.close().then(() => {}, () => {}); + if (this._presetsCreatedWatcher) { + this._presetsCreatedWatcher.close().then(() => {}, () => {}); + } + if (this._userPresetsCreatedWatcher) { + this._userPresetsCreatedWatcher.close().then(() => {}, () => {}); } if (this._sourceDirChangedSub) { this._sourceDirChangedSub.dispose(); From 3fbc85cd670a7bd774aabd9ca8cd8c92f8a1135d Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Tue, 30 Jul 2024 17:20:59 -0700 Subject: [PATCH 07/12] Update presetsController.ts --- src/presetsController.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 6606b2c75a..bd542240e5 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -19,7 +19,6 @@ import { loadSchema } from '@cmt/schema'; import json5 = require('json5'); import { Diagnostic, DiagnosticSeverity, Position, Range } from 'vscode'; import collections from '@cmt/diagnostics/collections'; -import { debug } from 'console'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); From 19282a769fb10a520d8f5d268edfb8b4999dff05 Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 31 Jul 2024 13:42:10 -0700 Subject: [PATCH 08/12] added wrapper to support multipath watchers --- src/presetsController.ts | 64 ++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index bd542240e5..04625f059f 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -29,8 +29,7 @@ type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefin export class PresetsController { private _presetsWatcher: chokidar.FSWatcher | undefined; - private _presetsCreatedWatcher: chokidar.FSWatcher | undefined; - private _userPresetsCreatedWatcher: chokidar.FSWatcher | undefined; + private _presetsWatchers: FileWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; private _presetsFileExists = false; @@ -1952,44 +1951,53 @@ export class PresetsController { } private async watchPresetsChange() { - if (this._presetsWatcher) { - this._presetsWatcher.close().then(() => {}, () => {}); - } - if (this._presetsCreatedWatcher) { - this._presetsCreatedWatcher.close().then(() => {}, () => {}); - } - if (this._userPresetsCreatedWatcher) { - this._userPresetsCreatedWatcher.close().then(() => {}, () => {}); - } const presetChangeHandler = () => { void this.reapplyPresets(); }; - this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) - .on('change', presetChangeHandler) - .on('unlink', presetChangeHandler); - const presetCreatedHandler = () => { void this.onCreatePresetsFile(); }; - this._presetsCreatedWatcher = chokidar.watch(this.presetsPath, { ignoreInitial: true }) - .on('add', presetCreatedHandler); - this._userPresetsCreatedWatcher = chokidar.watch(this.userPresetsPath, { ignoreInitial: true }) - .on('add', presetCreatedHandler); + + const events: Map void> = new Map void>([ + ["change", presetChangeHandler], + ["unlink", presetChangeHandler], + ["add", presetCreatedHandler] + ]); + + this._presetsWatchers?.dispose(); + this._presetsWatchers = new FileWatcher(this._referencedFiles, events); }; dispose() { - if (this._presetsWatcher) { - this._presetsWatcher.close().then(() => {}, () => {}); - } - if (this._presetsCreatedWatcher) { - this._presetsCreatedWatcher.close().then(() => {}, () => {}); - } - if (this._userPresetsCreatedWatcher) { - this._userPresetsCreatedWatcher.close().then(() => {}, () => {}); - } + this._presetsWatchers?.dispose(); + if (this._sourceDirChangedSub) { this._sourceDirChangedSub.dispose(); } } } + +/** + * FileWatcher is a wrapper around chokidar's FSWatcher that allows for watching multiple paths. + * Chokidar's support for watching multiple paths is currently broken, if it is fixed in the future, this class can be removed. + */ +class FileWatcher { + private watchers: Map; + + public constructor(paths: string | string[], eventHandlers: Map void>) { + this.watchers = new Map(); + for (const path of Array.isArray(paths) ? paths : [paths]) { + + const watcher = chokidar.watch(path, { ignoreInitial: true }); + Array.from(eventHandlers).forEach(([event, handler]) => watcher.on(event, handler)); + this.watchers.set(path, watcher); + } + } + + public dispose() { + for (const watcher of this.watchers.values()) { + watcher.close().then(() => {}, () => {}); + } + } +} From c9ff0e78aa284f2c83e8541b6c2ea2542d88e69b Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Wed, 31 Jul 2024 14:18:02 -0700 Subject: [PATCH 09/12] add options option and error catch --- src/presetsController.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 04625f059f..88d37f7635 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -28,7 +28,6 @@ const log = logging.createLogger('presetController'); type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefined) => void; export class PresetsController { - private _presetsWatcher: chokidar.FSWatcher | undefined; private _presetsWatchers: FileWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; @@ -1966,7 +1965,7 @@ export class PresetsController { ]); this._presetsWatchers?.dispose(); - this._presetsWatchers = new FileWatcher(this._referencedFiles, events); + this._presetsWatchers = new FileWatcher(this._referencedFiles, events, { ignoreInitial: true }); }; dispose() { @@ -1985,13 +1984,17 @@ export class PresetsController { class FileWatcher { private watchers: Map; - public constructor(paths: string | string[], eventHandlers: Map void>) { + public constructor(paths: string | string[], eventHandlers: Map void>, options?: chokidar.WatchOptions) { this.watchers = new Map(); - for (const path of Array.isArray(paths) ? paths : [paths]) { - const watcher = chokidar.watch(path, { ignoreInitial: true }); - Array.from(eventHandlers).forEach(([event, handler]) => watcher.on(event, handler)); - this.watchers.set(path, watcher); + for (const path of Array.isArray(paths) ? paths : [paths]) { + try { + const watcher = chokidar.watch(path, { ...options }); + Array.from(eventHandlers).forEach(([event, handler]) => watcher.on(event, handler)); + this.watchers.set(path, watcher); + } catch (error) { + log.error(localize('failed.to.watch', 'Watcher could not be created for {0}: {1}', path, util.errorToString(error))); + } } } From f0ae952a7f5b566d70da7ae6ff9d43bb1f383c3f Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Thu, 1 Aug 2024 11:28:46 -0700 Subject: [PATCH 10/12] for loop and disposable --- src/presetsController.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 88d37f7635..0ed285b400 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -1981,13 +1981,15 @@ export class PresetsController { * FileWatcher is a wrapper around chokidar's FSWatcher that allows for watching multiple paths. * Chokidar's support for watching multiple paths is currently broken, if it is fixed in the future, this class can be removed. */ -class FileWatcher { +class FileWatcher implements vscode.Disposable { private watchers: Map; public constructor(paths: string | string[], eventHandlers: Map void>, options?: chokidar.WatchOptions) { this.watchers = new Map(); - for (const path of Array.isArray(paths) ? paths : [paths]) { + paths = Array.isArray(paths) ? paths : [paths]; + for (let i = 0; i < paths.length; i++) { + const path = paths[i]; try { const watcher = chokidar.watch(path, { ...options }); Array.from(eventHandlers).forEach(([event, handler]) => watcher.on(event, handler)); From 5e57c39b06f7044f77d816391fbadd7012da044c Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Thu, 1 Aug 2024 11:41:38 -0700 Subject: [PATCH 11/12] add disposable to presetscontroller --- src/presetsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index 0ed285b400..cc0d994e6a 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -27,7 +27,7 @@ const log = logging.createLogger('presetController'); type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefined) => void; -export class PresetsController { +export class PresetsController implements vscode.Disposable { private _presetsWatchers: FileWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; From 3fd135d0ac17514d5fadafa59fc7ef3c32d0b6ba Mon Sep 17 00:00:00 2001 From: Fatima Qarni Date: Thu, 1 Aug 2024 12:07:30 -0700 Subject: [PATCH 12/12] lol fixed the right loop this time --- src/presetsController.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/presetsController.ts b/src/presetsController.ts index cc0d994e6a..d687566c31 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -1987,12 +1987,14 @@ class FileWatcher implements vscode.Disposable { public constructor(paths: string | string[], eventHandlers: Map void>, options?: chokidar.WatchOptions) { this.watchers = new Map(); - paths = Array.isArray(paths) ? paths : [paths]; - for (let i = 0; i < paths.length; i++) { - const path = paths[i]; + for (const path of Array.isArray(paths) ? paths : [paths]) { try { const watcher = chokidar.watch(path, { ...options }); - Array.from(eventHandlers).forEach(([event, handler]) => watcher.on(event, handler)); + const eventHandlerEntries = Array.from(eventHandlers); + for (let i = 0; i < eventHandlerEntries.length; i++) { + const [event, handler] = eventHandlerEntries[i]; + watcher.on(event, handler); + } this.watchers.set(path, watcher); } catch (error) { log.error(localize('failed.to.watch', 'Watcher could not be created for {0}: {1}', path, util.errorToString(error)));