@@ -39,6 +39,7 @@ import { IProductService } from 'vs/platform/product/common/productService';
3939import { asDomUri } from 'vs/base/browser/dom' ;
4040import { getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge' ;
4141import { isWeb } from 'vs/base/common/platform' ;
42+ import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil' ;
4243
4344interface 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