From 2042dfa0d9f4a988f1acf3e6dbf2be4657b70bbb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Sep 2018 21:35:23 +0200 Subject: [PATCH] Fix #58775 --- .../api/node/extHostExtensionActivator.ts | 4 ++-- .../node/extensionsWorkbenchService.ts | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index 5218f66cda6..5481faf0e3e 100644 --- a/src/vs/workbench/api/node/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/node/extHostExtensionActivator.ts @@ -244,7 +244,7 @@ export class ExtensionsActivator { if (!depDesc) { // Error condition 1: unknown dependency - this._host.showMessage(Severity.Error, nls.localize('unknownDep', "Extension '{1}' failed to activate. Reason: unknown dependency '{0}'.", depId, currentExtension.id)); + this._host.showMessage(Severity.Error, nls.localize('unknownDep', "Cannot activate extension '{0}' as the depending extension '{1}' is not found. Please install or enable the depending extension and reload the window.", currentExtension.displayName || currentExtension.id, depId)); const error = new Error(`Unknown dependency '${depId}'`); this._activatedExtensions[currentExtension.id] = new FailedExtension(error); return; @@ -254,7 +254,7 @@ export class ExtensionsActivator { let dep = this._activatedExtensions[depId]; if (dep.activationFailed) { // Error condition 2: a dependency has already failed activation - this._host.showMessage(Severity.Error, nls.localize('failedDep1', "Extension '{1}' failed to activate. Reason: dependency '{0}' failed to activate.", depId, currentExtension.id)); + this._host.showMessage(Severity.Error, nls.localize('failedDep1', "Cannot activate extension '{0}' as the depending extension '{1}' is failed to activate.", currentExtension.displayName || currentExtension.id, depId)); const error = new Error(`Dependency ${depId} failed to activate`); (error).detail = dep.activationFailedError; this._activatedExtensions[currentExtension.id] = new FailedExtension(error); diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 28e53bddc82..b4ab2011a43 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -672,7 +672,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, location: ProgressLocation.Extensions, title: nls.localize('installingVSIXExtension', 'Installing extension from VSIX...'), source: `${extension}` - }, () => this.extensionService.install(URI.file(extension)).then(() => null)); + }, () => this.extensionService.install(URI.file(extension)).then(extensionIdentifier => this.checkAndEnableDisabledDependencies(extensionIdentifier))); } if (!(extension instanceof Extension)) { @@ -694,7 +694,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, location: ProgressLocation.Extensions, title: nls.localize('installingMarketPlaceExtension', 'Installing extension from Marketplace....'), source: `${extension.id}` - }, () => this.extensionService.installFromGallery(gallery)); + }, () => this.extensionService.installFromGallery(gallery).then(() => this.checkAndEnableDisabledDependencies(gallery.identifier))); } setEnablement(extensions: IExtension | IExtension[], enablementState: EnablementState): TPromise { @@ -740,6 +740,17 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, }, () => TPromise.join(toReinstall.map(local => this.extensionService.reinstallFromGallery(local))).then(() => null)); } + private checkAndEnableDisabledDependencies(extensionIdentifier: IExtensionIdentifier): TPromise { + const extension = this.local.filter(e => areSameExtensions(extensionIdentifier, e.local.identifier))[0]; + if (extension) { + const disabledDepencies = this.getExtensionsRecursively([extension], this.local, EnablementState.Enabled, { dependencies: true, pack: false }); + if (disabledDepencies.length) { + return this.setEnablement(disabledDepencies, EnablementState.Enabled); + } + } + return TPromise.as(null); + } + private promptAndSetEnablement(extensions: IExtension[], enablementState: EnablementState): TPromise { const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled; if (enable) { @@ -759,7 +770,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled; if (!enable) { for (const extension of extensions) { - let dependents = this.getDependentsAfterDisablement(extension, allExtensions, this.local, enablementState); + let dependents = this.getDependentsAfterDisablement(extension, allExtensions, this.local); if (dependents.length) { return TPromise.wrapError(new Error(this.getDependentsErrorMessage(extension, allExtensions, dependents))); } @@ -797,7 +808,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, return []; } - private getDependentsAfterDisablement(extension: IExtension, extensionsToDisable: IExtension[], installed: IExtension[], enablementState: EnablementState): IExtension[] { + private getDependentsAfterDisablement(extension: IExtension, extensionsToDisable: IExtension[], installed: IExtension[]): IExtension[] { return installed.filter(i => { if (i.dependencies.length === 0) { return false; -- GitLab