diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 265977344fad52dc538da2679b1af72ce6fa9554..823416d4c7917d2fe20423405c8b6b21ba31f92b 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -129,7 +129,7 @@ export class Main { extension = path.isAbsolute(extension) ? extension : path.join(process.cwd(), extension); const manifest = await getManifest(extension); - if (this.remote && (!isLanguagePackExtension(manifest) && isUIExtension(manifest, this.configurationService))) { + if (this.remote && (!isLanguagePackExtension(manifest) && isUIExtension(manifest, [], this.configurationService))) { console.log(localize('notSupportedUIExtension', "Can't install extension {0} since UI Extensions are not supported", getBaseLabel(extension))); return null; } @@ -171,7 +171,7 @@ export class Main { } const manifest = await this.extensionGalleryService.getManifest(extension, CancellationToken.None); - if (this.remote && manifest && (!isLanguagePackExtension(manifest) && isUIExtension(manifest, this.configurationService))) { + if (this.remote && manifest && (!isLanguagePackExtension(manifest) && isUIExtension(manifest, [], this.configurationService))) { console.log(localize('notSupportedUIExtension', "Can't install extension {0} since UI Extensions are not supported", extension.identifier.id)); return null; } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index d313ffb74b53428d2b3bbc511759ceb57aee77b3..89f03ab2f10df756bf8044d4cc86cb1d836484ec 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -345,7 +345,7 @@ export class ExtensionManagementService extends Disposable implements IExtension if (this.remote) { const manifest = await this.galleryService.getManifest(extension, CancellationToken.None); - if (manifest && isUIExtension(manifest, this.configurationService) && !isLanguagePackExtension(manifest)) { + if (manifest && isUIExtension(manifest, [], this.configurationService) && !isLanguagePackExtension(manifest)) { return Promise.reject(new Error(nls.localize('notSupportedUIExtension', "Can't install extension {0} since UI Extensions are not supported", extension.identifier.id))); } } @@ -516,7 +516,7 @@ export class ExtensionManagementService extends Disposable implements IExtension return Promise.all(extensionsToInstall.map(async e => { if (this.remote) { const manifest = await this.galleryService.getManifest(e, CancellationToken.None); - if (manifest && isUIExtension(manifest, this.configurationService) && !isLanguagePackExtension(manifest)) { + if (manifest && isUIExtension(manifest, [], this.configurationService) && !isLanguagePackExtension(manifest)) { this.logService.info('Ignored installing the UI dependency', e.identifier.id); return; } diff --git a/src/vs/platform/extensions/node/extensionsUtil.ts b/src/vs/platform/extensions/node/extensionsUtil.ts index 93bd80cb9520cd58e4eb29727cf71674b6eec997..972fe22f9776fbbba221fe3764d0ea617fd31b0d 100644 --- a/src/vs/platform/extensions/node/extensionsUtil.ts +++ b/src/vs/platform/extensions/node/extensionsUtil.ts @@ -9,7 +9,7 @@ import { getGalleryExtensionId, areSameExtensions } from 'vs/platform/extensionM import { isNonEmptyArray } from 'vs/base/common/arrays'; import product from 'vs/platform/product/node/product'; -export function isUIExtension(manifest: IExtensionManifest, configurationService: IConfigurationService): boolean { +export function isUIExtension(manifest: IExtensionManifest, uiContributions: string[], configurationService: IConfigurationService): boolean { const extensionId = getGalleryExtensionId(manifest.publisher, manifest.name); const configuredUIExtensions = configurationService.getValue('_workbench.uiExtensions') || []; if (configuredUIExtensions.length) { @@ -30,8 +30,10 @@ export function isUIExtension(manifest: IExtensionManifest, configurationService if (manifest.main) { return false; } - if (manifest.contributes && isNonEmptyArray(manifest.contributes.debuggers)) { - return false; + if (manifest.contributes) { + if (!uiContributions.length || Object.keys(manifest.contributes).some(contribution => uiContributions.indexOf(contribution) === -1)) { + return false; + } } // Default is UI Extension return true; diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 67c0c41748838ced3625d535359a959d0d3680b3..4b01ab163b558e61441f08256c2acf363843b076 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -35,7 +35,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IFileService } from 'vs/platform/files/common/files'; import { IExtensionManifest, ExtensionType, ExtensionIdentifierWithVersion, IExtension as IPlatformExtension } from 'vs/platform/extensions/common/extensions'; -import { isUIExtension } from 'vs/platform/extensions/node/extensionsUtil'; +import { isUIExtension } from 'vs/workbench/services/extensions/node/extensionsUtil'; interface IExtensionStateProvider { (extension: Extension): T; diff --git a/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts b/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts index c7726330b762d9b418e905261008fa98a239a733..69061ed76c763cdd22a12278bba4228796537809 100644 --- a/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts @@ -19,7 +19,7 @@ import { getManifest } from 'vs/platform/extensionManagement/node/extensionManag import { ILogService } from 'vs/platform/log/common/log'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localize } from 'vs/nls'; -import { isUIExtension } from 'vs/platform/extensions/node/extensionsUtil'; +import { isUIExtension } from 'vs/workbench/services/extensions/node/extensionsUtil'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class MultiExtensionManagementService extends Disposable implements IExtensionManagementService { diff --git a/src/vs/workbench/services/extensions/node/extensionsUtil.ts b/src/vs/workbench/services/extensions/node/extensionsUtil.ts new file mode 100644 index 0000000000000000000000000000000000000000..d37b3f0f7948f2921c8b2be170da596efbb8e87b --- /dev/null +++ b/src/vs/workbench/services/extensions/node/extensionsUtil.ts @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { isUIExtension as _isUIExtension } from 'vs/platform/extensions/node/extensionsUtil'; + +export function isUIExtension(manifest: IExtensionManifest, configurationService: IConfigurationService): boolean { + const uiExtensionPoints = ExtensionsRegistry.getExtensionPoints().filter(e => e.defaultExtensionKind !== 'workspace').map(e => e.name); + return _isUIExtension(manifest, uiExtensionPoints, configurationService); +}