mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
fix the extension dependency issue (#12347)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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<dataworkspace.IExtension> {
|
||||
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<datawo
|
||||
context.subscriptions.push(vscode.commands.registerCommand('projects.removeProject', async (treeItem: WorkspaceTreeItem) => {
|
||||
await workspaceService.removeProject(vscode.Uri.file(treeItem.element.project.projectFilePath));
|
||||
}));
|
||||
|
||||
return new DataWorkspaceExtension();
|
||||
}
|
||||
|
||||
export function deactivate(): void {
|
||||
|
||||
@@ -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<void> {
|
||||
const inactiveExtensions = vscode.extensions.all.filter(ext => !ext.isActive);
|
||||
const projType = projectType ? projectType.toUpperCase() : undefined;
|
||||
let extension: vscode.Extension<any>;
|
||||
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<any>): Promise<void> {
|
||||
private async handleProjectProviderExtension(extension: vscode.Extension<any>): Promise<void> {
|
||||
try {
|
||||
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<T>(configurationName: string): T {
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -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<void> {
|
||||
public async activate(): Promise<IProjectProvider> {
|
||||
await this.initializeDatabaseProjects();
|
||||
return new SqlDatabaseProjectProvider();
|
||||
}
|
||||
|
||||
private async initializeDatabaseProjects(): Promise<void> {
|
||||
|
||||
@@ -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<void> {
|
||||
export function activate(context: vscode.ExtensionContext): Promise<IProjectProvider> {
|
||||
// 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 {
|
||||
|
||||
Reference in New Issue
Block a user