Skip to content

Commit ce729a5

Browse files
authored
use undo-loop instead of undo-edit when discarding chat session (microsoft#184063)
* use undo-loop instead of undo-edit when discarding chat session fixes microsoft/vscode-internalbacklog#4118 * fix tests, wait for correct state
1 parent 402b28f commit ce729a5

File tree

4 files changed

+15
-32
lines changed

4 files changed

+15
-32
lines changed

src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorSession.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri';
88
import { Event } from 'vs/base/common/event';
99
import { ResourceEdit, ResourceFileEdit, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService';
1010
import { TextEdit } from 'vs/editor/common/languages';
11-
import { ITextModel, ITextSnapshot } from 'vs/editor/common/model';
11+
import { ITextModel } from 'vs/editor/common/model';
1212
import { EditMode, IInteractiveEditorSessionProvider, IInteractiveEditorSession, IInteractiveEditorBulkEditResponse, IInteractiveEditorEditResponse, IInteractiveEditorMessageResponse, IInteractiveEditorResponse, IInteractiveEditorService } from 'vs/workbench/contrib/interactiveEditor/common/interactiveEditor';
1313
import { IRange, Range } from 'vs/editor/common/core/range';
1414
import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser';
@@ -60,12 +60,14 @@ export class Session {
6060
private _lastInput: string | undefined;
6161
private _lastExpansionState: boolean | undefined;
6262
private _lastTextModelChanges: LineRangeMapping[] | undefined;
63-
private _lastSnapshot: ITextSnapshot | undefined;
6463
private _isUnstashed: boolean = false;
6564
private readonly _exchange: SessionExchange[] = [];
6665
private readonly _startTime = new Date();
6766
private readonly _teldata: Partial<TelemetryData>;
6867

68+
readonly textModelNAltVersion: number;
69+
private _textModelNSnapshotAltVersion: number | undefined;
70+
6971
constructor(
7072
readonly editMode: EditMode,
7173
readonly editor: ICodeEditor,
@@ -75,6 +77,7 @@ export class Session {
7577
readonly session: IInteractiveEditorSession,
7678
private readonly _wholeRangeMarkerId: string
7779
) {
80+
this.textModelNAltVersion = textModelN.getAlternativeVersionId();
7881
this._teldata = {
7982
extension: provider.debugName,
8083
startTime: this._startTime.toISOString(),
@@ -109,8 +112,8 @@ export class Session {
109112
this._lastExpansionState = state;
110113
}
111114

112-
get lastSnapshot(): ITextSnapshot | undefined {
113-
return this._lastSnapshot;
115+
get textModelNSnapshotAltVersion(): number | undefined {
116+
return this._textModelNSnapshotAltVersion;
114117
}
115118

116119
get wholeRange(): Range {
@@ -119,7 +122,7 @@ export class Session {
119122
}
120123

121124
createSnapshot(): void {
122-
this._lastSnapshot = this.textModelN.createSnapshot();
125+
this._textModelNSnapshotAltVersion = this.textModelN.getAlternativeVersionId();
123126
}
124127

125128
addExchange(exchange: SessionExchange): void {

src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorStrategies.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag
2424
import { InteractiveEditorFileCreatePreviewWidget, InteractiveEditorLivePreviewWidget } from 'vs/workbench/contrib/interactiveEditor/browser/interactiveEditorLivePreviewWidget';
2525
import { EditResponse, Session } from 'vs/workbench/contrib/interactiveEditor/browser/interactiveEditorSession';
2626
import { InteractiveEditorWidget } from 'vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget';
27-
import { getValueFromSnapshot } from 'vs/workbench/contrib/interactiveEditor/browser/utils';
2827
import { CTX_INTERACTIVE_EDITOR_SHOWING_DIFF, CTX_INTERACTIVE_EDITOR_DOCUMENT_CHANGED } from 'vs/workbench/contrib/interactiveEditor/common/interactiveEditor';
2928
import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
3029

@@ -278,19 +277,13 @@ export class LiveStrategy extends EditModeStrategy {
278277
}
279278

280279
async cancel() {
281-
const { textModelN: modelN, textModel0: model0, lastSnapshot } = this._session;
282-
if (modelN.isDisposed() || (model0.isDisposed() && !lastSnapshot)) {
280+
const { textModelN: modelN, textModelNAltVersion, textModelNSnapshotAltVersion } = this._session;
281+
if (modelN.isDisposed()) {
283282
return;
284283
}
285-
286-
const newText = lastSnapshot
287-
? getValueFromSnapshot(lastSnapshot)
288-
: model0.getValue();
289-
290-
const edits = await this._editorWorkerService.computeMoreMinimalEdits(modelN.uri, [{ range: modelN.getFullModelRange(), text: newText }]);
291-
if (edits) {
292-
const operations = edits.map(e => EditOperation.replace(Range.lift(e.range), e.text));
293-
modelN.pushEditOperations(null, operations, () => null);
284+
const targetAltVersion = textModelNSnapshotAltVersion ?? textModelNAltVersion;
285+
while (targetAltVersion < modelN.getAlternativeVersionId() && modelN.canUndo()) {
286+
modelN.undo();
294287
}
295288
}
296289

src/vs/workbench/contrib/interactiveEditor/browser/utils.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { LineRange } from 'vs/editor/common/core/lineRange';
77
import { Range } from 'vs/editor/common/core/range';
8-
import { ITextModel, ITextSnapshot } from 'vs/editor/common/model';
8+
import { ITextModel } from 'vs/editor/common/model';
99

1010
export function invertLineRange(range: LineRange, model: ITextModel): LineRange[] {
1111
if (range.isEmpty) {
@@ -20,15 +20,3 @@ export function invertLineRange(range: LineRange, model: ITextModel): LineRange[
2020
export function lineRangeAsRange(r: LineRange): Range {
2121
return new Range(r.startLineNumber, 1, r.endLineNumberExclusive - 1, 1);
2222
}
23-
24-
export function getValueFromSnapshot(snapshot: ITextSnapshot): string {
25-
let result = '';
26-
while (true) {
27-
const chunk = snapshot.read();
28-
if (chunk === null) {
29-
break;
30-
}
31-
result += chunk;
32-
}
33-
return result;
34-
}

src/vs/workbench/contrib/interactiveEditor/test/browser/interactiveEditorController.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,8 @@ suite('InteractiveEditorController', function () {
115115
ctrl = instaService.createInstance(TestController, editor);
116116
const run = ctrl.run({ message: 'Hello', autoSend: true });
117117

118-
await Event.toPromise(Event.filter(ctrl.onDidChangeState, e => e === State.SHOW_RESPONSE));
118+
await Event.toPromise(Event.filter(ctrl.onDidChangeState, e => e === State.WAIT_FOR_INPUT));
119119
assert.ok(ctrl.getWidgetPosition() !== undefined);
120-
121120
await ctrl.cancelSession();
122121

123122
await run;

0 commit comments

Comments
 (0)