Path: blob/main/extensions/copilot/src/platform/editing/common/edit.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import type * as vscode from 'vscode';6import { StringEdit, StringReplacement } from '../../../util/vs/editor/common/core/edits/stringEdit';7import { OffsetRange } from '../../../util/vs/editor/common/core/ranges/offsetRange';8import { IDiffService } from '../../diff/common/diffService';9import { OffsetLineColumnConverter } from './offsetLineColumnConverter';1011export async function stringEditFromDiff(original: string, modified: string, diffService: IDiffService, timeoutMs = 5000): Promise<StringEdit> {12const diff = await diffService.computeDiff(original, modified, { maxComputationTimeMs: timeoutMs, computeMoves: false, ignoreTrimWhitespace: false });13const origConverter = new OffsetLineColumnConverter(original);14const modConverter = new OffsetLineColumnConverter(modified);15const edits: StringReplacement[] = [];16for (const c of diff.changes) {17for (const i of c.innerChanges ?? []) {18const startMod = modConverter.positionToOffset(i.modifiedRange.getStartPosition());19const endExMod = modConverter.positionToOffset(i.modifiedRange.getEndPosition());20const newText = modified.substring(startMod, endExMod);2122const startOrig = origConverter.positionToOffset(i.originalRange.getStartPosition());23const endExOrig = origConverter.positionToOffset(i.originalRange.getEndPosition());24const origRange = new OffsetRange(startOrig, endExOrig);2526edits.push(new StringReplacement(origRange, newText));27}28}2930return new StringEdit(edits);31}3233export function stringEditFromTextContentChange(34contentChanges: readonly vscode.TextDocumentContentChangeEvent[]35) {36const editsArr = contentChanges.map(c => new StringReplacement(OffsetRange.ofStartAndLength(c.rangeOffset, c.rangeLength), c.text));37editsArr.reverse();38const edits = new StringEdit(editsArr);39return edits;40}414243