提交 37518cae 编写于 作者: J Johannes Rieken

dispose code lens model(s) only after having resolved the current model, #75105

上级 b8e43cc7
......@@ -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<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;
......@@ -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;
});
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册