diff options
author | Pascal Kuthe | 2024-02-26 07:45:20 +0000 |
---|---|---|
committer | GitHub | 2024-02-26 07:45:20 +0000 |
commit | cd02976fa3a55c2c1f01b95c40d178061968f797 (patch) | |
tree | 707df0a4fb93fa7c8773ba59a85259835deb166e /helix-stdx/src | |
parent | c68ec92c5e1bd3a2bf402fb583de23693f59b722 (diff) |
switch to regex-cursor (#9422)
Diffstat (limited to 'helix-stdx/src')
-rw-r--r-- | helix-stdx/src/rope.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/helix-stdx/src/rope.rs b/helix-stdx/src/rope.rs index 4ee39d4a..7b4edda4 100644 --- a/helix-stdx/src/rope.rs +++ b/helix-stdx/src/rope.rs @@ -1,11 +1,22 @@ +use std::ops::{Bound, RangeBounds}; + +pub use regex_cursor::engines::meta::{Builder as RegexBuilder, Regex}; +pub use regex_cursor::regex_automata::util::syntax::Config; +use regex_cursor::{Input as RegexInput, RopeyCursor}; use ropey::RopeSlice; -pub trait RopeSliceExt: Sized { +pub trait RopeSliceExt<'a>: Sized { fn ends_with(self, text: &str) -> bool; fn starts_with(self, text: &str) -> bool; + fn regex_input(self) -> RegexInput<RopeyCursor<'a>>; + fn regex_input_at_bytes<R: RangeBounds<usize>>( + self, + byte_range: R, + ) -> RegexInput<RopeyCursor<'a>>; + fn regex_input_at<R: RangeBounds<usize>>(self, char_range: R) -> RegexInput<RopeyCursor<'a>>; } -impl RopeSliceExt for RopeSlice<'_> { +impl<'a> RopeSliceExt<'a> for RopeSlice<'a> { fn ends_with(self, text: &str) -> bool { let len = self.len_bytes(); if len < text.len() { @@ -23,4 +34,34 @@ impl RopeSliceExt for RopeSlice<'_> { self.get_byte_slice(..len - text.len()) .map_or(false, |start| start == text) } + + fn regex_input(self) -> RegexInput<RopeyCursor<'a>> { + RegexInput::new(self) + } + + fn regex_input_at<R: RangeBounds<usize>>(self, char_range: R) -> RegexInput<RopeyCursor<'a>> { + let start_bound = match char_range.start_bound() { + Bound::Included(&val) => Bound::Included(self.char_to_byte(val)), + Bound::Excluded(&val) => Bound::Excluded(self.char_to_byte(val)), + Bound::Unbounded => Bound::Unbounded, + }; + let end_bound = match char_range.end_bound() { + Bound::Included(&val) => Bound::Included(self.char_to_byte(val)), + Bound::Excluded(&val) => Bound::Excluded(self.char_to_byte(val)), + Bound::Unbounded => Bound::Unbounded, + }; + self.regex_input_at_bytes((start_bound, end_bound)) + } + fn regex_input_at_bytes<R: RangeBounds<usize>>( + self, + byte_range: R, + ) -> RegexInput<RopeyCursor<'a>> { + let input = match byte_range.start_bound() { + Bound::Included(&pos) | Bound::Excluded(&pos) => { + RegexInput::new(RopeyCursor::at(self, pos)) + } + Bound::Unbounded => RegexInput::new(self), + }; + input.range(byte_range) + } } |