Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/editing/common/edits.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 { Range } from '../../../vscodeTypes';
8
9
/**
10
* For the given initial range, find the approximate range after the edits are applied on it.
11
* 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.
12
* 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.
13
* @param initialRange initial range before transformation with edits
14
* @param edits edits to apply
15
* @returns range after the transformation with the edits
16
*/
17
export function computeUpdatedRange(initialRange: vscode.Range, edits: vscode.TextEdit[]) {
18
let range: vscode.Range = initialRange;
19
for (const edit of edits) {
20
const editStart = edit.range.start;
21
const editEnd = edit.range.end;
22
const rangeStart = range.start;
23
const rangeEnd = range.end;
24
const numnberOfLinesReplaced = edit.newText.split('\n').length;
25
const numberOfLinesAdded = numnberOfLinesReplaced - (editEnd.line - editStart.line) - 1;
26
27
let startLine = rangeStart.line;
28
let endLine = rangeStart.line;
29
if (editEnd.isBefore(rangeStart)) {
30
startLine = rangeStart.line + numberOfLinesAdded;
31
endLine = rangeEnd.line + numberOfLinesAdded;
32
}
33
else if (editStart.isBefore(rangeStart) && editEnd.isAfterOrEqual(rangeStart) && editEnd.isBeforeOrEqual(rangeEnd)) {
34
startLine = editStart.line;
35
endLine = rangeEnd.line + numberOfLinesAdded;
36
}
37
else if (editStart.isAfterOrEqual(rangeStart) && editStart.isBeforeOrEqual(rangeEnd) && editEnd.isAfter(rangeEnd)) {
38
startLine = rangeStart.line;
39
endLine = editEnd.line + numberOfLinesAdded;
40
}
41
else if (editStart.isAfter(rangeEnd)) {
42
startLine = rangeStart.line;
43
endLine = rangeEnd.line;
44
}
45
else if (range.contains(edit.range)) {
46
startLine = rangeStart.line;
47
endLine = rangeEnd.line + numberOfLinesAdded;
48
}
49
else if (edit.range.contains(range)) {
50
startLine = editStart.line;
51
endLine = editStart.line + numnberOfLinesReplaced - 1;
52
}
53
range = new Range(startLine, 0, endLine, 0);
54
}
55
return range;
56
}
57
58