diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index d153ab11cf370580d926ebc55b8ffea107fe352f..f49ecdddc20ac36ce145b1f9f838213ead39a383 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -230,30 +230,19 @@ class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { class DecorationProviderWrapper { readonly data = TernarySearchTree.forPaths | IDecorationData>(); - private readonly _dispoable: IDisposable; + + private _listener: IDisposable; constructor( private readonly _provider: IDecorationsProvider, private readonly _uriEmitter: Emitter, private readonly _flushEmitter: Emitter ) { - this._dispoable = this._provider.onDidChange(uris => { - if (!uris) { - // flush event -> drop all data, can affect everything - this.data.clear(); - this._flushEmitter.fire({ affectsResource() { return true; } }); - - } else { - // selective changes -> drop for resource, fetch again, send event - for (const uri of uris) { - this._fetchData(uri); - } - } - }); + // } dispose(): void { - this._dispoable.dispose(); + this._listener.dispose(); this.data.clear(); } @@ -294,7 +283,11 @@ class DecorationProviderWrapper { } private _fetchData(uri: URI): IDecorationData { + // listen to provider changes only after + // we have asked it for data... + this._ensureIsListening(); + // retrieve data, do the dance const dataOrThenable = this._provider.provideDecorations(uri); if (!isThenable(dataOrThenable)) { // sync -> we have a result now @@ -320,6 +313,24 @@ class DecorationProviderWrapper { } return deco; } + + private _ensureIsListening(): void { + if (!this._listener) { + this._listener = this._provider.onDidChange(uris => { + if (!uris) { + // flush event -> drop all data, can affect everything + this.data.clear(); + this._flushEmitter.fire({ affectsResource() { return true; } }); + + } else { + // selective changes -> drop for resource, fetch again, send event + for (const uri of uris) { + this._fetchData(uri); + } + } + }); + } + } } export class FileDecorationsService implements IDecorationsService {