Skip to content

Commit 9cc18d7

Browse files
authored
CompareCodeBlock improvements (microsoft#209955)
* making vs made changes * make "Apply Edits" command work with diff based edits
1 parent 44f38ca commit 9cc18d7

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/edito
1010
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
1111
import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService';
1212
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
13+
import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation';
1314
import { Range } from 'vs/editor/common/core/range';
1415
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
15-
import { DocumentContextItem, TextEdit, WorkspaceEdit } from 'vs/editor/common/languages';
16+
import { DocumentContextItem, WorkspaceEdit } from 'vs/editor/common/languages';
1617
import { ILanguageService } from 'vs/editor/common/languages/language';
1718
import { ITextModel } from 'vs/editor/common/model';
1819
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
19-
import { ITextModelService } from 'vs/editor/common/services/resolverService';
2020
import { CopyAction } from 'vs/editor/contrib/clipboard/browser/clipboard';
2121
import { localize2 } from 'vs/nls';
2222
import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions';
@@ -607,6 +607,7 @@ export function registerChatCodeCompareBlockActions() {
607607
f1: false,
608608
category: CHAT_CATEGORY,
609609
icon: Codicon.check,
610+
precondition: EditorContextKeys.hasChanges,
610611
menu: {
611612
id: MenuId.ChatCompareBlock,
612613
group: 'navigation'
@@ -615,19 +616,25 @@ export function registerChatCodeCompareBlockActions() {
615616
}
616617

617618
async runWithContext(accessor: ServicesAccessor, context: ICodeCompareBlockActionContext): Promise<any> {
618-
if (!isResponseVM(context.element)) {
619+
const model = context.diffEditor.getModel();
620+
if (!model) {
619621
return;
620622
}
621-
const modelService = accessor.get(ITextModelService);
622-
const ref = await modelService.createModelReference(context.uri);
623-
try {
624-
const edits = context.edits.map(TextEdit.asEditOperation);
625-
ref.object.textEditorModel.pushStackElement();
626-
ref.object.textEditorModel.pushEditOperations(null, edits, () => null);
627-
ref.object.textEditorModel.pushStackElement();
628-
} finally {
629-
ref.dispose();
623+
const diff = context.diffEditor.getDiffComputationResult();
624+
if (!diff || diff.identical) {
625+
return;
626+
}
627+
628+
const edits: ISingleEditOperation[] = [];
629+
for (const item of diff.changes2) {
630+
const range = item.original.toExclusiveRange();
631+
const newText = model.modified.getValueInRange(item.modified.toExclusiveRange());
632+
edits.push(EditOperation.replace(range, newText));
630633
}
634+
635+
model.original.pushStackElement();
636+
model.original.pushEditOperations(null, edits, () => null);
637+
model.original.pushStackElement();
631638
}
632639
});
633640

src/vs/workbench/contrib/chat/browser/chatListRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
887887
if (this.rendererOptions.renderTextEditsAsSummary?.(textEdit.uri)) {
888888
if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEdit')) {
889889
return {
890-
element: $('.interactive-edits-summary', undefined, localize('editsSummary', "Made changes.")),
890+
element: $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")),
891891
dispose() { }
892892
};
893893
}

src/vs/workbench/contrib/chat/browser/codeBlockPart.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/diffEditor
4949
import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat';
5050
import { TextEdit } from 'vs/editor/common/languages';
5151
import { CancellationToken } from 'vs/base/common/cancellation';
52+
import { IDiffEditor } from 'vs/editor/browser/editorBrowser';
5253

5354
const $ = dom.$;
5455

@@ -424,7 +425,8 @@ export class ChatCodeBlockContentProvider extends Disposable implements ITextMod
424425
//
425426

426427
export interface ICodeCompareBlockActionContext {
427-
element: ChatTreeItem;
428+
readonly element: ChatTreeItem;
429+
readonly diffEditor: IDiffEditor;
428430
readonly uri: URI;
429431
readonly edits: readonly TextEdit[];
430432
}
@@ -700,6 +702,7 @@ export class CodeCompareBlockPart extends Disposable {
700702
uri: originalTextModel.uri,
701703
edits: data.edits,
702704
element: data.element,
705+
diffEditor: this.diffEditor,
703706
} satisfies ICodeCompareBlockActionContext;
704707
}
705708
}

0 commit comments

Comments
 (0)