From be657cd6780769a63cbebdb615f51a50ad434b33 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Mon, 8 Dec 2025 15:07:06 -0500 Subject: [PATCH] wip --- 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(-) diff --git a/crates/buffer_diff/src/buffer_diff.rs b/crates/buffer_diff/src/buffer_diff.rs index 6d400a91ccfa91927730e8bf153df5b873ef9252..e1c2a2a20b3858200d35074030b886b1a8d658f2 100644 --- a/crates/buffer_diff/src/buffer_diff.rs +++ b/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::( + 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()) { diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 46d7f655627e1c01612b703a64bc0ab58d1b6669..0079bda87523b4a3dd654d2480a22428153b7dbd 100644 --- a/crates/language/src/buffer.rs +++ b/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(&self, range: Range, 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 { diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 98bcf75040d7d31c784dace6314fa841bb2e86c7..5ebcdd62ce24f59e57bd45f941fa1cce702786d5 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/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::( + 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() { diff --git a/crates/rope/src/chunk.rs b/crates/rope/src/chunk.rs index 4cb3c74d011cf44c3cdeb00f22a854783405d334..fc6d7aa7886a5094b4af966bf0ca858718e60a99 100644 --- a/crates/rope/src/chunk.rs +++ b/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); diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index acd712f40da23af4c364649b14860e41a346389c..a719c4c1da181c2238b8882fb5ebf92a621eee22 100644 --- a/crates/text/src/text.rs +++ b/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()