Skip to content

Commit dcf5b38

Browse files
committed
1 parent 53e72ac commit dcf5b38

2 files changed

Lines changed: 497 additions & 6 deletions

File tree

src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import { IProductService } from 'vs/platform/product/common/productService';
3939
import { asDomUri } from 'vs/base/browser/dom';
4040
import { getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge';
4141
import { isWeb } from 'vs/base/common/platform';
42+
import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil';
4243

4344
interface IExtensionStateProvider<T> {
4445
(extension: Extension): T;
@@ -665,14 +666,79 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
665666
if (extensions.length === 1) {
666667
return extensions[0];
667668
}
669+
668670
const enabledExtensions = extensions.filter(e => e.local && this.extensionEnablementService.isEnabled(e.local));
669-
if (enabledExtensions.length === 0) {
670-
return extensions[0];
671-
}
672671
if (enabledExtensions.length === 1) {
673672
return enabledExtensions[0];
674673
}
675-
return enabledExtensions.find(e => e.server === this.extensionManagementServerService.remoteExtensionManagementServer) || enabledExtensions[0];
674+
675+
const extensionsToChoose = enabledExtensions.length ? enabledExtensions : extensions;
676+
677+
let extension = extensionsToChoose.find(extension => {
678+
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
679+
switch (extensionKind) {
680+
case 'ui':
681+
/* UI extension is chosen only if it is installed locally */
682+
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
683+
return true;
684+
}
685+
return false;
686+
case 'workspace':
687+
/* Choose remote workspace extension if exists */
688+
if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
689+
return true;
690+
}
691+
return false;
692+
case 'web':
693+
/* Choose web extension if exists */
694+
if (extension.server === this.extensionManagementServerService.webExtensionManagementServer) {
695+
return true;
696+
}
697+
return false;
698+
}
699+
}
700+
return false;
701+
});
702+
703+
if (!extension && this.extensionManagementServerService.localExtensionManagementServer) {
704+
extension = extensionsToChoose.find(extension => {
705+
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
706+
switch (extensionKind) {
707+
case 'workspace':
708+
/* Choose local workspace extension if exists */
709+
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
710+
return true;
711+
}
712+
return false;
713+
case 'web':
714+
/* Choose local web extension if exists */
715+
if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
716+
return true;
717+
}
718+
return false;
719+
}
720+
}
721+
return false;
722+
});
723+
}
724+
725+
if (!extension && this.extensionManagementServerService.remoteExtensionManagementServer) {
726+
extension = extensionsToChoose.find(extension => {
727+
for (const extensionKind of getExtensionKind(extension.local!.manifest, this.productService, this.configurationService)) {
728+
switch (extensionKind) {
729+
case 'web':
730+
/* Choose remote web extension if exists */
731+
if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
732+
return true;
733+
}
734+
return false;
735+
}
736+
}
737+
return false;
738+
});
739+
}
740+
741+
return extension || extensions[0];
676742
}
677743

678744
private fromGallery(gallery: IGalleryExtension, maliciousExtensionSet: Set<string>): IExtension {

0 commit comments

Comments
 (0)