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:
@@ -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,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user