diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 2a7a7e45b2d38551d35a45ece178bb133341d173..08843aacfe2e0a5babf44706c980692c3ae9b198 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -2059,7 +2059,8 @@ impl BufferSnapshot { range: Range, ) -> Option<(Range, Range)> { // Find bracket pairs that *inclusively* contain the given range. - let range = range.start.to_offset(self).saturating_sub(1)..range.end.to_offset(self) + 1; + let range = range.start.to_offset(self).saturating_sub(1) + ..self.len().min(range.end.to_offset(self) + 1); let mut matches = self.syntax.matches(range, &self.text, |grammar| { grammar.brackets_config.as_ref().map(|c| &c.query) }); diff --git a/crates/language/src/tests.rs b/crates/language/src/tests.rs index 06612347cd7bfb30c74035a2d805d6deb91604e3..821bbc9968beb57a7dbd19f926a9388cd5d080a6 100644 --- a/crates/language/src/tests.rs +++ b/crates/language/src/tests.rs @@ -571,6 +571,15 @@ fn test_enclosing_bracket_ranges(cx: &mut MutableAppContext) { Point::new(3, 4)..Point::new(3, 5) )) ); + + // Regression test: avoid crash when querying at the end of the buffer. + assert_eq!( + buffer.enclosing_bracket_point_ranges(buffer.len() - 1..buffer.len()), + Some(( + Point::new(0, 6)..Point::new(0, 7), + Point::new(4, 0)..Point::new(4, 1) + )) + ); } #[gpui::test]