wip

Cole Miller created

Change summary

crates/multi_buffer/src/multi_buffer.rs | 81 +++++++++++---------------
1 file changed, 34 insertions(+), 47 deletions(-)

Detailed changes

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -993,13 +993,13 @@ pub struct MultiBufferChunks<'a> {
     excerpts: Cursor<'a, 'static, Excerpt, ExcerptOffset>,
     diff_transforms:
         Cursor<'a, 'static, DiffTransform, Dimensions<MultiBufferOffset, ExcerptOffset>>,
-    diffs: &'a TreeMap<BufferId, DiffStateSnapshot>,
     diff_base_chunks: Option<(BufferId, BufferChunks<'a>)>,
     buffer_chunk: Option<Chunk<'a>>,
     range: Range<MultiBufferOffset>,
     excerpt_offset_range: Range<ExcerptOffset>,
     excerpt_chunks: Option<ExcerptChunks<'a>>,
     language_aware: bool,
+    snapshot: &'a MultiBufferSnapshot,
 }
 
 pub struct ReversedMultiBufferChunks<'a> {
@@ -1053,9 +1053,8 @@ impl<'a, MBD: MultiBufferDimension> Dimension<'a, DiffTransformSummary> for Diff
 struct MultiBufferCursor<'a, MBD, BD> {
     excerpts: Cursor<'a, 'static, Excerpt, ExcerptDimension<MBD>>,
     diff_transforms: Cursor<'a, 'static, DiffTransform, DiffTransforms<MBD>>,
-    diffs: &'a TreeMap<BufferId, DiffStateSnapshot>,
-    buffers: &'a TreeMap<BufferId, BufferStateSnapshot>,
     cached_region: OnceCell<Option<MultiBufferRegion<'a, MBD, BD>>>,
+    snapshot: &'a MultiBufferSnapshot,
 }
 
 #[derive(Clone)]
@@ -1828,16 +1827,6 @@ impl MultiBuffer {
         result
     }
 
