Revert splitting display diff hunks (#25020)

This PR reverts two recent commits that changed our gutter highlights to
mark separately the deleted and added portions of an expanded
modification hunk. It returns to the previous status quo where the
gutter highlight for an expanded modification hunk has the same color
for the deleted and added portions.

Release Notes:

- N/A
This commit is contained in:
Cole Miller 2025-02-17 23:45:37 -05:00 committed by GitHub
parent 93efb57c75
commit 06726a28d3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -79,19 +79,17 @@ use workspace::{item::Item, notifications::NotifyTaskExt, Workspace};
const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.; const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.;
/// Note that for a "modified" MultiBufferDiffHunk, there are two DisplayDiffHunks,
/// one for the deleted portion and one for the added portion.
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
enum DisplayDiffHunk { enum DisplayDiffHunk {
Folded { Folded {
display_row: DisplayRow, display_row: DisplayRow,
}, },
Unfolded { Unfolded {
diff_base_byte_range: Range<usize>,
display_row_range: Range<DisplayRow>, display_row_range: Range<DisplayRow>,
multi_buffer_range: Range<Anchor>, multi_buffer_range: Range<Anchor>,
status: DiffHunkStatus, status: DiffHunkStatus,
expanded: bool, contains_expanded: bool,
is_primary: bool,
}, },
} }
@ -106,7 +104,7 @@ struct SelectionLayout {
} }
impl SelectionLayout { impl SelectionLayout {
fn new<T: multi_buffer::ToPoint + ToDisplayPoint + Clone>( fn new<T: ToPoint + ToDisplayPoint + Clone>(
selection: Selection<T>, selection: Selection<T>,
line_mode: bool, line_mode: bool,
cursor_shape: CursorShape, cursor_shape: CursorShape,
@ -1562,100 +1560,36 @@ impl EditorElement {
let hunk_end_point = Point::new(hunk.row_range.end.0, 0); let hunk_end_point = Point::new(hunk.row_range.end.0, 0);
let hunk_display_start = snapshot.point_to_display_point(hunk_start_point, Bias::Left); let hunk_display_start = snapshot.point_to_display_point(hunk_start_point, Bias::Left);
let hunk_added_start_at =
Anchor::in_buffer(hunk.excerpt_id, hunk.buffer_id, hunk.buffer_range.start);
let hunk_deleted_to_added_break = snapshot.point_to_display_point(
hunk_added_start_at.to_point(&snapshot.buffer_snapshot),
Bias::Right,
);
let hunk_display_end = snapshot.point_to_display_point(hunk_end_point, Bias::Right); let hunk_display_end = snapshot.point_to_display_point(hunk_end_point, Bias::Right);
if hunk_display_start.column() != 0 { let display_hunk = if hunk_display_start.column() != 0 {
display_hunks.push(( DisplayDiffHunk::Folded {
DisplayDiffHunk::Folded { display_row: hunk_display_start.row(),
display_row: hunk_display_start.row(), }
},
None,
));
} else { } else {
let mut end_row = hunk_display_end.row(); let mut end_row = hunk_display_end.row();
if hunk_display_end.column() > 0 { if hunk_display_end.column() > 0 {
end_row.0 += 1; end_row.0 += 1;
} }
let deleted_count = snapshot let start_row = hunk_display_start.row();
.buffer_snapshot let contains_expanded = snapshot
.row_infos(hunk.row_range.start) .row_infos(start_row)
.take(hunk.row_range.end.0 as usize - hunk.row_range.start.0 as usize) .take(end_row.0 as usize - start_row.0 as usize)
.take_while(|row_info| { .any(|row_info| row_info.diff_status.is_some());
matches!(row_info.diff_status, Some(DiffHunkStatus::Removed(_))) DisplayDiffHunk::Unfolded {
}) status: hunk.status(),
.count(); diff_base_byte_range: hunk.diff_base_byte_range,
let has_added = snapshot display_row_range: hunk_display_start.row()..end_row,
.buffer_snapshot multi_buffer_range: Anchor::range_in_buffer(
.row_infos(hunk.row_range.start) hunk.excerpt_id,
.take(hunk.row_range.end.0 as usize - hunk.row_range.start.0 as usize) hunk.buffer_id,
.any(|row_info| matches!(row_info.diff_status, Some(DiffHunkStatus::Added(_)))); hunk.buffer_range,
let expanded = deleted_count > 0 || has_added; ),
if deleted_count > 0 && has_added { contains_expanded,
display_hunks.push((
DisplayDiffHunk::Unfolded {
status: DiffHunkStatus::Removed(hunk.secondary_status),
display_row_range: hunk_display_start.row()
..hunk_display_start.row() + DisplayRow(deleted_count as u32),
multi_buffer_range: Anchor::range_in_buffer(
hunk.excerpt_id,
hunk.buffer_id,
hunk.buffer_range.clone(),
),
expanded,
is_primary: true,
},
None,
));
display_hunks.push((
DisplayDiffHunk::Unfolded {
status: DiffHunkStatus::Added(hunk.secondary_status),
display_row_range: hunk_display_start.row()
+ DisplayRow(deleted_count as u32)
..end_row,
multi_buffer_range: Anchor::range_in_buffer(
hunk.excerpt_id,
hunk.buffer_id,
hunk.buffer_range,
),
expanded,
is_primary: false,
},
None,
));
} else {
let status = if expanded && matches!(hunk.status(), DiffHunkStatus::Modified(_))
{
if hunk_display_start.row() < hunk_deleted_to_added_break.row() {
DiffHunkStatus::Removed(hunk.secondary_status)
} else {
DiffHunkStatus::Added(hunk.secondary_status)
}
} else {
hunk.status()
};
display_hunks.push((
DisplayDiffHunk::Unfolded {
status,
display_row_range: hunk_display_start.row()..end_row,
multi_buffer_range: Anchor::range_in_buffer(
hunk.excerpt_id,
hunk.buffer_id,
hunk.buffer_range,
),
expanded,
is_primary: true,
},
None,
));
} }
}; };
display_hunks.push((display_hunk, None));
} }
let git_gutter_setting = ProjectSettings::get_global(cx) let git_gutter_setting = ProjectSettings::get_global(cx)
@ -1993,8 +1927,7 @@ impl EditorElement {
if tasks.offset.0 < offset_range_start || tasks.offset.0 >= offset_range_end { if tasks.offset.0 < offset_range_start || tasks.offset.0 >= offset_range_end {
return None; return None;
} }
let multibuffer_point = let multibuffer_point = tasks.offset.0.to_point(&snapshot.buffer_snapshot);
multi_buffer::ToPoint::to_point(&tasks.offset.0, &snapshot.buffer_snapshot);
let multibuffer_row = MultiBufferRow(multibuffer_point.row); let multibuffer_row = MultiBufferRow(multibuffer_point.row);
let buffer_folded = snapshot let buffer_folded = snapshot
.buffer_snapshot .buffer_snapshot
@ -4213,29 +4146,14 @@ impl EditorElement {
newest_cursor_position, newest_cursor_position,
]; ];
let mut display_hunks = display_hunks.iter().peekable(); for (hunk, _) in display_hunks {
while let Some((hunk, _)) = display_hunks.next() {
if let DisplayDiffHunk::Unfolded { if let DisplayDiffHunk::Unfolded {
display_row_range, display_row_range,
multi_buffer_range, multi_buffer_range,
status, status,
is_primary: true,
.. ..
} = &hunk } = &hunk
{ {
let mut display_row_range = display_row_range.clone();
if let Some((
DisplayDiffHunk::Unfolded {
display_row_range: secondary_display_row_range,
is_primary: false,
..
},
_,
)) = display_hunks.peek()
{
display_row_range.end = secondary_display_row_range.end;
}
if display_row_range.start < row_range.start if display_row_range.start < row_range.start
|| display_row_range.start >= row_range.end || display_row_range.start >= row_range.end
{ {
@ -4665,7 +4583,7 @@ impl EditorElement {
DisplayDiffHunk::Unfolded { DisplayDiffHunk::Unfolded {
status, status,
display_row_range, display_row_range,
expanded, contains_expanded,
.. ..
} => hitbox.as_ref().map(|hunk_hitbox| match status { } => hitbox.as_ref().map(|hunk_hitbox| match status {
DiffHunkStatus::Added(secondary_status) => ( DiffHunkStatus::Added(secondary_status) => (
@ -4673,14 +4591,14 @@ impl EditorElement {
cx.theme().colors().version_control_added.opacity(0.7), cx.theme().colors().version_control_added.opacity(0.7),
corners, corners,
secondary_status, secondary_status,
*expanded, *contains_expanded,
), ),
DiffHunkStatus::Modified(secondary_status) => ( DiffHunkStatus::Modified(secondary_status) => (
hunk_hitbox.bounds, hunk_hitbox.bounds,
cx.theme().colors().version_control_modified.opacity(0.7), cx.theme().colors().version_control_modified.opacity(0.7),
corners, corners,
secondary_status, secondary_status,
*expanded, *contains_expanded,
), ),
DiffHunkStatus::Removed(secondary_status) DiffHunkStatus::Removed(secondary_status)
if !display_row_range.is_empty() => if !display_row_range.is_empty() =>
@ -4690,7 +4608,7 @@ impl EditorElement {
cx.theme().colors().version_control_deleted.opacity(0.7), cx.theme().colors().version_control_deleted.opacity(0.7),
corners, corners,
secondary_status, secondary_status,
*expanded, *contains_expanded,
) )
} }
DiffHunkStatus::Removed(secondary_status) => ( DiffHunkStatus::Removed(secondary_status) => (
@ -4704,7 +4622,7 @@ impl EditorElement {
cx.theme().colors().version_control_deleted.opacity(0.7), cx.theme().colors().version_control_deleted.opacity(0.7),
Corners::all(1. * line_height), Corners::all(1. * line_height),
secondary_status, secondary_status,
*expanded, *contains_expanded,
), ),
}), }),
}; };
@ -4714,15 +4632,16 @@ impl EditorElement {
background_color, background_color,
corner_radii, corner_radii,
secondary_status, secondary_status,
expanded, contains_expanded,
)) = hunk_to_paint )) = hunk_to_paint
{ {
let background = let background = if *secondary_status != DiffHunkSecondaryStatus::None
if *secondary_status != DiffHunkSecondaryStatus::None && expanded { && contains_expanded
pattern_slash(background_color, line_height.0 / 2.5) {
} else { pattern_slash(background_color, line_height.0 / 2.5)
solid_color(background_color) } else {
}; solid_color(background_color)
};
window.paint_quad(quad( window.paint_quad(quad(
hunk_bounds, hunk_bounds,