Fix jumping to multibuffer excerpts from deleted hunks (#25512)

Co-authored-by: Anthony Eid <hello@anthonyeid.me>

Release Notes:

- N/A

Co-authored-by: Anthony Eid <hello@anthonyeid.me>
This commit is contained in:
Conrad Irwin 2025-02-24 15:56:11 -07:00 committed by GitHub
parent 53a5145dc8
commit 63cfcc26fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -15340,27 +15340,39 @@ impl Editor {
let selections = self.selections.all::<usize>(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 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)
}
if selection.reversed {
mem::swap(&mut range.start, &mut range.end);
}
new_selections_by_buffer
.entry(buffer_handle)
.or_insert((Vec::new(), None))
.0
.push(range)
}
}
}