-    // todo!() this seems bogus
-    pub fn excerpt_buffer_ids(&self) -> Vec<BufferId> {
-        self.snapshot
-            .borrow()
-            .excerpts
-            .iter()
-            .map(|entry| entry.buffer_snapshot.remote_id())
-            .collect()
-    }
-
     pub fn excerpt_containing(&self, position: impl ToOffset, cx: &App) -> Option<ExcerptInfo> {
         let snapshot = self.read(cx);
         let offset = position.to_offset(&snapshot);
@@ -3550,6 +3539,7 @@ impl MultiBufferSnapshot {
             Some(MultiBufferDiffHunk {
                 row_range: MultiBufferRow(range.start.row)..MultiBufferRow(end_row),
                 buffer_id: buffer_snapshot.remote_id(),
+                path_key_index: excerpt.path_key_index,
                 buffer_range,
                 word_diffs,
                 diff_base_byte_range: BufferOffset(hunk.diff_base_byte_range.start)
@@ -4273,11 +4263,11 @@ impl MultiBufferSnapshot {
             range: MultiBufferOffset::ZERO..MultiBufferOffset::ZERO,
             excerpts: self.excerpts.cursor(()),
             diff_transforms: self.diff_transforms.cursor(()),
-            diffs: &self.diffs,
             diff_base_chunks: None,
             excerpt_chunks: None,
             buffer_chunk: None,
             language_aware,
+            snapshot: self,
         };
         let range = range.start.to_offset(self)..range.end.to_offset(self);
         chunks.seek(range);
@@ -5440,9 +5430,8 @@ impl MultiBufferSnapshot {
         MultiBufferCursor {
             excerpts,
             diff_transforms,
-            buffers: &self.buffers,
-            diffs: &self.diffs,
             cached_region: OnceCell::new(),
+            snapshot: self,
         }
     }
 
@@ -6408,7 +6397,7 @@ impl MultiBufferSnapshot {
         cursor.seek_to_start_of_current_excerpt();
         let region = cursor.region()?;
         let offset = region.range.start;
-        let buffer_offset = start_excerpt.buffer_start_offset();
+        let buffer_offset = start_excerpt.buffer_start_offset(self);
         let excerpt_offset = *cursor.excerpts.start();
         Some(MultiBufferExcerpt {
             diff_transforms: cursor.diff_transforms,
@@ -6421,15 +6410,9 @@ impl MultiBufferSnapshot {
 
     pub fn buffer_id_for_anchor(&self, anchor: Anchor) -> Option<BufferId> {
         match anchor {
-            Anchor::Min => self
-                .excerpts
-                .first()
-                .map(|excerpt| excerpt.buffer_snapshot.remote_id()),
+            Anchor::Min => self.excerpts.first().map(|excerpt| excerpt.buffer_id),
             Anchor::Excerpt(excerpt_anchor) => Some(excerpt_anchor.buffer_id),
-            Anchor::Max => self
-                .excerpts
-                .last()
-                .map(|excerpt| excerpt.buffer_snapshot.remote_id()),
+            Anchor::Max => self.excerpts.last().map(|excerpt| excerpt.buffer_id),
         }
     }
 
@@ -6447,20 +6430,20 @@ impl MultiBufferSnapshot {
                 excerpt_start.cmp(&range.end, self).is_le()
             })
             .flat_map(move |excerpt| {
+                let buffer_snapshot = excerpt.buffer_snapshot(self);
                 let mut query_range = excerpt.range.context.start..excerpt.range.context.end;
                 if let Some(excerpt_anchor) = range.start.excerpt_anchor()
-                    && excerpt.contains(&excerpt_anchor)
+                    && excerpt.contains(&excerpt_anchor, self)
                 {
                     query_range.start = excerpt_anchor.text_anchor();
                 }
                 if let Some(excerpt_anchor) = range.end.excerpt_anchor()
-                    && excerpt.contains(&excerpt_anchor)
+                    && excerpt.contains(&excerpt_anchor, self)
                 {
                     query_range.end = excerpt_anchor.text_anchor();
                 }
 
-                excerpt
-                    .buffer_snapshot
+                buffer_snapshot
                     .selections_in_range(query_range, include_local)
                     .flat_map(move |(replica_id, line_mode, cursor_shape, selections)| {
                         selections.map(move |selection| {
@@ -6532,7 +6515,7 @@ impl MultiBufferSnapshot {
             .flat_map(|range| {
                 self.range_to_buffer_ranges(range.start..=range.end)
                     .into_iter()
-                    .map(|(buffer, range, _excerpt_id)| {
+                    .map(|(buffer, range)| {
                         buffer.anchor_after(range.start)..buffer.anchor_before(range.end)
                     })
             })
@@ -6553,7 +6536,8 @@ impl MultiBufferSnapshot {
         while let Some(excerpt) = cursor.item()
             && &excerpt.path_key == path
         {
-            let excerpt_buffer_range = excerpt.range.context.to_offset(&excerpt.buffer_snapshot);
+            let buffer_snapshot = excerpt.buffer_snapshot(self);
+            let excerpt_buffer_range = excerpt.range.context.to_offset(buffer_snapshot);
             let excerpt_start = cursor.start().clone();
             let excerpt_len = excerpt.text_summary.len;
             cursor.next();
@@ -6864,7 +6848,7 @@ where
 
     fn main_buffer_position(&self) -> Option<BD> {
         let excerpt = self.excerpts.item()?;
-        let buffer = &excerpt.buffer_snapshot;
+        let buffer = excerpt.buffer_snapshot(self.snapshot);
         let buffer_context_start = excerpt.range.context.start.summary::<BD>(buffer);
         let mut buffer_start = buffer_context_start;
         let overshoot = self.diff_transforms.end().excerpt_dimension - *self.excerpts.start();
@@ -6882,7 +6866,7 @@ where
                 hunk_info,
                 ..
             } => {
-                let diff = self.diffs.get(buffer_id)?;
+                let diff = self.snapshot.diffs.get(buffer_id)?;
                 let buffer = diff.base_text();
                 let mut rope_cursor = buffer.as_rope().cursor(0);
                 let buffer_start = rope_cursor.summary::<BD>(base_text_byte_range.start);
@@ -6906,7 +6890,7 @@ where
             DiffTransform::BufferContent {
                 inserted_hunk_info, ..
             } => {
-                let buffer = &excerpt.buffer_snapshot;
+                let buffer = excerpt.buffer_snapshot(self.snapshot);
                 let buffer_context_start = excerpt.range.context.start.summary::<BD>(buffer);
 
                 let mut start = self.diff_transforms.start().output_dimension.0;
@@ -7133,7 +7117,7 @@ impl Excerpt {
 impl PartialEq for Excerpt {
     fn eq(&self, other: &Self) -> bool {
         self.path_key_index == other.path_key_index
-            && self.buffer_snapshot.remote_id() == other.buffer_snapshot.remote_id()
+            && self.buffer_id == other.buffer_id
             && self.range.context == other.range.context
     }
 }
@@ -7678,15 +7662,15 @@ impl Iterator for MultiBufferRows<'_> {
                     .excerpts
                     .item()
                     .or(self.cursor.excerpts.prev_item())?;
-                let buffer = &self
-                    .cursor
-                    .buffers
-                    .get(&last_excerpt.buffer_id)
-                    .expect("missing buffer snapshot")
-                    .buffer_snapshot;
-                let last_row = last_excerpt.range.context.end.to_point(buffer).row;
+                let buffer_snapshot = last_excerpt.buffer_snapshot(self.cursor.snapshot);
+                let last_row = last_excerpt.range.context.end.to_point(buffer_snapshot).row;
 
-                let first_row = last_excerpt.range.context.start.to_point(buffer).row;
+                let first_row = last_excerpt
+                    .range
+                    .context
+                    .start
+                    .to_point(buffer_snapshot)
+                    .row;
 
                 let expand_info = if self.is_singleton {
                     None
@@ -7694,7 +7678,7 @@ impl Iterator for MultiBufferRows<'_> {
                     let needs_expand_up = first_row == last_row
                         && last_row > 0
                         && !region.diff_hunk_status.is_some_and(|d| d.is_deleted());
-                    let needs_expand_down = last_row < buffer.max_point().row;
+                    let needs_expand_down = last_row < buffer_snapshot.max_point().row;
 
                     if needs_expand_up && needs_expand_down {
                         Some(ExpandExcerptDirection::UpAndDown)
@@ -7707,7 +7691,7 @@ impl Iterator for MultiBufferRows<'_> {
                     }
                     .map(|direction| ExpandInfo {
                         direction,
-                        excerpt_range: last_excerpt.range,
+                        excerpt_range: last_excerpt.range.context.clone(),
                     })
                 };
                 self.point += Point::new(1, 0);
@@ -7749,7 +7733,7 @@ impl Iterator for MultiBufferRows<'_> {
             }
             .map(|direction| ExpandInfo {
                 direction,
-                excerpt_id: region.excerpt.id,
+                excerpt_range: region.excerpt.range.context.clone(),
             })
         };
 
@@ -7807,12 +7791,14 @@ impl<'a> MultiBufferChunks<'a> {
                     excerpt_chunks,
                     (self.excerpt_offset_range.start - excerpt_start)
                         ..(self.excerpt_offset_range.end - excerpt_start),
+                    self.snapshot,
                 );
             } else {
                 self.excerpt_chunks = Some(excerpt.chunks_in_range(
                     (self.excerpt_offset_range.start - excerpt_start)
                         ..(self.excerpt_offset_range.end - excerpt_start),
                     self.language_aware,
+                    self.snapshot,
                 ));
             }
         } else {
@@ -7834,6 +7820,7 @@ impl<'a> MultiBufferChunks<'a> {
                 self.excerpt_chunks = Some(excerpt.chunks_in_range(
                     0..(self.excerpt_offset_range.end - *self.excerpts.start()),
                     self.language_aware,
+                    self.snapshot,
                 ));
             }
         }
@@ -7949,7 +7936,7 @@ impl<'a> Iterator for MultiBufferChunks<'a> {
                     }
                     chunks
                 } else {
-                    let base_buffer = &self.diffs.get(buffer_id)?.base_text();
+                    let base_buffer = &self.snapshot.diffs.get(buffer_id)?.base_text();
                     base_buffer.chunks(base_text_start..base_text_end, self.language_aware)
                 };