提交 6406aa03 编写于 作者: J Johannes Rieken

fix #70602

上级 27af9d12
......@@ -4,9 +4,11 @@
*--------------------------------------------------------------------------------------------*/
import * as strings from 'vs/base/common/strings';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { ICodeEditor, IActiveCodeEditor } from 'vs/editor/browser/editorBrowser';
import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
import { CancellationTokenSource } from 'vs/base/common/cancellation';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
export const enum CodeEditorStateFlag {
Value = 1,
......@@ -71,6 +73,35 @@ export class EditorState {
}
}
export class EditorStateCancellationTokenSource extends CancellationTokenSource {
private readonly _listener: IDisposable[] = [];
constructor(readonly editor: IActiveCodeEditor, flags: CodeEditorStateFlag) {
super();
if (flags & CodeEditorStateFlag.Position) {
this._listener.push(editor.onDidChangeCursorPosition(_ => this.cancel()));
}
if (flags & CodeEditorStateFlag.Selection) {
this._listener.push(editor.onDidChangeCursorSelection(_ => this.cancel()));
}
if (flags & CodeEditorStateFlag.Scroll) {
this._listener.push(editor.onDidScrollChange(_ => this.cancel()));
}
if (flags & CodeEditorStateFlag.Value) {
this._listener.push(editor.onDidChangeModel(_ => this.cancel()));
this._listener.push(editor.onDidChangeModelContent(_ => this.cancel()));
}
}
dispose() {
dispose(this._listener);
super.dispose();
}
}
export class StableEditorScrollState {
public static capture(editor: ICodeEditor): StableEditorScrollState {
......
......@@ -28,6 +28,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
import { IProgressService } from 'vs/platform/progress/common/progress';
import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition } from './goToDefinition';
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { EditorStateCancellationTokenSource, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState';
export class DefinitionActionConfig {
......@@ -61,9 +62,11 @@ export class DefinitionAction extends EditorAction {
const model = editor.getModel();
const pos = editor.getPosition();
const definitionPromise = this._getTargetLocationForPosition(model, pos, CancellationToken.None).then(async references => {
const cts = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Position);
if (model.isDisposed() || editor.getModel() !== model) {
const definitionPromise = this._getTargetLocationForPosition(model, pos, cts.token).then(async references => {
if (cts.token.isCancellationRequested || model.isDisposed() || editor.getModel() !== model) {
// new model, no more model
return;
}
......@@ -105,6 +108,8 @@ export class DefinitionAction extends EditorAction {
}, (err) => {
// report an error
notificationService.error(err);
}).finally(() => {
cts.dispose();
});
progressService.showWhile(definitionPromise, 250);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册