@@ -27677,7 +27677,6 @@ impl EditorSnapshot {
) -> HashMap<DisplayRow, u32> {
let initial_offset =
self.relative_line_delta(current_selection_head, rows.start, count_wrapped_lines);
- let current_selection_point = current_selection_head.as_display_point().to_point(self);
self.row_infos(rows.start)
.take(rows.len())
@@ -27688,23 +27687,19 @@ impl EditorSnapshot {
|| (count_wrapped_lines && row_info.wrapped_buffer_row.is_some())
})
.enumerate()
- .filter(|(_, (row, row_info))| {
- // We want to check here that
- // - the row is not the current selection head to ensure the current
- // line has absolute numbering
- // - similarly, should the selection head live in a soft-wrapped line
- // and we are not counting those, that the parent line keeps its
- // absolute number
- // - lastly, if we are in a deleted line, it is fine to number this
+ .filter_map(|(i, (row, row_info))| {
+ // We want to ensure here that the current line has absolute
+ // numbering, even if we are in a soft-wrapped line. With the
+ // exception that if we are in a deleted line, we should number this
// relative with 0, as otherwise it would have no line number at all
- (*row != current_selection_head
- && (count_wrapped_lines
- || row_info.buffer_row != Some(current_selection_point.row)))
+ let relative_line_number = (initial_offset + i as i64).unsigned_abs() as u32;
+
+ (relative_line_number != 0
|| row_info
.diff_status
- .is_some_and(|status| status.is_deleted())
+ .is_some_and(|status| status.is_deleted()))
+ .then_some((row, relative_line_number))
})
- .map(|(i, (row, _))| (row, (initial_offset + i as i64).unsigned_abs() as u32))
.collect()
}
}
@@ -29572,6 +29572,7 @@ fn test_relative_line_numbers(cx: &mut TestAppContext) {
.into_iter()
.enumerate()
.map(|(i, row)| (DisplayRow(row), i.abs_diff(base_row) as u32))
+ .filter(|(_, relative_line_number)| *relative_line_number != 0)
.collect_vec();
let actual_relative_numbers = snapshot
.calculate_relative_line_numbers(