From ebd0c5d000b1c1b6d8ec1bc225266b2cbf6c2522 Mon Sep 17 00:00:00 2001 From: Julia Date: Thu, 15 Dec 2022 18:17:32 -0500 Subject: [PATCH] Handle reversed=true for multi-buffer git-hunks-in-range iteration Co-Authored-By: Nathan Sobo --- crates/editor/src/multi_buffer.rs | 48 ++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index fab55a5099d9abd6eaa393c359d83cf784849ff5..b76890efb0d74d154f42885d8240076dcbd86ac8 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -2636,7 +2636,15 @@ impl MultiBufferSnapshot { reversed: bool, ) -> impl 'a + Iterator> { let mut cursor = self.excerpts.cursor::(); - cursor.seek(&Point::new(row_range.start, 0), Bias::Right, &()); + + if reversed { + cursor.seek(&Point::new(row_range.end, 0), Bias::Left, &()); + if cursor.item().is_none() { + cursor.prev(&()); + } + } else { + cursor.seek(&Point::new(row_range.start, 0), Bias::Right, &()); + } std::iter::from_fn(move || { let excerpt = cursor.item()?; @@ -2685,7 +2693,12 @@ impl MultiBufferSnapshot { }) }); - cursor.next(&()); + if reversed { + cursor.prev(&()); + } else { + cursor.next(&()); + } + Some(buffer_hunks) }) .flatten() @@ -4195,19 +4208,34 @@ mod tests { .unindent() ); + let expected = [ + (DiffHunkStatus::Modified, 1..2), + (DiffHunkStatus::Modified, 2..3), + //TODO: Define better when and where removed hunks show up at range extremities + (DiffHunkStatus::Removed, 6..6), + (DiffHunkStatus::Removed, 8..8), + (DiffHunkStatus::Added, 10..11), + ]; + assert_eq!( snapshot .git_diff_hunks_in_range(0..12, false) .map(|hunk| (hunk.status(), hunk.buffer_range)) .collect::>(), - &[ - (DiffHunkStatus::Modified, 1..2), - (DiffHunkStatus::Modified, 2..3), - //TODO: Define better when and where removed hunks show up at range extremities - (DiffHunkStatus::Removed, 6..6), - (DiffHunkStatus::Removed, 8..8), - (DiffHunkStatus::Added, 10..11), - ] + &expected, + ); + + assert_eq!( + snapshot + .git_diff_hunks_in_range(0..12, true) + .map(|hunk| (hunk.status(), hunk.buffer_range)) + .collect::>(), + expected + .iter() + .rev() + .cloned() + .collect::>() + .as_slice(), ); }