Path: blob/main/src/vs/editor/common/model/textModelStringEdit.ts
3294 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 { EditOperation } from '../core/editOperation.js';6import { Range } from '../core/range.js';7import { StringEdit, StringReplacement } from '../core/edits/stringEdit.js';8import { OffsetRange } from '../core/ranges/offsetRange.js';9import { DetailedLineRangeMapping } from '../diff/rangeMapping.js';10import { ITextModel, IIdentifiedSingleEditOperation } from '../model.js';11import { IModelContentChange } from './mirrorTextModel.js';12import { LengthEdit } from '../core/edits/lengthEdit.js';13import { countEOL } from '../core/misc/eolCounter.js';1415export function offsetEditToEditOperations(offsetEdit: StringEdit, doc: ITextModel): IIdentifiedSingleEditOperation[] {16const edits: IIdentifiedSingleEditOperation[] = [];17for (const singleEdit of offsetEdit.replacements) {18const range = Range.fromPositions(19doc.getPositionAt(singleEdit.replaceRange.start),20doc.getPositionAt(singleEdit.replaceRange.start + singleEdit.replaceRange.length)21);22edits.push(EditOperation.replace(range, singleEdit.newText));23}24return edits;25}2627export function offsetEditFromContentChanges(contentChanges: readonly IModelContentChange[]) {28const editsArr = contentChanges.map(c => new StringReplacement(OffsetRange.ofStartAndLength(c.rangeOffset, c.rangeLength), c.text));29editsArr.reverse();30const edits = new StringEdit(editsArr);31return edits;32}3334export function offsetEditFromLineRangeMapping(original: ITextModel, modified: ITextModel, changes: readonly DetailedLineRangeMapping[]): StringEdit {35const edits: StringReplacement[] = [];36for (const c of changes) {37for (const i of c.innerChanges ?? []) {38const newText = modified.getValueInRange(i.modifiedRange);3940const startOrig = original.getOffsetAt(i.originalRange.getStartPosition());41const endExOrig = original.getOffsetAt(i.originalRange.getEndPosition());42const origRange = new OffsetRange(startOrig, endExOrig);4344edits.push(new StringReplacement(origRange, newText));45}46}4748return new StringEdit(edits);49}5051export function linesLengthEditFromModelContentChange(c: IModelContentChange[]): LengthEdit {52const contentChanges = c.slice().reverse();53const lengthEdits = contentChanges.map(c => LengthEdit.replace(54// Expand the edit range to include the entire line55new OffsetRange(c.range.startLineNumber - 1, c.range.endLineNumber),56countEOL(c.text)[0] + 1)57);58const lengthEdit = LengthEdit.compose(lengthEdits);59return lengthEdit;60}616263