diff --git a/crates/buffer_diff/src/buffer_diff.rs b/crates/buffer_diff/src/buffer_diff.rs index 60986f6e5f24b4e3cd99843361c621ebaf060fa8..0fe240d04a1e6f6bf52a74b77592123914962641 100644 --- a/crates/buffer_diff/src/buffer_diff.rs +++ b/crates/buffer_diff/src/buffer_diff.rs @@ -2135,6 +2135,11 @@ mod tests { compare_hunks(&diff_1.inner.hunks, &empty_diff.inner.hunks, &buffer); let range = range.unwrap(); assert_eq!(range.to_point(&buffer), Point::new(0, 0)..Point::new(8, 0)); + let base_text_range = base_text_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_1.base_text()), + Point::new(0, 0)..Point::new(10, 0) + ); // Edit does not affect the diff. buffer.edit_via_marked_text( @@ -2171,11 +2176,15 @@ mod tests { .unindent(), ); let diff_3 = BufferDiffSnapshot::new_sync(buffer.clone(), base_text.clone(), cx); - // FIXME assert the other range let (range, base_text_range) = compare_hunks(&diff_3.inner.hunks, &diff_2.inner.hunks, &buffer); let range = range.unwrap(); assert_eq!(range.to_point(&buffer), Point::new(1, 0)..Point::new(2, 0)); + let base_text_range = base_text_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_3.base_text()), + Point::new(2, 0)..Point::new(4, 0) + ); // Edit turns a modification hunk into a deletion. buffer.edit_via_marked_text( @@ -2195,6 +2204,11 @@ mod tests { compare_hunks(&diff_4.inner.hunks, &diff_3.inner.hunks, &buffer); let range = range.unwrap(); assert_eq!(range.to_point(&buffer), Point::new(3, 4)..Point::new(4, 0)); + let base_text_range = base_text_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_4.base_text()), + Point::new(6, 0)..Point::new(7, 0) + ); // Edit introduces a new insertion hunk. buffer.edit_via_marked_text( @@ -2215,6 +2229,11 @@ mod tests { compare_hunks(&diff_5.inner.hunks, &diff_4.inner.hunks, &buffer); let range = range.unwrap(); assert_eq!(range.to_point(&buffer), Point::new(3, 0)..Point::new(4, 0)); + let base_text_range = base_text_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_5.base_text()), + Point::new(5, 0)..Point::new(5, 0) + ); // Edit removes a hunk. buffer.edit_via_marked_text( @@ -2235,6 +2254,11 @@ mod tests { compare_hunks(&diff_6.inner.hunks, &diff_5.inner.hunks, &buffer); let range = range.unwrap(); assert_eq!(range.to_point(&buffer), Point::new(7, 0)..Point::new(8, 0)); + let base_text_range = base_text_range.unwrap(); + assert_eq!( + base_text_range.to_point(diff_6.base_text()), + Point::new(9, 0)..Point::new(10, 0) + ); } #[gpui::test(iterations = 100)] diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c223f8d21667beec05ae3cc6764bf887d20dd424..c18c01ca099891cfc1b15ff870839708adc56be6 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1192,6 +1192,7 @@ pub struct Editor { hide_mouse_mode: HideMouseMode, pub change_list: ChangeList, inline_value_cache: InlineValueCache, + number_deleted_lines: bool, selection_drag_state: SelectionDragState, colors: Option, @@ -1237,6 +1238,7 @@ pub struct EditorSnapshot { pub mode: EditorMode, show_gutter: bool, show_line_numbers: Option, + number_deleted_lines: bool, show_git_diff_gutter: Option, show_code_actions: Option, show_runnables: Option, @@ -2350,6 +2352,7 @@ impl Editor { applicable_language_settings: HashMap::default(), accent_overrides: Vec::new(), fetched_tree_sitter_chunks: HashMap::default(), + number_deleted_lines: false, }; if is_minimap { @@ -2881,6 +2884,7 @@ impl Editor { mode: self.mode.clone(), show_gutter: self.show_gutter, show_line_numbers: self.show_line_numbers, + number_deleted_lines: self.number_deleted_lines, show_git_diff_gutter: self.show_git_diff_gutter, show_code_actions: self.show_code_actions, show_runnables: self.show_runnables, diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 97b436231b9f6777edfece8ab1d65d08804c9608..5e23b41547b6720271d156473900b642779aa48d 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -3278,14 +3278,14 @@ impl EditorElement { row_info.buffer_row? + 1 }; let relative_number = relative_rows.get(&display_row); - // FIXME - // if !(relative_line_numbers_enabled && relative_number.is_some()) - // && row_info - // .diff_status - // .is_some_and(|status| status.is_deleted()) - // { - // return None; - // } + if !(relative_line_numbers_enabled && relative_number.is_some()) + && !snapshot.number_deleted_lines + && row_info + .diff_status + .is_some_and(|status| status.is_deleted()) + { + return None; + } let number = relative_number.unwrap_or(&non_relative_number); write!(&mut line_number, "{number}").unwrap(); diff --git a/crates/editor/src/split.rs b/crates/editor/src/split.rs index db93fa458edaf85f573626a3638a64e0066ec13f..a96f06ba05f924c2f3af75ee185c0bfb85cc6962 100644 --- a/crates/editor/src/split.rs +++ b/crates/editor/src/split.rs @@ -146,7 +146,10 @@ impl SplittableEditor { multibuffer.set_all_diff_hunks_expanded(cx); multibuffer }); - Editor::for_multibuffer(multibuffer, Some(project.clone()), window, cx) + let mut editor = + Editor::for_multibuffer(multibuffer, Some(project.clone()), window, cx); + editor.number_deleted_lines = true; + editor }); let secondary_pane = cx.new(|cx| { let mut pane = Pane::new(