rope: Improve panic message for out of bounds `anchor_at_offset` (#40256)

Lukas Wirth created

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Change summary

crates/rope/src/rope.rs | 7 +++++++
crates/text/src/text.rs | 4 +++-
2 files changed, 10 insertions(+), 1 deletion(-)

Detailed changes

crates/rope/src/rope.rs 🔗

@@ -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;

crates/text/src/text.rs 🔗

@@ -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