diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index 27b9955d08a598816ca6b3ba0964e1ad2573e283..9f36b69170538cf14ac4952cde122f05595d0433 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -5,7 +5,7 @@ import { CancelablePromise, RunOnceScheduler, createCancelablePromise, disposableTimeout } from 'vs/base/common/async'; import { onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; -import { toDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -28,7 +28,8 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { private readonly _localToDispose = new DisposableStore(); private _lenses: CodeLensWidget[] = []; private _currentFindCodeLensSymbolsPromise: CancelablePromise | undefined; - private readonly _currentCodeLensModel = new MutableDisposable(); + private _oldCodeLensModels = new DisposableStore(); + private _currentCodeLensModel: CodeLensModel | undefined; private _modelChangeCounter: number = 0; private _currentResolveCodeLensSymbolsPromise: CancelablePromise | undefined; private _detectVisibleLenses: RunOnceScheduler; @@ -57,7 +58,8 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { dispose(): void { this._localDispose(); this._globalToDispose.dispose(); - this._currentCodeLensModel.dispose(); + this._oldCodeLensModels.dispose(); + dispose(this._currentCodeLensModel); } private _localDispose(): void { @@ -71,7 +73,8 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._currentResolveCodeLensSymbolsPromise = undefined; } this._localToDispose.clear(); - this._currentCodeLensModel.clear(); + this._oldCodeLensModels.clear(); + dispose(this._currentCodeLensModel); } getId(): string { @@ -132,7 +135,10 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._currentFindCodeLensSymbolsPromise.then(result => { if (counterValue === this._modelChangeCounter) { // only the last one wins - this._currentCodeLensModel.value = result; + if (this._currentCodeLensModel) { + this._oldCodeLensModels.add(this._currentCodeLensModel); + } + this._currentCodeLensModel = result; // cache model to reduce flicker this._codeLensCache.put(model, result); @@ -342,16 +348,20 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { }); return Promise.all(promises).then(() => { - lenses[i].updateCommands(resolvedSymbols); + if (!token.isCancellationRequested) { + lenses[i].updateCommands(resolvedSymbols); + } }); }); return Promise.all(promises); }); - this._currentResolveCodeLensSymbolsPromise.catch(err => { - onUnexpectedError(err); - }).finally(() => { + this._currentResolveCodeLensSymbolsPromise.then(() => { + this._oldCodeLensModels.clear(); // dispose old models once we have updated the UI with the current model + this._currentResolveCodeLensSymbolsPromise = undefined; + }, err => { + onUnexpectedError(err); // can also be cancellation! this._currentResolveCodeLensSymbolsPromise = undefined; }); }