Path: blob/main/extensions/copilot/src/platform/editing/common/edits.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 { Range } from '../../../vscodeTypes';78/**9* For the given initial range, find the approximate range after the edits are applied on it.10* If the start of the initial range is modified by the edits, the start of the transformed range will be the start of the edits.11* If the end of the initial range is modified by the edits, the end of the transformed range will be the end of the edits.12* @param initialRange initial range before transformation with edits13* @param edits edits to apply14* @returns range after the transformation with the edits15*/16export function computeUpdatedRange(initialRange: vscode.Range, edits: vscode.TextEdit[]) {17let range: vscode.Range = initialRange;18for (const edit of edits) {19const editStart = edit.range.start;20const editEnd = edit.range.end;21const rangeStart = range.start;22const rangeEnd = range.end;23const numnberOfLinesReplaced = edit.newText.split('\n').length;24const numberOfLinesAdded = numnberOfLinesReplaced - (editEnd.line - editStart.line) - 1;2526let startLine = rangeStart.line;27let endLine = rangeStart.line;28if (editEnd.isBefore(rangeStart)) {29startLine = rangeStart.line + numberOfLinesAdded;30endLine = rangeEnd.line + numberOfLinesAdded;31}32else if (editStart.isBefore(rangeStart) && editEnd.isAfterOrEqual(rangeStart) && editEnd.isBeforeOrEqual(rangeEnd)) {33startLine = editStart.line;34endLine = rangeEnd.line + numberOfLinesAdded;35}36else if (editStart.isAfterOrEqual(rangeStart) && editStart.isBeforeOrEqual(rangeEnd) && editEnd.isAfter(rangeEnd)) {37startLine = rangeStart.line;38endLine = editEnd.line + numberOfLinesAdded;39}40else if (editStart.isAfter(rangeEnd)) {41startLine = rangeStart.line;42endLine = rangeEnd.line;43}44else if (range.contains(edit.range)) {45startLine = rangeStart.line;46endLine = rangeEnd.line + numberOfLinesAdded;47}48else if (edit.range.contains(range)) {49startLine = editStart.line;50endLine = editStart.line + numnberOfLinesReplaced - 1;51}52range = new Range(startLine, 0, endLine, 0);53}54return range;55}565758