diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index ced92c6e13..45ecc37b77 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -746,7 +746,7 @@ impl DisplayRow { DisplayRow(display_row) } - pub fn to_line_span(&self, display_map: &DisplaySnapshot) -> Range { + pub fn to_points(&self, display_map: &DisplaySnapshot) -> Range { self.start()..self.end(&display_map) } @@ -762,11 +762,6 @@ impl DisplayRow { } } - // TODO: Remove and use next_row - fn next_unchecked(&self) -> Option { - Some(DisplayRow(self.0 + 1)) - } - pub fn next_rows( &self, display_map: &DisplaySnapshot, @@ -788,7 +783,7 @@ impl DisplayRow { if current == None { current = Some(start); } else { - current = current.unwrap().next_unchecked(); + current = Some(DisplayRow(current.unwrap().0 + 1)) } if current.unwrap().0 > end_row.0 { None diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index b185ddef92..3d88c69ebd 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -85,7 +85,7 @@ use std::{ }; pub use sum_tree::Bias; use theme::{DiagnosticStyle, Theme}; -use util::{post_inc, MapRangeEndsExt, RangeExt, ResultExt, TryFutureExt}; +use util::{post_inc, RangeExt, ResultExt, TryFutureExt}; use workspace::{ItemNavHistory, ViewId, Workspace, WorkspaceId}; use crate::git::diff_hunk_to_display; @@ -5738,7 +5738,7 @@ impl Editor { let fold_range = display_map .foldable_range(DisplayRow::new(row)) .map(|range| { - range.map_range(|display_point| display_point.to_point(&display_map)) + range.start.to_point(&display_map)..range.end.to_point(&display_map) }); if let Some(fold_range) = fold_range { @@ -5761,29 +5761,23 @@ impl Editor { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); if let Some(fold_range) = display_map.foldable_range(display_row) { - let autoscroll = self.selections_intersect(&fold_range, &display_map, cx); + let autoscroll = { + let selections = self.selections.all::(cx); - let point_range = - fold_range.map_range(|display_point| display_point.to_point(&display_map)); + selections.iter().any(|selection| { + let display_range = selection.display_range(&display_map); - self.fold_ranges(std::iter::once(point_range), autoscroll, cx); + fold_range.overlaps(&display_range) + }) + }; + + let fold_range = + fold_range.start.to_point(&display_map)..fold_range.end.to_point(&display_map); + + self.fold_ranges(std::iter::once(fold_range), autoscroll, cx); } } - fn selections_intersect( - &mut self, - range: &Range, - display_map: &DisplaySnapshot, - cx: &mut ViewContext, - ) -> bool { - let selections = self.selections.all::(cx); - - selections.iter().any(|selection| { - let display_range = selection.display_range(display_map); - range.contains(&display_range.start) || range.contains(&display_range.end) - }) - } - pub fn unfold_lines(&mut self, _: &UnfoldLines, cx: &mut ViewContext) { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let buffer = &display_map.buffer_snapshot; @@ -5805,12 +5799,19 @@ impl Editor { pub fn unfold_at(&mut self, fold_at: &UnfoldAt, cx: &mut ViewContext) { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - let unfold_range = fold_at.display_row.to_line_span(&display_map); + let unfold_range = fold_at.display_row.to_points(&display_map); - let autoscroll = self.selections_intersect(&unfold_range, &display_map, cx); + let autoscroll = { + let selections = self.selections.all::(cx); + selections.iter().any(|selection| { + let display_range = selection.display_range(&display_map); - let unfold_range = unfold_range.map_range(|endpoint| endpoint.to_point(&display_map)); + unfold_range.overlaps(&display_range) + }) + }; + let unfold_range = + unfold_range.start.to_point(&display_map)..unfold_range.end.to_point(&display_map); self.unfold_ranges(std::iter::once(unfold_range), true, autoscroll, cx) } diff --git a/crates/util/src/util.rs b/crates/util/src/util.rs index c0f08ac32e..5ecf889f9b 100644 --- a/crates/util/src/util.rs +++ b/crates/util/src/util.rs @@ -145,23 +145,6 @@ where } } -pub trait MapRangeEndsExt { - fn map_range(self, f: F) -> Range - where - Self: Sized, - F: Fn(R) -> T; -} - -impl MapRangeEndsExt for Range { - fn map_range(self, f: F) -> Range - where - Self: Sized, - F: Fn(R) -> T, - { - f(self.start)..f(self.end) - } -} - pub struct LogErrorFuture(F, log::Level); impl Future for LogErrorFuture @@ -254,7 +237,7 @@ macro_rules! iife { }; } -/// Async lImmediately invoked function expression. Good for using the ? operator +/// Async Immediately invoked function expression. Good for using the ? operator /// in functions which do not return an Option or Result. Async version of above #[macro_export] macro_rules! async_iife { @@ -279,10 +262,7 @@ impl RangeExt for Range { } fn overlaps(&self, other: &Range) -> bool { - self.contains(&other.start) - || self.contains(&other.end) - || other.contains(&self.start) - || other.contains(&self.end) + self.start < other.end && other.start < self.end } } @@ -296,10 +276,7 @@ impl RangeExt for RangeInclusive { } fn overlaps(&self, other: &Range) -> bool { - self.contains(&other.start) - || self.contains(&other.end) - || other.contains(&self.start()) - || other.contains(&self.end()) + self.start() < &other.end && &other.start <= self.end() } }