diff --git a/crates/buffer_diff/src/buffer_diff.rs b/crates/buffer_diff/src/buffer_diff.rs index 7b6c03098f5d85a3116670c5acc34cc8cc161df8..63df9b3cd3277b0493a07fe6c2414c5f3c777a71 100644 --- a/crates/buffer_diff/src/buffer_diff.rs +++ b/crates/buffer_diff/src/buffer_diff.rs @@ -1070,7 +1070,7 @@ fn compare_hunks( start.get_or_insert(new_hunk.buffer_range.start); base_text_start.get_or_insert(new_hunk.diff_base_byte_range.start); end.replace(new_hunk.buffer_range.end); - base_text_end.replace(new_hunk.diff_base_byte_range.end); + base_text_end = base_text_end.max(Some(new_hunk.diff_base_byte_range.end)); new_cursor.next(); } Ordering::Equal => { @@ -1113,7 +1113,7 @@ fn compare_hunks( start.get_or_insert(old_hunk.buffer_range.start); base_text_start.get_or_insert(old_hunk.diff_base_byte_range.start); end.replace(old_hunk.buffer_range.end); - base_text_end.replace(old_hunk.diff_base_byte_range.end); + base_text_end = base_text_end.max(Some(old_hunk.diff_base_byte_range.end)); old_cursor.next(); } } @@ -2755,7 +2755,7 @@ mod tests { " .unindent(), ); - let diff_6 = BufferDiffSnapshot::new_sync(buffer.snapshot(), base_text, cx); + let diff_6 = BufferDiffSnapshot::new_sync(buffer.snapshot(), base_text.clone(), cx); let DiffChanged { changed_range, base_text_changed_range, @@ -2768,6 +2768,59 @@ mod tests { base_text_range.to_point(diff_6.base_text()), Point::new(9, 0)..Point::new(10, 0) ); + + buffer.edit_via_marked_text( + &" + one + THREE + four«» + five + seven + eight + «NINE» + " + .unindent(), + ); + + let diff_7 = BufferDiffSnapshot::new_sync(buffer.snapshot(), base_text.clone(), cx); + let DiffChanged { + changed_range, + base_text_changed_range, + extended_range: _, + } = compare_hunks(&diff_7.inner.hunks, &diff_6.inner.hunks, &buffer, &buffer); + let range = changed_range.unwrap(); + assert_eq!(range.to_point(&buffer), Point::new(2, 4)..Point::new(7, 0)); + let base_text_range = base_text_changed_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_7.base_text()), + Point::new(5, 0)..Point::new(10, 0) + ); + + buffer.edit_via_marked_text( + &" + one + THREE + four + five«»seven + eight + NINE + " + .unindent(), + ); + + let diff_8 = BufferDiffSnapshot::new_sync(buffer.snapshot(), base_text, cx); + let DiffChanged { + changed_range, + base_text_changed_range, + extended_range: _, + } = compare_hunks(&diff_8.inner.hunks, &diff_7.inner.hunks, &buffer, &buffer); + let range = changed_range.unwrap(); + assert_eq!(range.to_point(&buffer), Point::new(3, 0)..Point::new(3, 4)); + let base_text_range = base_text_changed_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_8.base_text()), + Point::new(5, 0)..Point::new(8, 0) + ); } #[gpui::test(iterations = 100)]