fix the extension dependency issue (#12347)

This commit is contained in:
Alan Ren
2020-09-18 09:49:18 -07:00
committed by GitHub
parent 2162e2f50c
commit 54b5390d03
6 changed files with 19 additions and 55 deletions

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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 {
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<T>(configurationName: string): T {

View File

@@ -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');
});
});