Fix panic when multi-cursor edit attempted in deleted hunk (#23633)

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin 2025-01-24 16:14:19 -07:00 committed by GitHub
parent ba16b4eb65
commit b7c6ffa6c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 48 additions and 3 deletions

View file

@ -372,7 +372,6 @@ gpui::actions!(
ToggleAutoSignatureHelp,
ToggleGitBlame,
ToggleGitBlameInline,
ToggleSelectedDiffHunks,
ToggleIndentGuides,
ToggleInlayHints,
ToggleInlineCompletions,
@ -397,3 +396,4 @@ gpui::actions!(
action_as!(go_to_line, ToggleGoToLine as Toggle);
action_with_deprecated_aliases!(editor, OpenSelectedFilename, ["editor::OpenFile"]);
action_with_deprecated_aliases!(editor, ToggleSelectedDiffHunks, ["editor::ToggleDiffHunk"]);

View file

@ -3724,6 +3724,9 @@ impl Editor {
}
let position = self.selections.newest_anchor().head();
if position.diff_base_anchor.is_some() {
return;
}
let (buffer, buffer_position) =
if let Some(output) = self.buffer.read(cx).text_anchor_for_position(position, cx) {
output
@ -4391,6 +4394,9 @@ impl Editor {
fn refresh_code_actions(&mut self, cx: &mut ViewContext<Self>) -> Option<()> {
let buffer = self.buffer.read(cx);
let newest_selection = self.selections.newest_anchor().clone();
if newest_selection.head().diff_base_anchor.is_some() {
return None;
}
let (start_buffer, start) = buffer.text_anchor_for_position(newest_selection.start, cx)?;
let (end_buffer, end) = buffer.text_anchor_for_position(newest_selection.end, cx)?;
if start_buffer != end_buffer {

View file

@ -13229,6 +13229,45 @@ async fn test_toggling_adjacent_diff_hunks(cx: &mut TestAppContext) {
"}
.to_string(),
);
cx.set_state(indoc! { "
one
TWO
ˇthree
four
five
"});
cx.run_until_parked();
cx.update_editor(|editor, cx| {
editor.toggle_selected_diff_hunks(&Default::default(), cx);
});
cx.assert_state_with_diff(
indoc! { "
one
- two
+ TWO
ˇthree
four
five
"}
.to_string(),
);
cx.update_editor(|editor, cx| {
editor.move_up(&Default::default(), cx);
editor.move_up(&Default::default(), cx);
editor.toggle_selected_diff_hunks(&Default::default(), cx);
});
cx.assert_state_with_diff(
indoc! { "
one
ˇTWO
three
four
five
"}
.to_string(),
);
}
#[gpui::test]

View file

@ -796,7 +796,7 @@ impl MultiBuffer {
for (ix, (range, new_text)) in edits.into_iter().enumerate() {
let original_indent_column = original_indent_columns.get(ix).copied().unwrap_or(0);
cursor.seek_forward(&range.start);
cursor.seek(&range.start);
let mut start_region = cursor.region().expect("start offset out of bounds");
if !start_region.is_main_buffer {
cursor.next();
@ -2266,7 +2266,7 @@ impl MultiBuffer {
diff_hunk.buffer_range.start,
);
}
if diff_hunk.row_range.start.0 == peek_end.row
if diff_hunk.row_range.start.0 <= peek_end.row
&& diff_hunk.excerpt_id == end.excerpt_id
{
end = Anchor::in_buffer(