fix: diff_content renders overlapping diff lines
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
use std::sync::Arc;
|
use std::{ops::Deref, sync::Arc};
|
||||||
|
|
||||||
use similar::DiffableStr;
|
use similar::DiffableStr;
|
||||||
|
|
||||||
@@ -145,13 +145,23 @@ pub(crate) fn diff_content(
|
|||||||
new_len,
|
new_len,
|
||||||
} => {
|
} => {
|
||||||
for i in 0..new_len.max(old_len) {
|
for i in 0..new_len.max(old_len) {
|
||||||
let old_line = old_index + i;
|
let old_line = if i < old_len {
|
||||||
let new_line = new_index + i;
|
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_i = DiffLineIndex(diff_lines.len());
|
||||||
|
|
||||||
let diff_line = match (old_line_ranges.get(old_line), new_line_ranges.get(new_line))
|
let diff_line = match (
|
||||||
{
|
old_line.and_then(|i| old_line_ranges.get(i).map(|it| (i, it))),
|
||||||
| (Some(old_range), Some(new_range)) => {
|
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(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);
|
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);
|
push_diff_line_index(new_line, diff_line_i, &mut new_line_to_diff_line_indices);
|
||||||
|
|
||||||
DiffLine {
|
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);
|
push_diff_line_index(old_line, diff_line_i, &mut old_line_to_diff_line_indices);
|
||||||
|
|
||||||
DiffLine {
|
DiffLine {
|
||||||
@@ -271,3 +281,9 @@ impl ContentDiff {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Into<usize> for DiffLineIndex {
|
||||||
|
fn into(self) -> usize {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user