diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index b523bbb921..d00c161a86 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -1424,24 +1424,19 @@ impl MultiBuffer { cx: &mut Context, ) { let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot()); - let (mut insert_after, excerpt_ids) = - if let Some(existing) = self.buffers_by_path.get(&path) { - (*existing.last().unwrap(), existing.clone()) - } else { - ( - self.buffers_by_path - .range(..path.clone()) - .next_back() - .map(|(_, value)| *value.last().unwrap()) - .unwrap_or(ExcerptId::min()), - Vec::default(), - ) - }; + + let mut insert_after = self + .buffers_by_path + .range(..path.clone()) + .next_back() + .map(|(_, value)| *value.last().unwrap()) + .unwrap_or(ExcerptId::min()); + let existing = self.buffers_by_path.get(&path).cloned().unwrap_or_default(); let (new, _) = build_excerpt_ranges(&buffer_snapshot, &ranges, context_line_count); let mut new_iter = new.into_iter().peekable(); - let mut existing_iter = excerpt_ids.into_iter().peekable(); + let mut existing_iter = existing.into_iter().peekable(); let mut new_excerpt_ids = Vec::new(); let mut to_remove = Vec::new(); @@ -1495,7 +1490,6 @@ impl MultiBuffer { // maybe merge overlapping excerpts? // it's hard to distinguish between a manually expanded excerpt, and one that // got smaller because of a missing diff. - // if existing_start == new.context.start && existing_end == new.context.end { new_excerpt_ids.append(&mut self.insert_excerpts_after( insert_after, diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 2e13fa4558..25c3a4cf91 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -1578,6 +1578,107 @@ fn test_repeatedly_expand_a_diff_hunk(cx: &mut TestAppContext) { ); } +#[gpui::test] +fn test_set_excerpts_for_buffer_ordering(cx: &mut TestAppContext) { + let buf1 = cx.new(|cx| { + Buffer::local( + indoc! { + "zero + one + two + two.five + three + four + five + six + seven + eight + nine + ten + eleven + ", + }, + cx, + ) + }); + let path1: PathKey = PathKey::namespaced("0", Path::new("/")); + + let multibuffer = cx.new(|_| MultiBuffer::new(Capability::ReadWrite)); + multibuffer.update(cx, |multibuffer, cx| { + multibuffer.set_excerpts_for_path( + path1.clone(), + buf1.clone(), + vec![ + Point::row_range(1..2), + Point::row_range(6..7), + Point::row_range(11..12), + ], + 1, + cx, + ); + }); + + assert_excerpts_match( + &multibuffer, + cx, + indoc! { + "----- + zero + one + two + two.five + ----- + four + five + six + seven + ----- + nine + ten + eleven + " + }, + ); + + buf1.update(cx, |buffer, cx| buffer.edit([(0..5, "")], None, cx)); + + multibuffer.update(cx, |multibuffer, cx| { + multibuffer.set_excerpts_for_path( + path1.clone(), + buf1.clone(), + vec![ + Point::row_range(0..2), + Point::row_range(5..6), + Point::row_range(10..11), + ], + 1, + cx, + ); + }); + + assert_excerpts_match( + &multibuffer, + cx, + indoc! { + "----- + one + two + two.five + three + ----- + four + five + six + seven + ----- + nine + ten + eleven + " + }, + ); +} + #[gpui::test] fn test_set_excerpts_for_buffer(cx: &mut TestAppContext) { let buf1 = cx.new(|cx| {