From e492335b8b06c844f325cf55ea1474635d5ac9ac Mon Sep 17 00:00:00 2001 From: elrashed Date: Mon, 30 Jan 2023 13:31:08 -0800 Subject: [PATCH 1/4] update code model in the beginning --- src/drivers/cmakeFileApiDriver.ts | 6 +++--- src/projectController.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/drivers/cmakeFileApiDriver.ts b/src/drivers/cmakeFileApiDriver.ts index 11c88805f..7878b225f 100644 --- a/src/drivers/cmakeFileApiDriver.ts +++ b/src/drivers/cmakeFileApiDriver.ts @@ -197,7 +197,8 @@ export class CMakeFileApiDriver extends CMakeDriver { } async doConfigure(args_: string[], outputConsumer?: proc.OutputConsumer, showCommandOnly?: boolean, configurePreset?: ConfigurePreset | null, options?: proc.ExecutionOptions): Promise { - const api_path = this.getCMakeFileApiPath(configurePreset?.binaryDir); + const binaryDir = configurePreset?.binaryDir ?? this.binaryDir; + const api_path = this.getCMakeFileApiPath(binaryDir); await createQueryFileForApi(api_path); // Dup args so we can modify them @@ -208,7 +209,6 @@ export class CMakeFileApiDriver extends CMakeDriver { has_gen = true; } } - const binaryDir = configurePreset?.binaryDir ?? this.binaryDir; // -S and -B were introduced in CMake 3.13 and this driver assumes CMake >= 3.15 args.push(`-S${util.lightNormalizePath(this.sourceDir)}`); args.push(`-B${util.lightNormalizePath(binaryDir)}`); @@ -258,7 +258,7 @@ export class CMakeFileApiDriver extends CMakeDriver { if (!configurePreset) { this._needsReconfigure = false; } - await this.updateCodeModel(configurePreset?.binaryDir); + await this.updateCodeModel(binaryDir); } return result.retc === null ? -1 : result.retc; } diff --git a/src/projectController.ts b/src/projectController.ts index f7c1bcec9..55c4dad13 100644 --- a/src/projectController.ts +++ b/src/projectController.ts @@ -197,7 +197,8 @@ export class ProjectController implements vscode.Disposable { this.folderToProjectsMap.clear(); if (vscode.workspace.workspaceFolders) { for (const folder of vscode.workspace.workspaceFolders) { - await this.addFolder(folder); + const projects: CMakeProject[] = await this.addFolder(folder); + this.afterAddFolderEmitter.fire({ folder: folder, projects: projects}); } } } From 41c8ec397212275464a29c75cb553e0805c41304 Mon Sep 17 00:00:00 2001 From: elrashed Date: Mon, 30 Jan 2023 13:34:40 -0800 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 397c2be45..f661b8d62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ Improvements: Bug Fixes: - Compatibility between test and build presets was not enforced. [#2904](https://github.com/microsoft/vscode-cmake-tools/issues/2904) +## 1.13.44 +Bug Fixes: +- Fix problems with updating the code model. [#2980](https://github.com/microsoft/vscode-cmake-tools/issues/2980) + ## 1.13.43 Bug Fixes: - Fix an issue causing the Add Presets commands not to appear. [PR #2977](https://github.com/microsoft/vscode-cmake-tools/pull/2977) From e69aed15cc0c168f4b273ec38934d7d13a71c1bd Mon Sep 17 00:00:00 2001 From: elrashed Date: Mon, 30 Jan 2023 14:21:40 -0800 Subject: [PATCH 3/4] clean the code --- src/projectController.ts | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/projectController.ts b/src/projectController.ts index 55c4dad13..0bf3d4c99 100644 --- a/src/projectController.ts +++ b/src/projectController.ts @@ -197,8 +197,7 @@ export class ProjectController implements vscode.Disposable { this.folderToProjectsMap.clear(); if (vscode.workspace.workspaceFolders) { for (const folder of vscode.workspace.workspaceFolders) { - const projects: CMakeProject[] = await this.addFolder(folder); - this.afterAddFolderEmitter.fire({ folder: folder, projects: projects}); + await this.addFolder(folder); } } } @@ -267,23 +266,26 @@ export class ProjectController implements vscode.Disposable { * @returns The newly created CMakeProject backend for the given folder */ private async addFolder(folder: vscode.WorkspaceFolder): Promise { - const existing = this.getProjectsForWorkspaceFolder(folder); - if (existing) { + this.beforeAddFolderEmitter.fire(folder); + let projects: CMakeProject[] | undefined = this.getProjectsForWorkspaceFolder(folder); + if (projects) { rollbar.error(localize('same.folder.loaded.twice', 'The same workspace folder was loaded twice'), { wsUri: folder.uri.toString() }); - return existing; - } - // Load for the workspace. - const workspaceContext = DirectoryContext.createForDirectory(folder, new StateManager(this.extensionContext, folder)); - const newProjects: CMakeProject[] = await ProjectController.createCMakeProjectsForWorkspaceFolder(workspaceContext); - this.folderToProjectsMap.set(folder.uri.fsPath, newProjects); - const config: ConfigurationReader | undefined = workspaceContext.config; - if (config) { - this.sourceDirectorySub.set(folder, config.onChange('sourceDirectory', async (sourceDirectories: string | string[]) => this.doSourceDirectoryChange(folder, sourceDirectories))); - this.buildDirectorySub.set(folder, config.onChange('buildDirectory', async () => this.refreshDriverSettings(folder, config.sourceDirectory))); - this.installPrefixSub.set(folder, config.onChange('installPrefix', async () => this.refreshDriverSettings(folder, config.sourceDirectory))); - this.useCMakePresetsSub.set(folder, config.onChange('useCMakePresets', async (useCMakePresets: string) => this.doUseCMakePresetsChange(folder, useCMakePresets))); + return projects; + } else { + // Load for the workspace. + const workspaceContext = DirectoryContext.createForDirectory(folder, new StateManager(this.extensionContext, folder)); + projects = await ProjectController.createCMakeProjectsForWorkspaceFolder(workspaceContext); + this.folderToProjectsMap.set(folder.uri.fsPath, projects); + const config: ConfigurationReader | undefined = workspaceContext.config; + if (config) { + this.sourceDirectorySub.set(folder, config.onChange('sourceDirectory', async (sourceDirectories: string | string[]) => this.doSourceDirectoryChange(folder, sourceDirectories))); + this.buildDirectorySub.set(folder, config.onChange('buildDirectory', async () => this.refreshDriverSettings(folder, config.sourceDirectory))); + this.installPrefixSub.set(folder, config.onChange('installPrefix', async () => this.refreshDriverSettings(folder, config.sourceDirectory))); + this.useCMakePresetsSub.set(folder, config.onChange('useCMakePresets', async (useCMakePresets: string) => this.doUseCMakePresetsChange(folder, useCMakePresets))); + } + this.afterAddFolderEmitter.fire({ folder: folder, projects: projects }); } - return newProjects; + return projects; } /** From 2cbcd4f5be3d85581c11adf1c97e0300c6be1371 Mon Sep 17 00:00:00 2001 From: elrashed Date: Mon, 30 Jan 2023 14:23:55 -0800 Subject: [PATCH 4/4] clean the code --- src/projectController.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/projectController.ts b/src/projectController.ts index 0bf3d4c99..a59d43e2d 100644 --- a/src/projectController.ts +++ b/src/projectController.ts @@ -270,7 +270,6 @@ export class ProjectController implements vscode.Disposable { let projects: CMakeProject[] | undefined = this.getProjectsForWorkspaceFolder(folder); if (projects) { rollbar.error(localize('same.folder.loaded.twice', 'The same workspace folder was loaded twice'), { wsUri: folder.uri.toString() }); - return projects; } else { // Load for the workspace. const workspaceContext = DirectoryContext.createForDirectory(folder, new StateManager(this.extensionContext, folder)); @@ -283,8 +282,8 @@ export class ProjectController implements vscode.Disposable { this.installPrefixSub.set(folder, config.onChange('installPrefix', async () => this.refreshDriverSettings(folder, config.sourceDirectory))); this.useCMakePresetsSub.set(folder, config.onChange('useCMakePresets', async (useCMakePresets: string) => this.doUseCMakePresetsChange(folder, useCMakePresets))); } - this.afterAddFolderEmitter.fire({ folder: folder, projects: projects }); } + this.afterAddFolderEmitter.fire({ folder: folder, projects: projects }); return projects; } @@ -430,9 +429,7 @@ export class ProjectController implements vscode.Disposable { } // Load a new CMake Tools instance for each folder that has been added. for (const folder of event.added) { - this.beforeAddFolderEmitter.fire(folder); - const cmakeProjects = await this.addFolder(folder); - this.afterAddFolderEmitter.fire({ folder: folder, projects: cmakeProjects }); + await this.addFolder(folder); } }