editor: Fix relative line numbers breaking with nested folds (#47035) (cherry-pick to preview) (#47107)

zed-zippy[bot] and Finn Evers created

Cherry-pick of #47035 to preview

----
Closes #46516

The previous fix only worked for non-nested folds, whereas this one also
considers nested folds properly. Also makes this more straightforward to
read.

Release Notes:

- Fixed an issue where relative line numbering would break with nested
folds.

Co-authored-by: Finn Evers <finn@zed.dev>

Change summary

crates/editor/src/editor.rs | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -25738,22 +25738,18 @@ impl EditorSnapshot {
             let wrap_row = wrap_snapshot
                 .make_wrap_point(first_visible_row, Bias::Left)
                 .row();
+
             wrap_row.0 as i64 - base_wrap_row.0 as i64
         } else {
-            let folds = if current_selection_head < first_visible_row {
-                self.folds_in_range(current_selection_head..first_visible_row)
-            } else {
-                self.folds_in_range(first_visible_row..current_selection_head)
-            };
-
-            let folded_lines = folds
-                .map(|fold| {
-                    let range = fold.range.0.to_point(self);
-                    range.end.row.saturating_sub(range.start.row)
-                })
-                .sum::<u32>() as i64;
+            let fold_snapshot = self.fold_snapshot();
+            let base_fold_row = fold_snapshot
+                .to_fold_point(self.to_inlay_point(current_selection_head), Bias::Left)
+                .row();
+            let fold_row = fold_snapshot
+                .to_fold_point(self.to_inlay_point(first_visible_row), Bias::Left)
+                .row();
 
-            first_visible_row.row as i64 - current_selection_head.row as i64 + folded_lines
+            fold_row as i64 - base_fold_row as i64
         }
     }