mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -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 vscode from 'vscode';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as dataworkspace from 'dataworkspace';
|
|
||||||
import { WorkspaceTreeDataProvider } from './common/workspaceTreeDataProvider';
|
import { WorkspaceTreeDataProvider } from './common/workspaceTreeDataProvider';
|
||||||
import { WorkspaceService } from './services/workspaceService';
|
import { WorkspaceService } from './services/workspaceService';
|
||||||
import { DataWorkspaceExtension } from './dataWorkspaceExtension';
|
|
||||||
import { SelectProjectFileActionName } from './common/constants';
|
import { SelectProjectFileActionName } from './common/constants';
|
||||||
import { WorkspaceTreeItem } from './common/interfaces';
|
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 workspaceService = new WorkspaceService();
|
||||||
const workspaceTreeDataProvider = new WorkspaceTreeDataProvider(workspaceService);
|
const workspaceTreeDataProvider = new WorkspaceTreeDataProvider(workspaceService);
|
||||||
context.subscriptions.push(vscode.window.registerTreeDataProvider('dataworkspace.views.main', workspaceTreeDataProvider));
|
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) => {
|
context.subscriptions.push(vscode.commands.registerCommand('projects.removeProject', async (treeItem: WorkspaceTreeItem) => {
|
||||||
await workspaceService.removeProject(vscode.Uri.file(treeItem.element.project.projectFilePath));
|
await workspaceService.removeProject(vscode.Uri.file(treeItem.element.project.projectFilePath));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return new DataWorkspaceExtension();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deactivate(): void {
|
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.
|
* @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> {
|
private async ensureProviderExtensionLoaded(projectType: string | undefined = undefined): Promise<void> {
|
||||||
const inactiveExtensions = vscode.extensions.all.filter(ext => !ext.isActive);
|
|
||||||
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 inactiveExtensions) {
|
for (extension of vscode.extensions.all) {
|
||||||
const projectTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.projects as string[];
|
const projectTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.projects as string[];
|
||||||
// Process only when this extension is contributing project providers
|
// Process only when this extension is contributing project providers
|
||||||
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.activateExtension(extension);
|
await this.handleProjectProviderExtension(extension);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} 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 {
|
try {
|
||||||
|
if (!extension.isActive) {
|
||||||
await extension.activate();
|
await extension.activate();
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
Logger.error(ExtensionActivationErrorMessage(extension.id, 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 {
|
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 { Project } from '../models/project';
|
||||||
import { FileNode, FolderNode } from '../models/tree/fileFolderTreeItem';
|
import { FileNode, FolderNode } from '../models/tree/fileFolderTreeItem';
|
||||||
import { IconPathHelper } from '../common/iconHelper';
|
import { IconPathHelper } from '../common/iconHelper';
|
||||||
|
import { IProjectProvider } from 'dataworkspace';
|
||||||
|
import { SqlDatabaseProjectProvider } from '../projectProvider/projectProvider';
|
||||||
|
|
||||||
const SQL_DATABASE_PROJECTS_VIEW_ID = 'sqlDatabaseProjectsView';
|
const SQL_DATABASE_PROJECTS_VIEW_ID = 'sqlDatabaseProjectsView';
|
||||||
|
|
||||||
@@ -45,8 +47,9 @@ export default class MainController implements vscode.Disposable {
|
|||||||
public deactivate(): void {
|
public deactivate(): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async activate(): Promise<void> {
|
public async activate(): Promise<IProjectProvider> {
|
||||||
await this.initializeDatabaseProjects();
|
await this.initializeDatabaseProjects();
|
||||||
|
return new SqlDatabaseProjectProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async initializeDatabaseProjects(): Promise<void> {
|
private async initializeDatabaseProjects(): Promise<void> {
|
||||||
|
|||||||
@@ -5,16 +5,17 @@
|
|||||||
|
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import MainController from './controllers/mainController';
|
import MainController from './controllers/mainController';
|
||||||
|
import { IProjectProvider } from 'dataworkspace';
|
||||||
|
|
||||||
let controllers: MainController[] = [];
|
let controllers: MainController[] = [];
|
||||||
|
|
||||||
export async function activate(context: vscode.ExtensionContext): Promise<void> {
|
export function activate(context: vscode.ExtensionContext): Promise<IProjectProvider> {
|
||||||
// Start the main controller
|
// Start the main controller
|
||||||
const mainController = new MainController(context);
|
const mainController = new MainController(context);
|
||||||
controllers.push(mainController);
|
controllers.push(mainController);
|
||||||
context.subscriptions.push(mainController);
|
context.subscriptions.push(mainController);
|
||||||
|
|
||||||
await mainController.activate();
|
return mainController.activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deactivate(): void {
|
export function deactivate(): void {
|
||||||
|
|||||||
Reference in New Issue
Block a user