Skip to content

Commit 719f40a

Browse files
committed
microsoft#14841 Complete test coverage for extensionsWorkbenchService
1 parent 62b261e commit 719f40a

5 files changed

Lines changed: 508 additions & 36 deletions

File tree

src/vs/platform/extensionManagement/common/extensionEnablementService.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle';
1111
import { IExtensionManagementService, DidUninstallExtensionEvent, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement';
1212
import { IWorkspaceContextService, IWorkspace } from 'vs/platform/workspace/common/workspace';
1313
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
14-
import { IMessageService } from 'vs/platform/message/common/message';
1514
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1615

1716
const DISABLED_EXTENSIONS_STORAGE_PATH = 'extensions/disabled';
@@ -29,7 +28,6 @@ export class ExtensionEnablementService implements IExtensionEnablementService {
2928
constructor(
3029
@IStorageService private storageService: IStorageService,
3130
@IWorkspaceContextService contextService: IWorkspaceContextService,
32-
@IMessageService private messageService: IMessageService,
3331
@IEnvironmentService private environmentService: IEnvironmentService,
3432
@IExtensionManagementService private extensionManagementService: IExtensionManagementService
3533
) {

src/vs/test/utils/instantiationTestUtils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ export class TestInstantiationService extends InstantiationService {
5454
this._servciesMap.set(IKeybindingService, WorkbenchKeybindingService);
5555
}
5656

57+
public get<T>(service: ServiceIdentifier<T>): T {
58+
return <T>this._serviceCollection.get(service);
59+
}
60+
5761
public mock<T>(service: ServiceIdentifier<T>): T | sinon.SinonMock {
5862
return <T>this._create(service, { mock: true });
5963
}

src/vs/workbench/parts/extensions/browser/dependenciesViewer.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export class DataSource implements IDataSource {
4242
}
4343

4444
public hasChildren(tree: ITree, element: IExtensionDependencies): boolean {
45-
return element.hasDependencies && !this.isSelfAncestor(element);
45+
return element.hasDependencies;
4646
}
4747

4848
public getChildren(tree: ITree, element: IExtensionDependencies): Promise {
@@ -52,17 +52,6 @@ export class DataSource implements IDataSource {
5252
public getParent(tree: ITree, element: IExtensionDependencies): Promise {
5353
return TPromise.as(element.dependent);
5454
}
55-
56-
private isSelfAncestor(element: IExtensionDependencies): boolean {
57-
let ancestor = element.dependent;
58-
while (ancestor !== null) {
59-
if (ancestor.identifier === element.identifier) {
60-
return true;
61-
}
62-
ancestor = ancestor.dependent;
63-
}
64-
return false;
65-
}
6655
}
6756

6857
export class Renderer implements IRenderer {

src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,15 @@ class Extension implements IExtension {
231231

232232
class ExtensionDependencies implements IExtensionDependencies {
233233

234+
private _hasDependencies: boolean = null;
235+
234236
constructor(private _extension: IExtension, private _identifier: string, private _map: Map<string, IExtension>, private _dependent: IExtensionDependencies = null) { }
235237

236238
get hasDependencies(): boolean {
237-
return this._extension ? this._extension.dependencies.length > 0 : false;
239+
if (this._hasDependencies === null) {
240+
this._hasDependencies = this.computeHasDependencies();
241+
}
242+
return this._hasDependencies;
238243
}
239244

240245
get extension(): IExtension {
@@ -250,8 +255,25 @@ class ExtensionDependencies implements IExtensionDependencies {
250255
}
251256

252257
get dependencies(): IExtensionDependencies[] {
258+
if (!this.hasDependencies) {
259+
return [];
260+
}
253261
return this._extension.dependencies.map(d => new ExtensionDependencies(this._map.get(d), d, this._map, this));
254262
}
263+
264+
private computeHasDependencies(): boolean {
265+
if (this._extension && this._extension.dependencies.length > 0) {
266+
let dependent = this._dependent;
267+
while (dependent !== null) {
268+
if (dependent.identifier === this.identifier) {
269+
return false;
270+
}
271+
dependent = dependent.dependent;
272+
}
273+
return true;
274+
}
275+
return false;
276+
}
255277
}
256278

257279
function stripVersion(id: string): string {
@@ -480,9 +502,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
480502
return TPromise.wrap(null);
481503
}
482504

483-
return this.doSetEnablement(extension, enable, workspace).then(reload => {
505+
return this.extensionEnablementService.setEnablement(extension.identifier, enable, workspace).then(reload => {
484506
this.telemetryService.publicLog(enable ? 'extension:enable' : 'extension:disable', extension.telemetryData);
485-
this._onChange.fire();
486507
});
487508
}
488509

@@ -501,19 +522,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
501522
return this.extensionService.uninstall(local);
502523
}
503524

504-
private doSetEnablement(extension: IExtension, enable: boolean, workspace: boolean): TPromise<boolean> {
505-
if (workspace) {
506-
return this.extensionEnablementService.setEnablement(extension.identifier, enable, workspace);
507-
}
508-
509-
const globalElablement = this.extensionEnablementService.setEnablement(extension.identifier, enable, false);
510-
if (!this.workspaceContextService.getWorkspace()) {
511-
return globalElablement;
512-
}
513-
return TPromise.join([globalElablement, this.extensionEnablementService.setEnablement(extension.identifier, enable, true)])
514-
.then(values => values[0] || values[1]);
515-
}
516-
517525
private onInstallExtension(event: InstallExtensionEvent): void {
518526
const { id, gallery } = event;
519527

@@ -608,6 +616,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
608616
const workspaceDisabledExtensions = this.extensionEnablementService.getWorkspaceDisabledExtensions();
609617
extension.disabledGlobally = globallyDisabledExtensions.indexOf(extension.identifier) !== -1;
610618
extension.disabledForWorkspace = workspaceDisabledExtensions.indexOf(extension.identifier) !== -1;
619+
this._onChange.fire();
611620
}
612621
}
613622

0 commit comments

Comments
 (0)