mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
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 <chgagnon@microsoft.com> * activate extensions on data workspace new and open commands * Update extensions/data-workspace/src/services/workspaceService.ts Co-authored-by: Charles Gagnon <chgagnon@microsoft.com> Co-authored-by: Charles Gagnon <chgagnon@microsoft.com>
This commit is contained in:
@@ -54,6 +54,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
|
|
||||||
const registerCommandStartTime = new Date().getTime();
|
const registerCommandStartTime = new Date().getTime();
|
||||||
context.subscriptions.push(vscode.commands.registerCommand('projects.new', async () => {
|
context.subscriptions.push(vscode.commands.registerCommand('projects.new', async () => {
|
||||||
|
// Make sure all project providing extensions are activated to be sure the project templates show up
|
||||||
|
await workspaceService.ensureProviderExtensionLoaded(undefined, true);
|
||||||
|
|
||||||
if (azdataApi) {
|
if (azdataApi) {
|
||||||
const dialog = new NewProjectDialog(workspaceService);
|
const dialog = new NewProjectDialog(workspaceService);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
@@ -63,6 +66,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
context.subscriptions.push(vscode.commands.registerCommand('projects.openExisting', async () => {
|
context.subscriptions.push(vscode.commands.registerCommand('projects.openExisting', async () => {
|
||||||
|
// 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) {
|
if (azdataApi) {
|
||||||
const dialog = new OpenExistingDialog(workspaceService);
|
const dialog = new OpenExistingDialog(workspaceService);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
|
|||||||
@@ -255,8 +255,9 @@ export class WorkspaceService implements IWorkspaceService {
|
|||||||
/**
|
/**
|
||||||
* Ensure the project provider extension for the specified project is loaded
|
* 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 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<void> {
|
public async ensureProviderExtensionLoaded(projectType: string | undefined = undefined, forceActivate: boolean = false): Promise<void> {
|
||||||
const projType = projectType ? projectType.toUpperCase() : undefined;
|
const projType = projectType ? projectType.toUpperCase() : undefined;
|
||||||
let extension: vscode.Extension<any>;
|
let extension: vscode.Extension<any>;
|
||||||
for (extension of vscode.extensions.all) {
|
for (extension of vscode.extensions.all) {
|
||||||
@@ -265,20 +266,41 @@ export class WorkspaceService implements IWorkspaceService {
|
|||||||
if (projectTypes && projectTypes.length > 0) {
|
if (projectTypes && projectTypes.length > 0) {
|
||||||
if (projType) {
|
if (projType) {
|
||||||
if (projectTypes.findIndex((proj: string) => proj.toUpperCase() === projType) !== -1) {
|
if (projectTypes.findIndex((proj: string) => proj.toUpperCase() === projType) !== -1) {
|
||||||
await this.handleProjectProviderExtension(extension);
|
await this.handleProjectProviderExtension(extension, forceActivate);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await this.handleProjectProviderExtension(extension);
|
await this.handleProjectProviderExtension(extension, forceActivate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async handleProjectProviderExtension(extension: vscode.Extension<any>): Promise<void> {
|
/**
|
||||||
|
* 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<any>, forceActivate: boolean = false): Promise<void> {
|
||||||
try {
|
try {
|
||||||
if (!extension.isActive) {
|
if (!extension.isActive) {
|
||||||
|
if (forceActivate) {
|
||||||
await extension.activate();
|
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) {
|
} catch (err) {
|
||||||
Logger.error(constants.ExtensionActivationError(extension.id, err));
|
Logger.error(constants.ExtensionActivationError(extension.id, err));
|
||||||
|
|||||||
@@ -13,8 +13,6 @@
|
|||||||
"icon": "images/sqlDatabaseProjects.png",
|
"icon": "images/sqlDatabaseProjects.png",
|
||||||
"aiKey": "29a207bb14f84905966a8f22524cb730-25407f35-11b6-4d4e-8114-ab9e843cb52f-7380",
|
"aiKey": "29a207bb14f84905966a8f22524cb730-25407f35-11b6-4d4e-8114-ab9e843cb52f-7380",
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"onCommand:sqlDatabaseProjects.new",
|
|
||||||
"onCommand:sqlDatabaseProjects.open",
|
|
||||||
"onCommand:sqlDatabaseProjects.createProjectFromDatabase",
|
"onCommand:sqlDatabaseProjects.createProjectFromDatabase",
|
||||||
"onCommand:sqlDatabaseProjects.updateProjectFromDatabase",
|
"onCommand:sqlDatabaseProjects.updateProjectFromDatabase",
|
||||||
"onCommand:sqlDatabaseProjects.generateProjectFromOpenApiSpec",
|
"onCommand:sqlDatabaseProjects.generateProjectFromOpenApiSpec",
|
||||||
|
|||||||
Reference in New Issue
Block a user