From 5fbbc3a76b8283de3f13cd820f51b6474ebdc3aa Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Wed, 4 Jan 2023 11:47:51 -0800 Subject: [PATCH] Change how data-workspace activates project extensions (#21470) * change how data workspace activates project extensions * cleanup * undo whitespace change * Update extensions/data-workspace/src/services/workspaceService.ts Co-authored-by: Charles Gagnon * activate extensions on data workspace new and open commands * Update extensions/data-workspace/src/services/workspaceService.ts Co-authored-by: Charles Gagnon Co-authored-by: Charles Gagnon --- extensions/data-workspace/src/main.ts | 6 ++++ .../src/services/workspaceService.ts | 32 ++++++++++++++++--- extensions/sql-database-projects/package.json | 2 -- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/extensions/data-workspace/src/main.ts b/extensions/data-workspace/src/main.ts index 39e4cf97fb..2cd49aa480 100644 --- a/extensions/data-workspace/src/main.ts +++ b/extensions/data-workspace/src/main.ts @@ -54,6 +54,9 @@ export async function activate(context: vscode.ExtensionContext): Promise { + // Make sure all project providing extensions are activated to be sure the project templates show up + await workspaceService.ensureProviderExtensionLoaded(undefined, true); + if (azdataApi) { const dialog = new NewProjectDialog(workspaceService); await dialog.open(); @@ -63,6 +66,9 @@ export async function activate(context: vscode.ExtensionContext): Promise { + // Make sure all project providing extensions are activated so that all supported project types show up in the file filter + await workspaceService.ensureProviderExtensionLoaded(undefined, true); + if (azdataApi) { const dialog = new OpenExistingDialog(workspaceService); await dialog.open(); diff --git a/extensions/data-workspace/src/services/workspaceService.ts b/extensions/data-workspace/src/services/workspaceService.ts index f1fbc8900f..0935b12d7d 100644 --- a/extensions/data-workspace/src/services/workspaceService.ts +++ b/extensions/data-workspace/src/services/workspaceService.ts @@ -255,8 +255,9 @@ export class WorkspaceService implements IWorkspaceService { /** * Ensure the project provider extension for the specified project is loaded * @param projectType The file extension of the project, if not specified, all project provider extensions will be loaded. + * @param forceActivate forces project providing extensions to be activated if true */ - private async ensureProviderExtensionLoaded(projectType: string | undefined = undefined): Promise { + public async ensureProviderExtensionLoaded(projectType: string | undefined = undefined, forceActivate: boolean = false): Promise { const projType = projectType ? projectType.toUpperCase() : undefined; let extension: vscode.Extension; for (extension of vscode.extensions.all) { @@ -265,20 +266,41 @@ export class WorkspaceService implements IWorkspaceService { if (projectTypes && projectTypes.length > 0) { if (projType) { if (projectTypes.findIndex((proj: string) => proj.toUpperCase() === projType) !== -1) { - await this.handleProjectProviderExtension(extension); + await this.handleProjectProviderExtension(extension, forceActivate); break; } } else { - await this.handleProjectProviderExtension(extension); + await this.handleProjectProviderExtension(extension, forceActivate); } } } } - private async handleProjectProviderExtension(extension: vscode.Extension): Promise { + /** + * Ensures project provider extension is activated and registered + * @param extension Extension to activate and register + * @param forceActivate Activates the extension if true. If false, only activates the extension if the workspace contains a file with the extension's project type + */ + private async handleProjectProviderExtension(extension: vscode.Extension, forceActivate: boolean = false): Promise { try { if (!extension.isActive) { - await extension.activate(); + if (forceActivate) { + await extension.activate(); + } else { + const projectTypes = extension.packageJSON.contributes?.projects as string[] | undefined; + if (!projectTypes) { + return; + } + + for (const projType of projectTypes) { + const projFilesInWorkspace = await vscode.workspace.findFiles(`**/*.${projType}`); + if (projFilesInWorkspace.length > 0) { + // only try to activate the extension if the workspace has at least one project with that extension + await extension.activate(); + break; + } + } + } } } catch (err) { Logger.error(constants.ExtensionActivationError(extension.id, err)); diff --git a/extensions/sql-database-projects/package.json b/extensions/sql-database-projects/package.json index 9fcf47515e..cc7110cfe1 100644 --- a/extensions/sql-database-projects/package.json +++ b/extensions/sql-database-projects/package.json @@ -13,8 +13,6 @@ "icon": "images/sqlDatabaseProjects.png", "aiKey": "29a207bb14f84905966a8f22524cb730-25407f35-11b6-4d4e-8114-ab9e843cb52f-7380", "activationEvents": [ - "onCommand:sqlDatabaseProjects.new", - "onCommand:sqlDatabaseProjects.open", "onCommand:sqlDatabaseProjects.createProjectFromDatabase", "onCommand:sqlDatabaseProjects.updateProjectFromDatabase", "onCommand:sqlDatabaseProjects.generateProjectFromOpenApiSpec",