Fixes assertion failures in move detection (#186507)

This commit is contained in:
Henning Dieterichs 2023-06-28 16:13:00 +02:00 committed by GitHub
parent 9851bdc68d
commit d572e9de14
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -142,7 +142,7 @@ export class StandardLinesDiffComputer implements ILinesDiffComputer {
new OffsetRange(deletion.range.startLineNumber - 1, deletion.range.endLineNumberExclusive - 1),
new OffsetRange(best.range.startLineNumber - 1, best.range.endLineNumberExclusive - 1),
), timeout, considerWhitespaceChanges);
const mappings = lineRangeMappingFromRangeMappings(moveChanges.mappings, originalLines, modifiedLines);
const mappings = lineRangeMappingFromRangeMappings(moveChanges.mappings, originalLines, modifiedLines, true);
insertions.delete(best);
moves.push(new MovedText(new SimpleLineRangeMapping(deletion.range, best.range), mappings));
@ -278,7 +278,7 @@ function mergeSequenceDiffs(sequenceDiffs1: SequenceDiff[], sequenceDiffs2: Sequ
return result;
}
export function lineRangeMappingFromRangeMappings(alignments: RangeMapping[], originalLines: string[], modifiedLines: string[]): LineRangeMapping[] {
export function lineRangeMappingFromRangeMappings(alignments: RangeMapping[], originalLines: string[], modifiedLines: string[], dontAssertStartLine: boolean = false): LineRangeMapping[] {
const changes: LineRangeMapping[] = [];
for (const g of group(
alignments.map(a => getLineRangeMapping(a, originalLines, modifiedLines)),
@ -297,8 +297,10 @@ export function lineRangeMappingFromRangeMappings(alignments: RangeMapping[], or
}
assertFn(() => {
if (changes.length > 0 && changes[0].originalRange.startLineNumber !== changes[0].modifiedRange.startLineNumber) {
return false;
if (!dontAssertStartLine) {
if (changes.length > 0 && changes[0].originalRange.startLineNumber !== changes[0].modifiedRange.startLineNumber) {
return false;
}
}
return checkAdjacentItems(changes,
(m1, m2) => m2.originalRange.startLineNumber - m1.originalRange.endLineNumberExclusive === m2.modifiedRange.startLineNumber - m1.modifiedRange.endLineNumberExclusive &&