@@ -231,10 +231,15 @@ class Extension implements IExtension {
231231
232232class ExtensionDependencies implements IExtensionDependencies {
233233
234+ private _hasDependencies : boolean = null ;
235+
234236 constructor ( private _extension : IExtension , private _identifier : string , private _map : Map < string , IExtension > , private _dependent : IExtensionDependencies = null ) { }
235237
236238 get hasDependencies ( ) : boolean {
237- return this . _extension ? this . _extension . dependencies . length > 0 : false ;
239+ if ( this . _hasDependencies === null ) {
240+ this . _hasDependencies = this . computeHasDependencies ( ) ;
241+ }
242+ return this . _hasDependencies ;
238243 }
239244
240245 get extension ( ) : IExtension {
@@ -250,8 +255,25 @@ class ExtensionDependencies implements IExtensionDependencies {
250255 }
251256
252257 get dependencies ( ) : IExtensionDependencies [ ] {
258+ if ( ! this . hasDependencies ) {
259+ return [ ] ;
260+ }
253261 return this . _extension . dependencies . map ( d => new ExtensionDependencies ( this . _map . get ( d ) , d , this . _map , this ) ) ;
254262 }
263+
264+ private computeHasDependencies ( ) : boolean {
265+ if ( this . _extension && this . _extension . dependencies . length > 0 ) {
266+ let dependent = this . _dependent ;
267+ while ( dependent !== null ) {
268+ if ( dependent . identifier === this . identifier ) {
269+ return false ;
270+ }
271+ dependent = dependent . dependent ;
272+ }
273+ return true ;
274+ }
275+ return false ;
276+ }
255277}
256278
257279function stripVersion ( id : string ) : string {
@@ -480,9 +502,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
480502 return TPromise . wrap ( null ) ;
481503 }
482504
483- return this . doSetEnablement ( extension , enable , workspace ) . then ( reload => {
505+ return this . extensionEnablementService . setEnablement ( extension . identifier , enable , workspace ) . then ( reload => {
484506 this . telemetryService . publicLog ( enable ? 'extension:enable' : 'extension:disable' , extension . telemetryData ) ;
485- this . _onChange . fire ( ) ;
486507 } ) ;
487508 }
488509
@@ -501,19 +522,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
501522 return this . extensionService . uninstall ( local ) ;
502523 }
503524
504- private doSetEnablement ( extension : IExtension , enable : boolean , workspace : boolean ) : TPromise < boolean > {
505- if ( workspace ) {
506- return this . extensionEnablementService . setEnablement ( extension . identifier , enable , workspace ) ;
507- }
508-
509- const globalElablement = this . extensionEnablementService . setEnablement ( extension . identifier , enable , false ) ;
510- if ( ! this . workspaceContextService . getWorkspace ( ) ) {
511- return globalElablement ;
512- }
513- return TPromise . join ( [ globalElablement , this . extensionEnablementService . setEnablement ( extension . identifier , enable , true ) ] )
514- . then ( values => values [ 0 ] || values [ 1 ] ) ;
515- }
516-
517525 private onInstallExtension ( event : InstallExtensionEvent ) : void {
518526 const { id, gallery } = event ;
519527
@@ -608,6 +616,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
608616 const workspaceDisabledExtensions = this . extensionEnablementService . getWorkspaceDisabledExtensions ( ) ;
609617 extension . disabledGlobally = globallyDisabledExtensions . indexOf ( extension . identifier ) !== - 1 ;
610618 extension . disabledForWorkspace = workspaceDisabledExtensions . indexOf ( extension . identifier ) !== - 1 ;
619+ this . _onChange . fire ( ) ;
611620 }
612621 }
613622
0 commit comments