wip

Cole Miller created

Change summary

crates/buffer_diff/src/buffer_diff.rs   | 33 +++++++++++++++++++++++++-
crates/language/src/buffer.rs           |  2 
crates/multi_buffer/src/multi_buffer.rs | 20 +++++++++++++---
crates/rope/src/chunk.rs                |  1 
crates/text/src/text.rs                 |  1 
5 files changed, 50 insertions(+), 7 deletions(-)

Detailed changes

crates/buffer_diff/src/buffer_diff.rs 🔗

@@ -1085,6 +1085,8 @@ impl BufferDiff {
     ) -> Self {
         let mut this = BufferDiff::new(&buffer, cx);
         let executor = cx.background_executor().clone();
+        let mut base_text = base_text.to_owned();
+        text::LineEnding::normalize(&mut base_text);
         let inner = executor.block(this.update_diff(
             buffer.clone(),
             Some(Arc::from(base_text)),
@@ -1092,6 +1094,7 @@ impl BufferDiff {
             None,
             cx,
         ));
+        // FIXME
         this.set_snapshot(inner, &buffer, true, cx);
         this
     }
@@ -1189,8 +1192,14 @@ impl BufferDiff {
                     buffer.clone(),
                     diff_options,
                 );
+                let base_text = base_text.unwrap_or_default();
+                if cfg!(debug_assertions) {
+                    for hunk in hunks.iter() {
+                        base_text.get(hunk.diff_base_byte_range.clone()).unwrap();
+                    }
+                }
                 BufferDiffInner {
-                    base_text: base_text.unwrap_or_default(),
+                    base_text,
                     hunks,
                     base_text_exists,
                     pending_hunks: SumTree::new(&buffer),
@@ -1260,12 +1269,32 @@ impl BufferDiff {
 
         let state = &mut self.inner;
         state.base_text_exists = new_state.base_text_exists;
+        if cfg!(debug_assertions) {
+            for hunk in new_state.hunks.iter() {
+                new_state.base_text.get(hunk.diff_base_byte_range.clone());
+            }
+        }
         if base_text_changed {
             state.base_text.update(cx, |base_text, cx| {
-                base_text.set_text(new_state.base_text, cx);
+                base_text.set_text(dbg!(new_state.base_text.clone()), cx);
             })
         }
         state.hunks = new_state.hunks;
+        if cfg!(debug_assertions) {
+            pretty_assertions::assert_eq!(
+                state.base_text.read(cx).snapshot().text().as_str(),
+                new_state.base_text.as_ref()
+            );
+            for hunk in state.hunks.iter() {
+                state
+                    .base_text
+                    .read(cx)
+                    .snapshot()
+                    .text_summary_for_range::<text::TextSummary, _>(
+                        hunk.diff_base_byte_range.clone(),
+                    );
+            }
+        }
         if base_text_changed || clear_pending_hunks {
             if let Some((first, last)) = state.pending_hunks.first().zip(state.pending_hunks.last())
             {

crates/language/src/buffer.rs 🔗

@@ -3465,7 +3465,7 @@ impl BufferSnapshot {
     /// returned in chunks where each chunk has a single syntax highlighting style and
     /// diagnostic status.
     pub fn chunks<T: ToOffset>(&self, range: Range<T>, language_aware: bool) -> BufferChunks<'_> {
-        let range = range.start.to_offset(self)..range.end.to_offset(self);
+        let range = dbg!(range.start.to_offset(self))..range.end.to_offset(self);
 
         let mut syntax = None;
         if language_aware {

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -2327,6 +2327,7 @@ impl MultiBuffer {
         let buffer = buffer_state.buffer.read(cx);
         let diff_change_range = range.to_offset(buffer);
 
+        dbg!();
         let new_diff = DiffStateSnapshot {
             diff: diff.snapshot(cx),
             main_buffer: None,
@@ -2375,7 +2376,7 @@ impl MultiBuffer {
             &mut snapshot,
             excerpt_edits,
             DiffChangeKind::DiffUpdated {
-                base_changed: base_text_changed,
+                base_changed: dbg!(base_text_changed),
             },
         );
         if !edits.is_empty() {
@@ -3177,6 +3178,7 @@ impl MultiBuffer {
             let edit_new_start =
                 MultiBufferOffset((edit_old_start.0 as isize + output_delta) as usize);
 
+            dbg!();
             let changed_diff_hunks = Self::recompute_diff_transforms_for_edit(
                 &edit,
                 &mut excerpts,
@@ -3343,7 +3345,6 @@ impl MultiBuffer {
                             hunk_excerpt_start,
                             *end_of_current_insert,
                         );
-                        // FIXME record that the status for this region should be "deleted"
                         if !hunk_buffer_range.is_empty() {
                             let hunk_info = DiffTransformHunkInfo {
                                 excerpt_id: excerpt.id,
@@ -3419,9 +3420,16 @@ impl MultiBuffer {
                             if !hunk.diff_base_byte_range.is_empty()
                                 && hunk_buffer_range.start >= edit_buffer_start
                                 && hunk_buffer_range.start <= excerpt_buffer_end
-                                && dbg!(snapshot.show_deleted_hunks)
+                                && snapshot.show_deleted_hunks
                             {
+                                dbg!(&hunk.diff_base_byte_range);
                                 let base_text = diff.base_text();
+                                if cfg!(debug_assertions) {
+                                    dbg!();
+                                    base_text.text_summary_for_range::<TextSummary, _>(
+                                        hunk.diff_base_byte_range.clone(),
+                                    );
+                                }
                                 let mut text_cursor =
                                     base_text.as_rope().cursor(hunk.diff_base_byte_range.start);
                                 let mut base_text_summary = text_cursor
@@ -7848,6 +7856,7 @@ impl<'a> Iterator for MultiBufferChunks<'a> {
                 has_trailing_newline,
                 ..
             } => {
+                dbg!(&base_text_byte_range);
                 let base_text_start =
                     base_text_byte_range.start + (self.range.start - diff_transform_start);
                 let base_text_end =
@@ -7866,7 +7875,10 @@ impl<'a> Iterator for MultiBufferChunks<'a> {
                     chunks
                 } else {
                     let base_buffer = &self.diffs.get(buffer_id)?.base_text();
-                    base_buffer.chunks(base_text_start..base_text_end, self.language_aware)
+                    base_buffer.chunks(
+                        dbg!(base_text_start)..dbg!(base_text_end),
+                        self.language_aware,
+                    )
                 };
 
                 let chunk = if let Some(chunk) = chunks.next() {

crates/rope/src/chunk.rs 🔗

@@ -132,6 +132,7 @@ impl Chunk {
             return true;
         }
         if PANIC || cfg!(debug_assertions) {
+            dbg!(offset);
             panic_char_boundary(&self.text, offset);
         } else {
             log_err_char_boundary(&self.text, offset);

crates/text/src/text.rs 🔗

@@ -3141,6 +3141,7 @@ impl ToOffset for Point {
 }
 
 impl ToOffset for usize {
+    #[track_caller]
     fn to_offset(&self, snapshot: &BufferSnapshot) -> usize {
         if snapshot
             .as_rope()