From ec3d27377668a733aa3bfd9036b1cb7b554ed91a Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 23 Oct 2024 12:24:36 +0200 Subject: [PATCH] fixes https://github.com/microsoft/vscode-copilot/issues/9621 --- .../chatEditingModifiedFileEntry.ts | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts index 868ee357e9fe9..47ed3c0fb8610 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts @@ -195,9 +195,10 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie const diff = this._diffInfo.get(); const edits: IIdentifiedSingleEditOperation[] = []; + let isOverlapping = false; + for (const edit of event.changes) { - let isOverlapping = false; let changeDelta = 0; for (const change of diff.changes) { @@ -220,8 +221,8 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie } if (isOverlapping) { - // change overlapping with AI change aren't mirrored - continue; + // change overlapping with AI change isn't mirrored + break; } const offset = edit.rangeOffset - changeDelta; @@ -230,7 +231,10 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie edits.push(EditOperation.replace(Range.fromPositions(start, end), edit.text)); } - this.docSnapshot.applyEdits(edits); + if (!isOverlapping) { + this.docSnapshot.applyEdits(edits); + } + this._updateDiffInfoSeq(true); } acceptAgentEdits(textEdits: TextEdit[]): void { @@ -270,15 +274,21 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie } // trigger diff computation but only at first, when done, or when last + this._updateDiffInfoSeq(false); + } + + private _updateDiffInfoSeq(fast: boolean) { const myDiffOperationId = ++this._diffOperationIds; Promise.resolve(this._diffOperation).then(() => { if (this._diffOperationIds === myDiffOperationId) { - this._diffOperation = this._updateDiffInfo(); + this._diffOperation = this._updateDiffInfo(fast); } }); } - private async _updateDiffInfo(): Promise { + private async _updateDiffInfo(fast: boolean): Promise { + + const versionIdNow = this.doc.getVersionId(); const [diff] = await Promise.all([ this._editorWorkerService.computeDiff( @@ -287,10 +297,13 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie { computeMoves: true, ignoreTrimWhitespace: false, maxComputationTimeMs: 3000 }, 'advanced' ), - timeout(800) // DON't diff too fast + timeout(fast ? 50 : 800) // DON't diff too fast ]); - this._diffInfo.set(diff ?? nullDocumentDiff, undefined); + // only update the diff if the document didn't change in the meantime + if (this.doc.getVersionId() === versionIdNow) { + this._diffInfo.set(diff ?? nullDocumentDiff, undefined); + } } async accept(transaction: ITransaction | undefined): Promise {