edit predictions: Add new excerpt logic (not yet used) (#38226)

Release Notes:

- N/A

---------

Co-authored-by: agus <agus@zed.dev>
This commit is contained in:
Michael Sloan
2025-09-15 16:29:58 -06:00
committed by GitHub
co-authored by agus
parent 0784bb8192
commit 853e625259
10 changed files with 722 additions and 27 deletions
+54 -27
View File
@@ -3310,18 +3310,25 @@ impl BufferSnapshot {
/// Iterates over every [`SyntaxLayer`] in the buffer.
pub fn syntax_layers(&self) -> impl Iterator<Item = SyntaxLayer<'_>> + '_ {
self.syntax
.layers_for_range(0..self.len(), &self.text, true)
self.syntax_layers_for_range(0..self.len(), true)
}
pub fn syntax_layer_at<D: ToOffset>(&self, position: D) -> Option<SyntaxLayer<'_>> {
let offset = position.to_offset(self);
self.syntax
.layers_for_range(offset..offset, &self.text, false)
self.syntax_layers_for_range(offset..offset, false)
.filter(|l| l.node().end_byte() > offset)
.last()
}
pub fn syntax_layers_for_range<D: ToOffset>(
&self,
range: Range<D>,
include_hidden: bool,
) -> impl Iterator<Item = SyntaxLayer<'_>> + '_ {
self.syntax
.layers_for_range(range, &self.text, include_hidden)
}
pub fn smallest_syntax_layer_containing<D: ToOffset>(
&self,
range: Range<D>,
@@ -3859,9 +3866,12 @@ impl BufferSnapshot {
text: item.text,
highlight_ranges: item.highlight_ranges,
name_ranges: item.name_ranges,
body_range: item.body_range.map(|body_range| {
self.anchor_after(body_range.start)..self.anchor_before(body_range.end)
}),
signature_range: item
.signature_range
.map(|r| self.anchor_after(r.start)..self.anchor_before(r.end)),
body_range: item
.body_range
.map(|r| self.anchor_after(r.start)..self.anchor_before(r.end)),
annotation_range: annotation_row_range.map(|annotation_range| {
self.anchor_after(Point::new(annotation_range.start, 0))
..self.anchor_before(Point::new(
@@ -3901,38 +3911,51 @@ impl BufferSnapshot {
let mut open_point = None;
let mut close_point = None;
let mut buffer_ranges = Vec::new();
for capture in mat.captures {
let node_is_name;
if capture.index == config.name_capture_ix {
node_is_name = true;
} else if Some(capture.index) == config.context_capture_ix
|| (Some(capture.index) == config.extra_context_capture_ix && include_extra_context)
{
node_is_name = false;
} else {
if Some(capture.index) == config.open_capture_ix {
open_point = Some(Point::from_ts_point(capture.node.end_position()));
} else if Some(capture.index) == config.close_capture_ix {
close_point = Some(Point::from_ts_point(capture.node.start_position()));
}
continue;
let mut signature_start = None;
let mut signature_end = None;
let mut extend_signature_range = |node: tree_sitter::Node| {
if signature_start.is_none() {
signature_start = Some(Point::from_ts_point(node.start_position()));
}
signature_end = Some(Point::from_ts_point(node.end_position()));
};
let mut range = capture.node.start_byte()..capture.node.end_byte();
let start = capture.node.start_position();
if capture.node.end_position().row > start.row {
let mut buffer_ranges = Vec::new();
let mut add_to_buffer_ranges = |node: tree_sitter::Node, node_is_name| {
let mut range = node.start_byte()..node.end_byte();
let start = node.start_position();
if node.end_position().row > start.row {
range.end = range.start + self.line_len(start.row as u32) as usize - start.column;
}
if !range.is_empty() {
buffer_ranges.push((range, node_is_name));
}
};
for capture in mat.captures {
if capture.index == config.name_capture_ix {
add_to_buffer_ranges(capture.node, true);
extend_signature_range(capture.node);
} else if Some(capture.index) == config.context_capture_ix
|| (Some(capture.index) == config.extra_context_capture_ix && include_extra_context)
{
add_to_buffer_ranges(capture.node, false);
extend_signature_range(capture.node);
} else {
if Some(capture.index) == config.open_capture_ix {
open_point = Some(Point::from_ts_point(capture.node.end_position()));
} else if Some(capture.index) == config.close_capture_ix {
close_point = Some(Point::from_ts_point(capture.node.start_position()));
}
}
}
if buffer_ranges.is_empty() {
return None;
}
let mut text = String::new();
let mut highlight_ranges = Vec::new();
let mut name_ranges = Vec::new();
@@ -3941,7 +3964,6 @@ impl BufferSnapshot {
true,
);
let mut last_buffer_range_end = 0;
for (buffer_range, is_name) in buffer_ranges {
let space_added = !text.is_empty() && buffer_range.start > last_buffer_range_end;
if space_added {
@@ -3983,12 +4005,17 @@ impl BufferSnapshot {
last_buffer_range_end = buffer_range.end;
}
let signature_range = signature_start
.zip(signature_end)
.map(|(start, end)| start..end);
Some(OutlineItem {
depth: 0, // We'll calculate the depth later
range: item_point_range,
text,
highlight_ranges,
name_ranges,
signature_range,
body_range: open_point.zip(close_point).map(|(start, end)| start..end),
annotation_range: None,
})