diff --git a/src/util/diff.rs b/src/util/diff.rs index 741f0d0..9877e16 100644 --- a/src/util/diff.rs +++ b/src/util/diff.rs @@ -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 for DiffLineIndex { + fn into(self) -> usize { + self.0 + } +}