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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user