From 4a680d015a3e4ff3989f1620f1f4b48d74f3cecc Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Thu, 4 Dec 2025 02:42:10 -0500 Subject: [PATCH] fix --- crates/editor/src/split.rs | 8 ++ crates/multi_buffer/src/multi_buffer.rs | 180 ++++++++++++------------ 2 files changed, 98 insertions(+), 90 deletions(-) diff --git a/crates/editor/src/split.rs b/crates/editor/src/split.rs index b38a21c70a52f7f05ce59ad6e44e812c2e05b894..b894d028f7899f081fa4aa6fc5532251295ee2e5 100644 --- a/crates/editor/src/split.rs +++ b/crates/editor/src/split.rs @@ -403,6 +403,7 @@ mod tests { use language::{Buffer, Capability}; use multi_buffer::MultiBuffer; use project::Project; + use settings::SettingsStore; use ui::VisualContext as _; use workspace::Workspace; @@ -410,6 +411,12 @@ mod tests { #[gpui::test] async fn test_basic_excerpts(cx: &mut gpui::TestAppContext) { + cx.update(|cx| { + let store = SettingsStore::test(cx); + cx.set_global(store); + theme::init(theme::LoadThemes::JustBase, cx); + crate::init(cx); + }); let base_text = indoc! {" hello "}; @@ -425,5 +432,6 @@ mod tests { let editor = cx.new_window_entity(|window, cx| { SplittableEditor::new_unsplit(multibuffer, project, workspace, window, cx) }); + } } diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index d70c770a2f75d2074e30e49e301a03b115ce99c3..ab590d4adb86b9c6df892af811adc24d9b4508a5 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -3321,12 +3321,6 @@ impl MultiBuffer { excerpt_buffer_start + edit.new.end.saturating_sub(excerpt_start); let edit_buffer_end = edit_buffer_end.min(excerpt_buffer_end); - if excerpts.end() <= edit.new.end { - excerpts.next(); - } else { - break; - } - if let Some(main_buffer) = &diff.main_buffer { for hunk in diff.hunks_intersecting_base_text_range( edit_buffer_start..edit_buffer_end, @@ -3359,104 +3353,110 @@ impl MultiBuffer { Some((hunk_excerpt_end.min(excerpt_end), hunk_info)); } } - continue; - } - - let edit_anchor_range = - buffer.anchor_before(edit_buffer_start)..buffer.anchor_after(edit_buffer_end); - for hunk in diff.hunks_intersecting_range(edit_anchor_range, buffer) { - if hunk.is_created_file() && !all_diff_hunks_expanded { - continue; - } - - let hunk_buffer_range = hunk.buffer_range.to_offset(buffer); - if hunk_buffer_range.start < excerpt_buffer_start { - log::trace!("skipping hunk that starts before excerpt"); - continue; - } - - let hunk_info = DiffTransformHunkInfo { - excerpt_id: excerpt.id, - hunk_start_anchor: hunk.buffer_range.start, - hunk_secondary_status: hunk.secondary_status, - is_logically_deleted: false, - }; + } else { + let edit_anchor_range = buffer.anchor_before(edit_buffer_start) + ..buffer.anchor_after(edit_buffer_end); + for hunk in diff.hunks_intersecting_range(edit_anchor_range, buffer) { + if hunk.is_created_file() && !all_diff_hunks_expanded { + continue; + } - let hunk_excerpt_start = excerpt_start - + hunk_buffer_range.start.saturating_sub(excerpt_buffer_start); - let hunk_excerpt_end = excerpt_end - .min(excerpt_start + (hunk_buffer_range.end - excerpt_buffer_start)); + let hunk_buffer_range = hunk.buffer_range.to_offset(buffer); + if hunk_buffer_range.start < excerpt_buffer_start { + log::trace!("skipping hunk that starts before excerpt"); + continue; + } - Self::push_buffer_content_transform( - snapshot, - new_diff_transforms, - hunk_excerpt_start, - *end_of_current_insert, - ); + let hunk_info = DiffTransformHunkInfo { + excerpt_id: excerpt.id, + hunk_start_anchor: hunk.buffer_range.start, + hunk_secondary_status: hunk.secondary_status, + is_logically_deleted: false, + }; - // For every existing hunk, determine if it was previously expanded - // and if it should currently be expanded. - let was_previously_expanded = old_expanded_hunks.contains(&hunk_info); - let should_expand_hunk = match &change_kind { - DiffChangeKind::DiffUpdated { base_changed: true } => { - was_previously_expanded || all_diff_hunks_expanded - } - DiffChangeKind::ExpandOrCollapseHunks { expand } => { - let intersects = hunk_buffer_range.is_empty() - || hunk_buffer_range.end > edit_buffer_start; - if *expand { - intersects || was_previously_expanded || all_diff_hunks_expanded - } else { - !intersects && (was_previously_expanded || all_diff_hunks_expanded) - } - } - _ => was_previously_expanded || all_diff_hunks_expanded, - }; + let hunk_excerpt_start = excerpt_start + + hunk_buffer_range.start.saturating_sub(excerpt_buffer_start); + let hunk_excerpt_end = excerpt_end + .min(excerpt_start + (hunk_buffer_range.end - excerpt_buffer_start)); - if should_expand_hunk { - did_expand_hunks = true; - log::trace!( - "expanding hunk {:?}, excerpt:{:?}", - hunk_excerpt_start..hunk_excerpt_end, - excerpt.id + Self::push_buffer_content_transform( + snapshot, + new_diff_transforms, + hunk_excerpt_start, + *end_of_current_insert, ); - if !hunk.diff_base_byte_range.is_empty() - && hunk_buffer_range.start >= edit_buffer_start - && hunk_buffer_range.start <= excerpt_buffer_end - && snapshot.show_deleted_hunks - { - let base_text = diff.base_text(); - let mut text_cursor = - base_text.as_rope().cursor(hunk.diff_base_byte_range.start); - let mut base_text_summary = - text_cursor.summary::(hunk.diff_base_byte_range.end); - - let mut has_trailing_newline = false; - if base_text_summary.last_line_chars > 0 { - base_text_summary += TextSummary::newline(); - has_trailing_newline = true; + // For every existing hunk, determine if it was previously expanded + // and if it should currently be expanded. + let was_previously_expanded = old_expanded_hunks.contains(&hunk_info); + let should_expand_hunk = match &change_kind { + DiffChangeKind::DiffUpdated { base_changed: true } => { + was_previously_expanded || all_diff_hunks_expanded + } + DiffChangeKind::ExpandOrCollapseHunks { expand } => { + let intersects = hunk_buffer_range.is_empty() + || hunk_buffer_range.end > edit_buffer_start; + if *expand { + intersects || was_previously_expanded || all_diff_hunks_expanded + } else { + !intersects + && (was_previously_expanded || all_diff_hunks_expanded) + } } + _ => was_previously_expanded || all_diff_hunks_expanded, + }; - new_diff_transforms.push( - DiffTransform::DeletedHunk { - base_text_byte_range: hunk.diff_base_byte_range.clone(), - summary: base_text_summary, - buffer_id: excerpt.buffer_id, - hunk_info, - has_trailing_newline, - }, - (), + if should_expand_hunk { + did_expand_hunks = true; + log::trace!( + "expanding hunk {:?}, excerpt:{:?}", + hunk_excerpt_start..hunk_excerpt_end, + excerpt.id ); - } - if !hunk_buffer_range.is_empty() { - *end_of_current_insert = - Some((hunk_excerpt_end.min(excerpt_end), hunk_info)); + if !hunk.diff_base_byte_range.is_empty() + && hunk_buffer_range.start >= edit_buffer_start + && hunk_buffer_range.start <= excerpt_buffer_end + && snapshot.show_deleted_hunks + { + let base_text = diff.base_text(); + let mut text_cursor = + base_text.as_rope().cursor(hunk.diff_base_byte_range.start); + let mut base_text_summary = text_cursor + .summary::(hunk.diff_base_byte_range.end); + + let mut has_trailing_newline = false; + if base_text_summary.last_line_chars > 0 { + base_text_summary += TextSummary::newline(); + has_trailing_newline = true; + } + + new_diff_transforms.push( + DiffTransform::DeletedHunk { + base_text_byte_range: hunk.diff_base_byte_range.clone(), + summary: base_text_summary, + buffer_id: excerpt.buffer_id, + hunk_info, + has_trailing_newline, + }, + (), + ); + } + + if !hunk_buffer_range.is_empty() { + *end_of_current_insert = + Some((hunk_excerpt_end.min(excerpt_end), hunk_info)); + } } } } } + + if excerpts.end() <= edit.new.end { + excerpts.next(); + } else { + break; + } } did_expand_hunks || !old_expanded_hunks.is_empty()