@@ -147,7 +147,11 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
147
147
throw new Error ( localize ( 'cannot change enablement environment' , "Cannot change enablement of {0} extension because it is enabled in environment" , extension . manifest . displayName || extension . identifier . id ) ) ;
148
148
}
149
149
150
- switch ( this . getEnablementState ( extension ) ) {
150
+ this . throwErrorIfEnablementStateCannotBeChanged ( extension , this . getEnablementState ( extension ) , donotCheckDependencies ) ;
151
+ }
152
+
153
+ private throwErrorIfEnablementStateCannotBeChanged ( extension : IExtension , enablementStateOfExtension : EnablementState , donotCheckDependencies ?: boolean ) : void {
154
+ switch ( enablementStateOfExtension ) {
151
155
case EnablementState . DisabledByEnvironment :
152
156
throw new Error ( localize ( 'cannot change disablement environment' , "Cannot change enablement of {0} extension because it is disabled in environment" , extension . manifest . displayName || extension . identifier . id ) ) ;
153
157
case EnablementState . DisabledByVirtualWorkspace :
@@ -219,30 +223,60 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
219
223
}
220
224
221
225
private getExtensionsToEnableRecursively ( extensions : IExtension [ ] , allExtensions : ReadonlyArray < IExtension > , enablementState : EnablementState , options : { dependencies : boolean ; pack : boolean } , checked : IExtension [ ] = [ ] ) : IExtension [ ] {
226
+ if ( ! options . dependencies && ! options . pack ) {
227
+ return [ ] ;
228
+ }
229
+
222
230
const toCheck = extensions . filter ( e => checked . indexOf ( e ) === - 1 ) ;
223
- if ( toCheck . length ) {
224
- for ( const extension of toCheck ) {
225
- checked . push ( extension ) ;
231
+ if ( ! toCheck . length ) {
232
+ return [ ] ;
233
+ }
234
+
235
+ for ( const extension of toCheck ) {
236
+ checked . push ( extension ) ;
237
+ }
238
+
239
+ const extensionsToDisable : IExtension [ ] = [ ] ;
240
+ for ( const extension of allExtensions ) {
241
+ // Extension is already checked
242
+ if ( checked . some ( e => areSameExtensions ( e . identifier , extension . identifier ) ) ) {
243
+ continue ;
226
244
}
227
- const extensionsToDisable = allExtensions . filter ( i => {
228
- if ( checked . indexOf ( i ) !== - 1 ) {
229
- return false ;
245
+
246
+ const enablementStateOfExtension = this . getEnablementState ( extension ) ;
247
+ // Extension enablement state is same as the end enablement state
248
+ if ( enablementStateOfExtension === enablementState ) {
249
+ continue ;
250
+ }
251
+
252
+ // Check if the extension is a dependency or in extension pack
253
+ if ( extensions . some ( e =>
254
+ ( options . dependencies && e . manifest . extensionDependencies ?. some ( id => areSameExtensions ( { id } , extension . identifier ) ) )
255
+ || ( options . pack && e . manifest . extensionPack ?. some ( id => areSameExtensions ( { id } , extension . identifier ) ) ) ) ) {
256
+
257
+ const index = extensionsToDisable . findIndex ( e => areSameExtensions ( e . identifier , extension . identifier ) ) ;
258
+
259
+ // Extension is not aded to the disablement list so add it
260
+ if ( index === - 1 ) {
261
+ extensionsToDisable . push ( extension ) ;
230
262
}
231
- if ( this . getEnablementState ( i ) === enablementState ) {
232
- return false ;
263
+
264
+ // Extension is there already in the disablement list.
265
+ else {
266
+ try {
267
+ // Replace only if the enablement state can be changed
268
+ this . throwErrorIfEnablementStateCannotBeChanged ( extension , enablementStateOfExtension , true ) ;
269
+ extensionsToDisable . splice ( index , 1 , extension ) ;
270
+ } catch ( error ) { /*Do not add*/ }
233
271
}
234
- return ( options . dependencies || options . pack )
235
- && extensions . some ( extension =>
236
- ( options . dependencies && extension . manifest . extensionDependencies ?. some ( id => areSameExtensions ( { id } , i . identifier ) ) )
237
- || ( options . pack && extension . manifest . extensionPack ?. some ( id => areSameExtensions ( { id } , i . identifier ) ) )
238
- ) ;
239
- } ) ;
240
- if ( extensionsToDisable . length ) {
241
- extensionsToDisable . push ( ...this . getExtensionsToEnableRecursively ( extensionsToDisable , allExtensions , enablementState , options , checked ) ) ;
242
272
}
243
- return extensionsToDisable ;
244
273
}
245
- return [ ] ;
274
+
275
+ if ( extensionsToDisable . length ) {
276
+ extensionsToDisable . push ( ...this . getExtensionsToEnableRecursively ( extensionsToDisable , allExtensions , enablementState , options , checked ) ) ;
277
+ }
278
+
279
+ return extensionsToDisable ;
246
280
}
247
281
248
282
private _setUserEnablementState ( extension : IExtension , newState : EnablementState ) : Promise < boolean > {
0 commit comments