diff --git a/extensions/data-workspace/src/dataWorkspaceExtension.ts b/extensions/data-workspace/src/dataWorkspaceExtension.ts deleted file mode 100644 index 72ee5abf23..0000000000 --- a/extensions/data-workspace/src/dataWorkspaceExtension.ts +++ /dev/null @@ -1,14 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as vscode from 'vscode'; -import * as dataworkspace from 'dataworkspace'; -import { ProjectProviderRegistry } from './common/projectProviderRegistry'; - -export class DataWorkspaceExtension implements dataworkspace.IExtension { - registerProjectProvider(provider: dataworkspace.IProjectProvider): vscode.Disposable { - return ProjectProviderRegistry.registerProvider(provider); - } -} diff --git a/extensions/data-workspace/src/main.ts b/extensions/data-workspace/src/main.ts index cc07c516a7..1a4e599365 100644 --- a/extensions/data-workspace/src/main.ts +++ b/extensions/data-workspace/src/main.ts @@ -5,14 +5,12 @@ import * as vscode from 'vscode'; import * as path from 'path'; -import * as dataworkspace from 'dataworkspace'; import { WorkspaceTreeDataProvider } from './common/workspaceTreeDataProvider'; import { WorkspaceService } from './services/workspaceService'; -import { DataWorkspaceExtension } from './dataWorkspaceExtension'; import { SelectProjectFileActionName } from './common/constants'; import { WorkspaceTreeItem } from './common/interfaces'; -export async function activate(context: vscode.ExtensionContext): Promise { +export function activate(context: vscode.ExtensionContext): void { const workspaceService = new WorkspaceService(); const workspaceTreeDataProvider = new WorkspaceTreeDataProvider(workspaceService); context.subscriptions.push(vscode.window.registerTreeDataProvider('dataworkspace.views.main', workspaceTreeDataProvider)); @@ -47,8 +45,6 @@ export async function activate(context: vscode.ExtensionContext): Promise { await workspaceService.removeProject(vscode.Uri.file(treeItem.element.project.projectFilePath)); })); - - return new DataWorkspaceExtension(); } export function deactivate(): void { diff --git a/extensions/data-workspace/src/services/workspaceService.ts b/extensions/data-workspace/src/services/workspaceService.ts index a92c3a6295..b9b2d94b94 100644 --- a/extensions/data-workspace/src/services/workspaceService.ts +++ b/extensions/data-workspace/src/services/workspaceService.ts @@ -89,31 +89,36 @@ export class WorkspaceService implements IWorkspaceService { * @param projectType The file extension of the project, if not specified, all project provider extensions will be loaded. */ private async ensureProviderExtensionLoaded(projectType: string | undefined = undefined): Promise { - const inactiveExtensions = vscode.extensions.all.filter(ext => !ext.isActive); const projType = projectType ? projectType.toUpperCase() : undefined; let extension: vscode.Extension; - for (extension of inactiveExtensions) { + for (extension of vscode.extensions.all) { const projectTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.projects as string[]; // Process only when this extension is contributing project providers if (projectTypes && projectTypes.length > 0) { if (projType) { if (projectTypes.findIndex((proj: string) => proj.toUpperCase() === projType) !== -1) { - await this.activateExtension(extension); + await this.handleProjectProviderExtension(extension); break; } } else { - await this.activateExtension(extension); + await this.handleProjectProviderExtension(extension); } } } } - private async activateExtension(extension: vscode.Extension): Promise { + private async handleProjectProviderExtension(extension: vscode.Extension): Promise { try { - await extension.activate(); + if (!extension.isActive) { + await extension.activate(); + } } catch (err) { Logger.error(ExtensionActivationErrorMessage(extension.id, err)); } + + if (extension.isActive && extension.exports && !ProjectProviderRegistry.providers.includes(extension.exports)) { + ProjectProviderRegistry.registerProvider(extension.exports); + } } getWorkspaceConfigurationValue(configurationName: string): T { diff --git a/extensions/data-workspace/src/test/dataWorkspaceExtension.test.ts b/extensions/data-workspace/src/test/dataWorkspaceExtension.test.ts deleted file mode 100644 index b3a7a903fd..0000000000 --- a/extensions/data-workspace/src/test/dataWorkspaceExtension.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'mocha'; -import * as should from 'should'; -import { DataWorkspaceExtension } from '../dataWorkspaceExtension'; -import { createProjectProvider } from './projectProviderRegistry.test'; -import { ProjectProviderRegistry } from '../common/projectProviderRegistry'; - -suite('DataWorkspaceExtension Tests', function (): void { - test('register and unregister project provider through the extension api', async () => { - const extension = new DataWorkspaceExtension(); - const provider = createProjectProvider([ - { - projectFileExtension: 'testproj', - icon: '', - displayName: 'test project' - } - ]); - const disposable = extension.registerProjectProvider(provider); - should.strictEqual(ProjectProviderRegistry.providers.length, 1, 'project provider should have been registered'); - disposable.dispose(); - should.strictEqual(ProjectProviderRegistry.providers.length, 0, 'there should be nothing in the ProjectProviderRegistry'); - }); -}); diff --git a/extensions/sql-database-projects/src/controllers/mainController.ts b/extensions/sql-database-projects/src/controllers/mainController.ts index 5234d75cd5..a1fe163283 100644 --- a/extensions/sql-database-projects/src/controllers/mainController.ts +++ b/extensions/sql-database-projects/src/controllers/mainController.ts @@ -18,6 +18,8 @@ import { NetCoreTool } from '../tools/netcoreTool'; import { Project } from '../models/project'; import { FileNode, FolderNode } from '../models/tree/fileFolderTreeItem'; import { IconPathHelper } from '../common/iconHelper'; +import { IProjectProvider } from 'dataworkspace'; +import { SqlDatabaseProjectProvider } from '../projectProvider/projectProvider'; const SQL_DATABASE_PROJECTS_VIEW_ID = 'sqlDatabaseProjectsView'; @@ -45,8 +47,9 @@ export default class MainController implements vscode.Disposable { public deactivate(): void { } - public async activate(): Promise { + public async activate(): Promise { await this.initializeDatabaseProjects(); + return new SqlDatabaseProjectProvider(); } private async initializeDatabaseProjects(): Promise { diff --git a/extensions/sql-database-projects/src/extension.ts b/extensions/sql-database-projects/src/extension.ts index dfd92eb254..1a9123b32b 100644 --- a/extensions/sql-database-projects/src/extension.ts +++ b/extensions/sql-database-projects/src/extension.ts @@ -5,16 +5,17 @@ import * as vscode from 'vscode'; import MainController from './controllers/mainController'; +import { IProjectProvider } from 'dataworkspace'; let controllers: MainController[] = []; -export async function activate(context: vscode.ExtensionContext): Promise { +export function activate(context: vscode.ExtensionContext): Promise { // Start the main controller const mainController = new MainController(context); controllers.push(mainController); context.subscriptions.push(mainController); - await mainController.activate(); + return mainController.activate(); } export function deactivate(): void {