diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 561ee30ee5a025de51891d99229e556ebf7d8252..dfae115d8fdc0c6dc9c7847c888262c7eb5733e8 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -4154,6 +4154,9 @@ impl MultiBufferSnapshot { let region = cursor.region()?; let overshoot = offset - region.range.start; let buffer_offset = region.buffer_range.start + overshoot; + if buffer_offset > region.buffer.len() { + return None; + } Some((region.buffer, buffer_offset)) } @@ -4162,8 +4165,11 @@ impl MultiBufferSnapshot { cursor.seek(&point); let region = cursor.region()?; let overshoot = point - region.range.start; - let buffer_offset = region.buffer_range.start + overshoot; - Some((region.buffer, buffer_offset, region.is_main_buffer)) + let buffer_point = region.buffer_range.start + overshoot; + if buffer_point > region.buffer.max_point() { + return None; + } + Some((region.buffer, buffer_point, region.is_main_buffer)) } pub fn suggested_indents( diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 2a3d1727cdb4c982bde77e42ccf609133f3af40d..8b10b787da251126fcefa93fbd9b3d2b27bbf604 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -3378,6 +3378,17 @@ fn assert_position_translation(snapshot: &MultiBufferSnapshot) { } } } + + let point = snapshot.max_point(); + let Some((buffer, offset)) = snapshot.point_to_buffer_offset(point) else { + return; + }; + assert!(offset <= buffer.len(),); + + let Some((buffer, point, _)) = snapshot.point_to_buffer_point(point) else { + return; + }; + assert!(point <= buffer.max_point(),); } fn assert_line_indents(snapshot: &MultiBufferSnapshot) {