From bb0848d555436d439a598dbdbc313c3f61c56895 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Thu, 5 Mar 2026 15:02:02 -0500 Subject: [PATCH] fix reference excerpt expansion --- crates/multi_buffer/src/multi_buffer_tests.rs | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index bb2060d101d33243b3d388cc7e719e4d47cdb5b0..5653beff96685555944fcee2fe01efaafa948255 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -2304,45 +2304,47 @@ impl ReferenceMultibuffer { return; } - let mut new_ranges = self - .excerpts - .iter() - .map(|excerpt| { - ( - excerpt.clone(), - excerpt.range.to_point(&excerpt.buffer.read(cx).snapshot()), - ) - }) - .collect::>(); - - for (excerpt, point_range) in &mut new_ranges { - if excerpts.contains(&excerpt.info(cx)) { - let snapshot = excerpt.buffer.read(cx).snapshot(); - point_range.start = Point::new(point_range.start.row.saturating_sub(line_count), 0); - point_range.end = snapshot - .clip_point(Point::new(point_range.end.row + line_count, 0), Bias::Left); - point_range.end.column = snapshot.line_len(point_range.end.row); - } + let mut excerpts_by_path: HashMap> = HashMap::default(); + for excerpt in excerpts { + excerpts_by_path + .entry(excerpt.path_key_index) + .or_default() + .push(excerpt.clone()) } - for ((path_key, path_key_index, buffer), chunk) in - &new_ranges.iter().chunk_by(|(excerpt, _)| { - ( - excerpt.path_key.clone(), - excerpt.path_key_index, - excerpt.buffer.clone(), - ) - }) - { - let buffer_snapshot = buffer.read(cx).snapshot(); + for (path_key_index, excerpts_to_expand) in excerpts_by_path { + let mut buffer = None; + let mut buffer_snapshot = None; + let mut path = None; + let new_ranges = self + .excerpts + .iter() + .filter(|excerpt| excerpt.path_key_index == path_key_index) + .map(|excerpt| { + let snapshot = excerpt.buffer.read(cx).snapshot(); + let mut range = excerpt.range.to_point(&snapshot); + if excerpts_to_expand + .iter() + .any(|info| excerpt.range.contains_anchor(info.range.start, &snapshot)) + { + range.start = Point::new(range.start.row.saturating_sub(line_count), 0); + range.end = snapshot + .clip_point(Point::new(range.end.row + line_count, 0), Bias::Left); + range.end.column = snapshot.line_len(range.end.row); + } + buffer = Some(excerpt.buffer.clone()); + buffer_snapshot = Some(snapshot); + path = Some(excerpt.path_key.clone()); + ExcerptRange::new(range) + }) + .collect::>(); + self.set_excerpts( - path_key, + path.unwrap(), path_key_index, - buffer, - &buffer_snapshot, - chunk - .map(|(_, range)| ExcerptRange::new(range.clone())) - .collect::>(), + buffer.unwrap(), + &buffer_snapshot.unwrap(), + new_ranges, ); } }