Skip to content

Commit 6406aa0

Browse files
committed
1 parent 27af9d1 commit 6406aa0

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

src/vs/editor/browser/core/editorState.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as strings from 'vs/base/common/strings';
7-
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
7+
import { ICodeEditor, IActiveCodeEditor } from 'vs/editor/browser/editorBrowser';
88
import { Position } from 'vs/editor/common/core/position';
99
import { Range } from 'vs/editor/common/core/range';
10+
import { CancellationTokenSource } from 'vs/base/common/cancellation';
11+
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
1012

1113
export const enum CodeEditorStateFlag {
1214
Value = 1,
@@ -71,6 +73,35 @@ export class EditorState {
7173
}
7274
}
7375

76+
77+
export class EditorStateCancellationTokenSource extends CancellationTokenSource {
78+
79+
private readonly _listener: IDisposable[] = [];
80+
81+
constructor(readonly editor: IActiveCodeEditor, flags: CodeEditorStateFlag) {
82+
super();
83+
84+
if (flags & CodeEditorStateFlag.Position) {
85+
this._listener.push(editor.onDidChangeCursorPosition(_ => this.cancel()));
86+
}
87+
if (flags & CodeEditorStateFlag.Selection) {
88+
this._listener.push(editor.onDidChangeCursorSelection(_ => this.cancel()));
89+
}
90+
if (flags & CodeEditorStateFlag.Scroll) {
91+
this._listener.push(editor.onDidScrollChange(_ => this.cancel()));
92+
}
93+
if (flags & CodeEditorStateFlag.Value) {
94+
this._listener.push(editor.onDidChangeModel(_ => this.cancel()));
95+
this._listener.push(editor.onDidChangeModelContent(_ => this.cancel()));
96+
}
97+
}
98+
99+
dispose() {
100+
dispose(this._listener);
101+
super.dispose();
102+
}
103+
}
104+
74105
export class StableEditorScrollState {
75106

76107
public static capture(editor: ICodeEditor): StableEditorScrollState {

src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
2828
import { IProgressService } from 'vs/platform/progress/common/progress';
2929
import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition } from './goToDefinition';
3030
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
31+
import { EditorStateCancellationTokenSource, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState';
3132

3233
export class DefinitionActionConfig {
3334

@@ -61,9 +62,11 @@ export class DefinitionAction extends EditorAction {
6162
const model = editor.getModel();
6263
const pos = editor.getPosition();
6364

64-
const definitionPromise = this._getTargetLocationForPosition(model, pos, CancellationToken.None).then(async references => {
65+
const cts = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Position);
6566

66-
if (model.isDisposed() || editor.getModel() !== model) {
67+
const definitionPromise = this._getTargetLocationForPosition(model, pos, cts.token).then(async references => {
68+
69+
if (cts.token.isCancellationRequested || model.isDisposed() || editor.getModel() !== model) {
6770
// new model, no more model
6871
return;
6972
}
@@ -105,6 +108,8 @@ export class DefinitionAction extends EditorAction {
105108
}, (err) => {
106109
// report an error
107110
notificationService.error(err);
111+
}).finally(() => {
112+
cts.dispose();
108113
});
109114

110115
progressService.showWhile(definitionPromise, 250);

0 commit comments

Comments
 (0)