Fix rendering of gutter diff hunks that extend to EOF, w/o newline (#23790)

Max Brunsfeld created

Release Notes:

- N/A

Change summary

crates/editor/src/element.rs | 31 +++++++++++++------------------
1 file changed, 13 insertions(+), 18 deletions(-)

Detailed changes

crates/editor/src/element.rs 🔗

@@ -78,7 +78,7 @@ use workspace::{item::Item, notifications::NotifyTaskExt, Workspace};
 const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.;
 
 #[derive(Debug, Clone, PartialEq, Eq)]
-pub enum DisplayDiffHunk {
+enum DisplayDiffHunk {
     Folded {
         display_row: DisplayRow,
     },
@@ -1552,16 +1552,19 @@ impl EditorElement {
             let hunk_display_start = snapshot.point_to_display_point(hunk_start_point, Bias::Left);
             let hunk_display_end = snapshot.point_to_display_point(hunk_end_point, Bias::Right);
 
-            let display_hunk = if hunk_display_start.column() != 0 || hunk_display_end.column() != 0
-            {
+            let display_hunk = if hunk_display_start.column() != 0 {
                 DisplayDiffHunk::Folded {
                     display_row: hunk_display_start.row(),
                 }
             } else {
+                let mut end_row = hunk_display_end.row();
+                if hunk_display_end.column() > 0 {
+                    end_row.0 += 1;
+                }
                 DisplayDiffHunk::Unfolded {
                     status: hunk.status(),
                     diff_base_byte_range: hunk.diff_base_byte_range,
-                    display_row_range: hunk_display_start.row()..hunk_display_end.row(),
+                    display_row_range: hunk_display_start.row()..end_row,
                     multi_buffer_range: Anchor::range_in_buffer(
                         hunk.excerpt_id,
                         hunk.buffer_id,
@@ -4225,7 +4228,7 @@ impl EditorElement {
         });
     }
 
-    pub(super) fn diff_hunk_bounds(
+    fn diff_hunk_bounds(
         snapshot: &EditorSnapshot,
         line_height: Pixels,
         gutter_bounds: Bounds<Pixels>,
@@ -4233,15 +4236,14 @@ impl EditorElement {
     ) -> Bounds<Pixels> {
         let scroll_position = snapshot.scroll_position();
         let scroll_top = scroll_position.y * line_height;
+        let gutter_strip_width = (0.275 * line_height).floor();
 
         match hunk {
             DisplayDiffHunk::Folded { display_row, .. } => {
                 let start_y = display_row.as_f32() * line_height - scroll_top;
                 let end_y = start_y + line_height;
-
-                let width = Self::diff_hunk_strip_width(line_height);
                 let highlight_origin = gutter_bounds.origin + point(px(0.), start_y);
-                let highlight_size = size(width, end_y - start_y);
+                let highlight_size = size(gutter_strip_width, end_y - start_y);
                 Bounds::new(highlight_origin, highlight_size)
             }
             DisplayDiffHunk::Unfolded {
@@ -4283,21 +4285,14 @@ impl EditorElement {
                     let start_y = start_row.as_f32() * line_height - scroll_top;
                     let end_y = end_row_in_current_excerpt.as_f32() * line_height - scroll_top;
 
-                    let width = Self::diff_hunk_strip_width(line_height);
                     let highlight_origin = gutter_bounds.origin + point(px(0.), start_y);
-                    let highlight_size = size(width, end_y - start_y);
+                    let highlight_size = size(gutter_strip_width, end_y - start_y);
                     Bounds::new(highlight_origin, highlight_size)
                 }
             }
         }
     }
 
-    /// Returns the width of the diff strip that will be displayed in the gutter.
-    pub(super) fn diff_hunk_strip_width(line_height: Pixels) -> Pixels {
-        // We floor the value to prevent pixel rounding.
-        (0.275 * line_height).floor()
-    }
-
     fn paint_gutter_indicators(
         &self,
         layout: &mut EditorLayout,
@@ -5213,7 +5208,7 @@ impl EditorElement {
             let editor = self.editor.clone();
             let text_hitbox = layout.text_hitbox.clone();
             let gutter_hitbox = layout.gutter_hitbox.clone();
-            let hovered_hunk =
+            let multi_buffer_range =
                 layout
                     .display_hunks
                     .iter()
@@ -5242,7 +5237,7 @@ impl EditorElement {
                             Self::mouse_left_down(
                                 editor,
                                 event,
-                                hovered_hunk.clone(),
+                                multi_buffer_range.clone(),
                                 &position_map,
                                 &text_hitbox,
                                 &gutter_hitbox,