Skip to content

Commit

Permalink
dispose code lens model(s) only after having resolved the current mod…
Browse files Browse the repository at this point in the history
…el, #75105
  • Loading branch information
jrieken committed Jun 13, 2019
1 parent b8e43cc commit 37518ca
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions src/vs/editor/contrib/codelens/codelensController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -28,7 +28,8 @@ export class CodeLensContribution implements editorCommon.IEditorContribution {
private readonly _localToDispose = new DisposableStore();
private _lenses: CodeLensWidget[] = [];
private _currentFindCodeLensSymbolsPromise: CancelablePromise<CodeLensModel> | undefined;
private readonly _currentCodeLensModel = new MutableDisposable<CodeLensModel>();
private _oldCodeLensModels = new DisposableStore();
private _currentCodeLensModel: CodeLensModel | undefined;
private _modelChangeCounter: number = 0;
private _currentResolveCodeLensSymbolsPromise: CancelablePromise<any> | undefined;
private _detectVisibleLenses: RunOnceScheduler;
Expand Down Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
});
}
Expand Down

0 comments on commit 37518ca

Please sign in to comment.