Fix panic in UnwrapSyntaxNode (#39139)

Closes #39139
Fixes ZED-1HY

Release Notes:

- Fixed a panic in UnwrapSyntaxNode in multi-buffers
This commit is contained in:
Conrad Irwin
2025-09-29 14:01:34 -06:00
committed by GitHub
parent 42ef3e5d3d
commit f1d80b715a
5 changed files with 72 additions and 35 deletions
+4 -12
View File
@@ -79,12 +79,6 @@ pub struct MultiBuffer {
buffer_changed_since_sync: Rc<Cell<bool>>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum MultiOrSingleBufferOffsetRange {
Single(Range<usize>),
Multi(Range<usize>),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Event {
ExcerptsAdded {
@@ -6077,19 +6071,17 @@ impl MultiBufferSnapshot {
pub fn syntax_ancestor<T: ToOffset>(
&self,
range: Range<T>,
) -> Option<(tree_sitter::Node<'_>, MultiOrSingleBufferOffsetRange)> {
) -> Option<(tree_sitter::Node<'_>, Range<usize>)> {
let range = range.start.to_offset(self)..range.end.to_offset(self);
let mut excerpt = self.excerpt_containing(range.clone())?;
let node = excerpt
.buffer()
.syntax_ancestor(excerpt.map_range_to_buffer(range))?;
let node_range = node.byte_range();
let range = if excerpt.contains_buffer_range(node_range.clone()) {
MultiOrSingleBufferOffsetRange::Multi(excerpt.map_range_from_buffer(node_range))
} else {
MultiOrSingleBufferOffsetRange::Single(node_range)
if !excerpt.contains_buffer_range(node_range.clone()) {
return None;
};
Some((node, range))
Some((node, excerpt.map_range_from_buffer(node_range)))
}
pub fn syntax_next_sibling<T: ToOffset>(