diff --git a/crates/buffer/src/anchor.rs b/crates/buffer/src/anchor.rs index 4fdd387be0..90a01dd102 100644 --- a/crates/buffer/src/anchor.rs +++ b/crates/buffer/src/anchor.rs @@ -19,7 +19,8 @@ pub struct Anchor { #[derive(Clone)] pub struct AnchorMap { pub(crate) version: clock::Global, - pub(crate) entries: Vec<((FullOffset, Bias), T)>, + pub(crate) bias: Bias, + pub(crate) entries: Vec<(FullOffset, T)>, } #[derive(Clone)] diff --git a/crates/buffer/src/lib.rs b/crates/buffer/src/lib.rs index 8d694a3c5b..b700d76773 100644 --- a/crates/buffer/src/lib.rs +++ b/crates/buffer/src/lib.rs @@ -519,11 +519,17 @@ impl Buffer { self.content().anchor_at(position, bias) } - pub fn anchor_range_set(&self, entries: E) -> AnchorRangeSet + pub fn anchor_range_set( + &self, + start_bias: Bias, + end_bias: Bias, + entries: E, + ) -> AnchorRangeSet where - E: IntoIterator>, + E: IntoIterator>, { - self.content().anchor_range_set(entries) + self.content() + .anchor_range_set(start_bias, end_bias, entries) } pub fn point_for_offset(&self, offset: usize) -> Result { @@ -1251,20 +1257,21 @@ impl Buffer { &self, selections: &[Selection], ) -> Arc> { - Arc::new( - self.content() - .anchor_range_map(selections.iter().map(|selection| { - let start = selection.start.to_offset(self); - let end = selection.end.to_offset(self); - let range = (start, Bias::Left)..(end, Bias::Left); - let state = SelectionState { - id: selection.id, - reversed: selection.reversed, - goal: selection.goal, - }; - (range, state) - })), - ) + Arc::new(self.content().anchor_range_map( + Bias::Left, + Bias::Left, + selections.iter().map(|selection| { + let start = selection.start.to_offset(self); + let end = selection.end.to_offset(self); + let range = start..end; + let state = SelectionState { + id: selection.id, + reversed: selection.reversed, + goal: selection.goal, + }; + (range, state) + }), + )) } pub fn update_selection_set( @@ -1764,8 +1771,8 @@ impl<'a> Content<'a> { let mut summary = D::default(); let mut rope_cursor = self.visible_text.cursor(0); let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>(); - map.entries.iter().map(move |((offset, bias), value)| { - cursor.seek_forward(&VersionedFullOffset::Offset(*offset), *bias, &cx); + map.entries.iter().map(move |(offset, value)| { + cursor.seek_forward(&VersionedFullOffset::Offset(*offset), map.bias, &cx); let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { *offset - cursor.start().0.full_offset() } else { @@ -1827,27 +1834,36 @@ impl<'a> Content<'a> { } } - pub fn anchor_map(&self, entries: E) -> AnchorMap + pub fn anchor_map(&self, bias: Bias, entries: E) -> AnchorMap where - E: IntoIterator, + E: IntoIterator, { let version = self.version.clone(); let mut cursor = self.fragments.cursor::(); let entries = entries .into_iter() - .map(|((offset, bias), value)| { + .map(|(offset, value)| { cursor.seek_forward(&offset, bias, &None); let full_offset = FullOffset(cursor.start().deleted + offset); - ((full_offset, bias), value) + (full_offset, value) }) .collect(); - AnchorMap { version, entries } + AnchorMap { + version, + bias, + entries, + } } - pub fn anchor_range_map(&self, entries: E) -> AnchorRangeMap + pub fn anchor_range_map( + &self, + start_bias: Bias, + end_bias: Bias, + entries: E, + ) -> AnchorRangeMap where - E: IntoIterator, T)>, + E: IntoIterator, T)>, { let version = self.version.clone(); let mut cursor = self.fragments.cursor::(); @@ -1855,8 +1871,8 @@ impl<'a> Content<'a> { .into_iter() .map(|(range, value)| { let Range { - start: (start_offset, start_bias), - end: (end_offset, end_bias), + start: start_offset, + end: end_offset, } = range; cursor.seek_forward(&start_offset, start_bias, &None); let full_start_offset = FullOffset(cursor.start().deleted + start_offset); @@ -1872,18 +1888,27 @@ impl<'a> Content<'a> { AnchorRangeMap { version, entries } } - pub fn anchor_set(&self, entries: E) -> AnchorSet + pub fn anchor_set(&self, bias: Bias, entries: E) -> AnchorSet where - E: IntoIterator, + E: IntoIterator, { - AnchorSet(self.anchor_map(entries.into_iter().map(|range| (range, ())))) + AnchorSet(self.anchor_map(bias, entries.into_iter().map(|range| (range, ())))) } - pub fn anchor_range_set(&self, entries: E) -> AnchorRangeSet + pub fn anchor_range_set( + &self, + start_bias: Bias, + end_bias: Bias, + entries: E, + ) -> AnchorRangeSet where - E: IntoIterator>, + E: IntoIterator>, { - AnchorRangeSet(self.anchor_range_map(entries.into_iter().map(|range| (range, ())))) + AnchorRangeSet(self.anchor_range_map( + start_bias, + end_bias, + entries.into_iter().map(|range| (range, ())), + )) } pub fn anchor_range_multimap( diff --git a/crates/editor/src/lib.rs b/crates/editor/src/lib.rs index 158b2823b4..fd020e8e1b 100644 --- a/crates/editor/src/lib.rs +++ b/crates/editor/src/lib.rs @@ -999,11 +999,15 @@ impl Editor { if pair.end.len() == 1 { let mut delta = 0; Some(BracketPairState { - ranges: buffer.anchor_range_set(selections.iter().map(move |selection| { - let offset = selection.start + delta; - delta += 1; - (offset, Bias::Left)..(offset, Bias::Right) - })), + ranges: buffer.anchor_range_set( + Bias::Left, + Bias::Right, + selections.iter().map(move |selection| { + let offset = selection.start + delta; + delta += 1; + offset..offset + }), + ), pair, }) } else { diff --git a/crates/language/src/lib.rs b/crates/language/src/lib.rs index a8914b9abe..749c51a4b4 100644 --- a/crates/language/src/lib.rs +++ b/crates/language/src/lib.rs @@ -1266,14 +1266,17 @@ impl Buffer { self.pending_autoindent.take(); let autoindent_request = if autoindent && self.language.is_some() { let before_edit = self.snapshot(); - let edited = self.content().anchor_set(ranges.iter().filter_map(|range| { - let start = range.start.to_point(&*self); - if new_text.starts_with('\n') && start.column == self.line_len(start.row) { - None - } else { - Some((range.start, Bias::Left)) - } - })); + let edited = self.content().anchor_set( + Bias::Left, + ranges.iter().filter_map(|range| { + let start = range.start.to_point(&*self); + if new_text.starts_with('\n') && start.column == self.line_len(start.row) { + None + } else { + Some(range.start) + } + }), + ); Some((before_edit, edited)) } else { None @@ -1288,12 +1291,17 @@ impl Buffer { let mut inserted = None; if let Some(first_newline_ix) = first_newline_ix { let mut delta = 0isize; - inserted = Some(self.content().anchor_range_set(ranges.iter().map(|range| { - let start = (delta + range.start as isize) as usize + first_newline_ix + 1; - let end = (delta + range.start as isize) as usize + new_text_len; - delta += (range.end as isize - range.start as isize) + new_text_len as isize; - (start, Bias::Left)..(end, Bias::Right) - }))); + inserted = Some(self.content().anchor_range_set( + Bias::Left, + Bias::Right, + ranges.iter().map(|range| { + let start = (delta + range.start as isize) as usize + first_newline_ix + 1; + let end = (delta + range.start as isize) as usize + new_text_len; + delta += + (range.end as isize - range.start as isize) + new_text_len as isize; + start..end + }), + )); } let selection_set_ids = self