From c16d569a329e628538fc7c0de2f2d144196d4b47 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 22 Jan 2019 20:01:56 +0100 Subject: [PATCH] Add IInitData.resolvedExtensions --- src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../api/node/extHostExtensionActivator.ts | 15 ++++++++++++--- .../workbench/api/node/extHostExtensionService.ts | 2 +- .../extensions/electron-browser/extensionHost.ts | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index da87c79aaf5..7935656d6ba 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -66,6 +66,7 @@ export interface IInitData { parentPid: number; environment: IEnvironment; workspace: IWorkspaceData; + resolvedExtensions: ExtensionIdentifier[]; extensions: IExtensionDescription[]; telemetryInfo: ITelemetryInfo; logLevel: LogLevel; diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index f5f6222ef99..a21a307e7b9 100644 --- a/src/vs/workbench/api/node/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/node/extHostExtensionActivator.ts @@ -191,6 +191,7 @@ export type ExtensionActivationReason = ExtensionActivatedByEvent | ExtensionAct export class ExtensionsActivator { private readonly _registry: ExtensionDescriptionRegistry; + private readonly _resolvedExtensionsSet: Set; private readonly _host: IExtensionsActivatorHost; private readonly _activatingExtensions: Map>; private readonly _activatedExtensions: Map; @@ -199,8 +200,10 @@ export class ExtensionsActivator { */ private readonly _alreadyActivatedEvents: { [activationEvent: string]: boolean; }; - constructor(registry: ExtensionDescriptionRegistry, host: IExtensionsActivatorHost) { + constructor(registry: ExtensionDescriptionRegistry, resolvedExtensions: ExtensionIdentifier[], host: IExtensionsActivatorHost) { this._registry = registry; + this._resolvedExtensionsSet = new Set(); + resolvedExtensions.forEach((extensionId) => this._resolvedExtensionsSet.add(ExtensionIdentifier.toKey(extensionId))); this._host = host; this._activatingExtensions = new Map>(); this._activatedExtensions = new Map(); @@ -251,8 +254,14 @@ export class ExtensionsActivator { let currentExtensionGetsGreenLight = true; for (let j = 0, lenJ = depIds.length; j < lenJ; j++) { - let depId = depIds[j]; - let depDesc = this._registry.getExtensionDescription(depId); + const depId = depIds[j]; + + if (this._resolvedExtensionsSet.has(ExtensionIdentifier.toKey(depId))) { + // This dependency is already resolved + continue; + } + + const depDesc = this._registry.getExtensionDescription(depId); if (!depDesc) { // Error condition 1: unknown dependency diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 60d464dc504..41dd9ad1fc9 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -192,7 +192,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._registry = new ExtensionDescriptionRegistry(initData.extensions); this._storage = new ExtHostStorage(this._extHostContext); this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment); - this._activator = new ExtensionsActivator(this._registry, { + this._activator = new ExtensionsActivator(this._registry, initData.resolvedExtensions, { showMessage: (severity: Severity, message: string): void => { this._mainThreadExtensionsProxy.$localShowMessage(severity, message); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index a0548a72d60..5a6e51c6d3a 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -430,6 +430,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { id: workspace.id, name: this._labelService.getWorkspaceLabel(workspace) }, + resolvedExtensions: [], extensions: extensionDescriptions, telemetryInfo, logLevel: this._logService.getLevel(),