Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/common/model/textModelStringEdit.ts
3294 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 { EditOperation } from '../core/editOperation.js';
7
import { Range } from '../core/range.js';
8
import { StringEdit, StringReplacement } from '../core/edits/stringEdit.js';
9
import { OffsetRange } from '../core/ranges/offsetRange.js';
10
import { DetailedLineRangeMapping } from '../diff/rangeMapping.js';
11
import { ITextModel, IIdentifiedSingleEditOperation } from '../model.js';
12
import { IModelContentChange } from './mirrorTextModel.js';
13
import { LengthEdit } from '../core/edits/lengthEdit.js';
14
import { countEOL } from '../core/misc/eolCounter.js';
15
16
export function offsetEditToEditOperations(offsetEdit: StringEdit, doc: ITextModel): IIdentifiedSingleEditOperation[] {
17
const edits: IIdentifiedSingleEditOperation[] = [];
18
for (const singleEdit of offsetEdit.replacements) {
19
const range = Range.fromPositions(
20
doc.getPositionAt(singleEdit.replaceRange.start),
21
doc.getPositionAt(singleEdit.replaceRange.start + singleEdit.replaceRange.length)
22
);
23
edits.push(EditOperation.replace(range, singleEdit.newText));
24
}
25
return edits;
26
}
27
28
export function offsetEditFromContentChanges(contentChanges: readonly IModelContentChange[]) {
29
const editsArr = contentChanges.map(c => new StringReplacement(OffsetRange.ofStartAndLength(c.rangeOffset, c.rangeLength), c.text));
30
editsArr.reverse();
31
const edits = new StringEdit(editsArr);
32
return edits;
33
}
34
35
export function offsetEditFromLineRangeMapping(original: ITextModel, modified: ITextModel, changes: readonly DetailedLineRangeMapping[]): StringEdit {
36
const edits: StringReplacement[] = [];
37
for (const c of changes) {
38
for (const i of c.innerChanges ?? []) {
39
const newText = modified.getValueInRange(i.modifiedRange);
40
41
const startOrig = original.getOffsetAt(i.originalRange.getStartPosition());
42
const endExOrig = original.getOffsetAt(i.originalRange.getEndPosition());
43
const origRange = new OffsetRange(startOrig, endExOrig);
44
45
edits.push(new StringReplacement(origRange, newText));
46
}
47
}
48
49
return new StringEdit(edits);
50
}
51
52
export function linesLengthEditFromModelContentChange(c: IModelContentChange[]): LengthEdit {
53
const contentChanges = c.slice().reverse();
54
const lengthEdits = contentChanges.map(c => LengthEdit.replace(
55
// Expand the edit range to include the entire line
56
new OffsetRange(c.range.startLineNumber - 1, c.range.endLineNumber),
57
countEOL(c.text)[0] + 1)
58
);
59
const lengthEdit = LengthEdit.compose(lengthEdits);
60
return lengthEdit;
61
}
62
63