@@ -30,6 +30,13 @@ impl Rope {
Self::default()
}
+ /// Checks that `index`-th byte is the first byte in a UTF-8 code point
+ /// sequence or the end of the string.
+ ///
+ /// The start and end of the string (when `index == self.len()`) are
+ /// considered to be boundaries.
+ ///
+ /// Returns `false` if `index` is greater than `self.len()`.
pub fn is_char_boundary(&self, offset: usize) -> bool {
if self.chunks.is_empty() {
return offset == 0;
@@ -2400,7 +2400,9 @@ impl BufferSnapshot {
} else if bias == Bias::Right && offset == self.len() {
Anchor::MAX
} else {
- if !self.visible_text.is_char_boundary(offset) {
+ if offset > self.visible_text.len() {
+ panic!("offset {} is out of bounds", offset)
+ } else if !self.visible_text.is_char_boundary(offset) {
// find the character
let char_start = self.visible_text.floor_char_boundary(offset);
// `char_start` must be less than len and a char boundary