fix: diff_content renders overlapping diff lines

This commit is contained in:
2026-06-04 00:54:34 +01:00
parent ccc93d2429
commit 5671597404

View File

@@ -1,4 +1,4 @@
use std::sync::Arc;
use std::{ops::Deref, sync::Arc};
use similar::DiffableStr;
@@ -145,13 +145,23 @@ pub(crate) fn diff_content(
new_len,
} => {
for i in 0..new_len.max(old_len) {
let old_line = old_index + i;
let new_line = new_index + i;
let old_line = if i < old_len {
Some(old_index + i)
} else {
None
};
let new_line = if i < new_len {
Some(new_index + i)
} else {
None
};
let diff_line_i = DiffLineIndex(diff_lines.len());
let diff_line = match (old_line_ranges.get(old_line), new_line_ranges.get(new_line))
{
| (Some(old_range), Some(new_range)) => {
let diff_line = match (
old_line.and_then(|i| old_line_ranges.get(i).map(|it| (i, it))),
new_line.and_then(|i| new_line_ranges.get(i).map(|it| (i, it))),
) {
| (Some((old_line, old_range)), Some((new_line, new_range))) => {
push_diff_line_index(old_line, diff_line_i, &mut old_line_to_diff_line_indices);
push_diff_line_index(new_line, diff_line_i, &mut new_line_to_diff_line_indices);
@@ -170,7 +180,7 @@ pub(crate) fn diff_content(
}
}
| (None, Some(new_range)) => {
| (None, Some((new_line, new_range))) => {
push_diff_line_index(new_line, diff_line_i, &mut new_line_to_diff_line_indices);
DiffLine {
@@ -186,7 +196,7 @@ pub(crate) fn diff_content(
}
}
| (Some(old_range), None) => {
| (Some((old_line, old_range)), None) => {
push_diff_line_index(old_line, diff_line_i, &mut old_line_to_diff_line_indices);
DiffLine {
@@ -271,3 +281,9 @@ impl ContentDiff {
}
}
}
impl Into<usize> for DiffLineIndex {
fn into(self) -> usize {
self.0
}
}