From 63cfcc26fb8d27d0858149420586d28ff75c9fc7 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 24 Feb 2025 15:56:11 -0700 Subject: [PATCH] Fix jumping to multibuffer excerpts from deleted hunks (#25512) Co-authored-by: Anthony Eid Release Notes: - N/A Co-authored-by: Anthony Eid --- crates/editor/src/editor.rs | 48 +++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index eb83b8b5a0c6adb340ef747d37d86afd815231ac..d24b43ea0fbfe5cce5b62b8214b9d3080c9ace7d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -15340,27 +15340,39 @@ impl Editor { let selections = self.selections.all::(cx); let multi_buffer = self.buffer.read(cx); for selection in selections { - for (buffer, mut range, _) in multi_buffer + for (snapshot, range, _, anchor) in multi_buffer .snapshot(cx) - .range_to_buffer_ranges(selection.range()) + .range_to_buffer_ranges_with_deleted_hunks(selection.range()) { - // When editing branch buffers, jump to the corresponding location - // in their base buffer. - let mut buffer_handle = multi_buffer.buffer(buffer.remote_id()).unwrap(); - let buffer = buffer_handle.read(cx); - if let Some(base_buffer) = buffer.base_buffer() { - range = buffer.range_to_version(range, &base_buffer.read(cx).version()); - buffer_handle = base_buffer; - } - - if selection.reversed { - mem::swap(&mut range.start, &mut range.end); + if let Some(anchor) = anchor { + // selection is in a deleted hunk + let Some(buffer_id) = anchor.buffer_id else { + continue; + }; + let Some(buffer_handle) = multi_buffer.buffer(buffer_id) else { + continue; + }; + let offset = text::ToOffset::to_offset( + &anchor.text_anchor, + &buffer_handle.read(cx).snapshot(), + ); + let range = offset..offset; + new_selections_by_buffer + .entry(buffer_handle) + .or_insert((Vec::new(), None)) + .0 + .push(range) + } else { + let Some(buffer_handle) = multi_buffer.buffer(snapshot.remote_id()) + else { + continue; + }; + new_selections_by_buffer + .entry(buffer_handle) + .or_insert((Vec::new(), None)) + .0 + .push(range) } - new_selections_by_buffer - .entry(buffer_handle) - .or_insert((Vec::new(), None)) - .0 - .push(range) } } }