From 2a8e0824a629e3553ce06b33039dabed9704a5a0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 24 May 2023 14:59:57 +0200 Subject: [PATCH] Fix opening excerpt when the cursor is at the end of a multi-buffer This was caused by seeking with a right bias, which in the case of the last excerpt in the buffer would seek past the end of the buffer. This commit changes the behavior to move the cursor back to the previous excerpt if we overshoot, to ensure we always land on an excerpt. --- crates/editor/src/multi_buffer.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index 6a617756974ee5a2021c1377ba2edb00468aa304..6b1ad6c5b2d6eb7c2e7bd9be9376b5fad04b8dd7 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -1140,6 +1140,10 @@ impl MultiBuffer { let mut result = Vec::new(); let mut cursor = snapshot.excerpts.cursor::(); cursor.seek(&start, Bias::Right, &()); + if cursor.item().is_none() { + cursor.prev(&()); + } + while let Some(excerpt) = cursor.item() { if *cursor.start() > end { break; @@ -5072,16 +5076,19 @@ mod tests { .read(cx) .range_to_buffer_ranges(start_ix..end_ix, cx); let excerpted_buffers_text = excerpted_buffer_ranges - .into_iter() + .iter() .map(|(buffer, buffer_range)| { buffer .read(cx) - .text_for_range(buffer_range) + .text_for_range(buffer_range.clone()) .collect::() }) .collect::>() .join("\n"); assert_eq!(excerpted_buffers_text, text_for_range); + if !expected_excerpts.is_empty() { + assert!(!excerpted_buffer_ranges.is_empty()); + } let expected_summary = TextSummary::from(&expected_text[start_ix..end_ix]); assert_eq!(