Skip to content

Commit 6d45c36

Browse files
authored
Merge pull request microsoft#184165 from microsoft/hediet/b/line-range-bug-fix
Fixes line range mapping construction bug.
2 parents 80deac0 + ec27808 commit 6d45c36

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

src/vs/editor/common/diff/standardLinesDiffComputer.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,19 +280,23 @@ export function getLineRangeMapping(rangeMapping: RangeMapping, originalLines: s
280280

281281
// rangeMapping describes the edit that replaces `rangeMapping.originalRange` with `newText := getText(modifiedLines, rangeMapping.modifiedRange)`.
282282

283-
// original: xxx[ \n <- this line is not modified
284-
// modified: xxx[ \n
285-
if (rangeMapping.modifiedRange.startColumn - 1 >= modifiedLines[rangeMapping.modifiedRange.startLineNumber - 1].length
286-
&& rangeMapping.originalRange.startColumn - 1 >= originalLines[rangeMapping.originalRange.startLineNumber - 1].length) {
287-
lineStartDelta = 1; // +1 is always possible, as startLineNumber < endLineNumber + 1
288-
}
289-
290283
// original: ]xxx \n <- this line is not modified
291284
// modified: ]xx \n
292285
if (rangeMapping.modifiedRange.endColumn === 1 && rangeMapping.originalRange.endColumn === 1
293286
&& rangeMapping.originalRange.startLineNumber + lineStartDelta <= rangeMapping.originalRange.endLineNumber
294287
&& rangeMapping.modifiedRange.startLineNumber + lineStartDelta <= rangeMapping.modifiedRange.endLineNumber) {
295-
lineEndDelta = -1; // We can only do this if the range is not empty yet
288+
// We can only do this if the range is not empty yet
289+
lineEndDelta = -1;
290+
}
291+
292+
// original: xxx[ \n <- this line is not modified
293+
// modified: xxx[ \n
294+
if (rangeMapping.modifiedRange.startColumn - 1 >= modifiedLines[rangeMapping.modifiedRange.startLineNumber - 1].length
295+
&& rangeMapping.originalRange.startColumn - 1 >= originalLines[rangeMapping.originalRange.startLineNumber - 1].length
296+
&& rangeMapping.originalRange.startLineNumber <= rangeMapping.originalRange.endLineNumber + lineEndDelta
297+
&& rangeMapping.modifiedRange.startLineNumber <= rangeMapping.modifiedRange.endLineNumber + lineEndDelta) {
298+
// We can only do this if the range is not empty yet
299+
lineStartDelta = 1;
296300
}
297301

298302
const originalLineRange = new LineRange(

src/vs/editor/test/node/diffing/lineRangeMapping.test.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import { RangeMapping } from 'vs/editor/common/diff/linesDiffComputer';
99
import { getLineRangeMapping } from 'vs/editor/common/diff/standardLinesDiffComputer';
1010

1111
suite('lineRangeMapping', () => {
12-
test('lineRangeMapping', () => {
13-
// {[2,1 -> 3,1]->[2,1 -> 2,1]}
12+
test('1', () => {
1413
assert.deepStrictEqual(
1514
getLineRangeMapping(
1615
new RangeMapping(
@@ -27,7 +26,29 @@ suite('lineRangeMapping', () => {
2726
''
2827
]
2928
).toString(),
30-
"{[3,4)->[3,3)}"
29+
"{[2,3)->[2,2)}"
30+
);
31+
});
32+
33+
test('2', () => {
34+
assert.deepStrictEqual(
35+
getLineRangeMapping(
36+
new RangeMapping(
37+
new Range(2, 1, 2, 1),
38+
new Range(2, 1, 4, 1),
39+
),
40+
[
41+
'',
42+
'',
43+
],
44+
[
45+
'',
46+
'',
47+
'',
48+
'',
49+
]
50+
).toString(),
51+
"{[2,2)->[2,4)}"
3152
);
3253
});
3354
});

0 commit comments

Comments
 (0)