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