mirror of
https://github.com/helix-editor/helix.git
synced 2025-04-05 11:57:43 +03:00
Add a TreeCursor type that travels over injection layers
This uses the layer parentage information from the parent commit to traverse the layers. It's a similar API to `tree_sitter:TreeCursor` but internally it does not use a `tree_sitter::TreeCursor` currently because that interface is behaving very unexpectedly. Using the `next_sibling`/`prev_sibling`/`parent` API on `tree_sitter::Node` reflects the previous code's behavior so this should result in no surprising changes.
This commit is contained in:
parent
6dd46bfe1c
commit
b1222f0664
2 changed files with 173 additions and 3 deletions
|
@ -1,3 +1,5 @@
|
|||
mod tree_cursor;
|
||||
|
||||
use crate::{
|
||||
auto_pairs::AutoPairs,
|
||||
chars::char_is_line_ending,
|
||||
|
@ -32,6 +34,8 @@ use serde::{ser::SerializeSeq, Deserialize, Serialize};
|
|||
|
||||
use helix_loader::grammar::{get_language, load_runtime_file};
|
||||
|
||||
pub use tree_cursor::TreeCursor;
|
||||
|
||||
fn deserialize_regex<'de, D>(deserializer: D) -> Result<Option<Regex>, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
|
@ -1495,6 +1499,12 @@ impl Syntax {
|
|||
.descendant_for_byte_range(start, end)
|
||||
}
|
||||
|
||||
pub fn walk(&self) -> TreeCursor<'_> {
|
||||
// data structure to find the smallest range that contains a point
|
||||
// when some of the ranges in the structure can overlap.
|
||||
TreeCursor::new(&self.layers, self.root)
|
||||
}
|
||||
|
||||
// Commenting
|
||||
// comment_strings_for_pos
|
||||
// is_commented
|
||||
|
@ -1723,7 +1733,7 @@ use std::sync::atomic::{AtomicUsize, Ordering};
|
|||
use std::{iter, mem, ops, str, usize};
|
||||
use tree_sitter::{
|
||||
Language as Grammar, Node, Parser, Point, Query, QueryCaptures, QueryCursor, QueryError,
|
||||
QueryMatch, Range, TextProvider, Tree, TreeCursor,
|
||||
QueryMatch, Range, TextProvider, Tree,
|
||||
};
|
||||
|
||||
const CANCELLATION_CHECK_INTERVAL: usize = 100;
|
||||
|
@ -2657,7 +2667,7 @@ pub fn pretty_print_tree<W: fmt::Write>(fmt: &mut W, node: Node) -> fmt::Result
|
|||
|
||||
fn pretty_print_tree_impl<W: fmt::Write>(
|
||||
fmt: &mut W,
|
||||
cursor: &mut TreeCursor,
|
||||
cursor: &mut tree_sitter::TreeCursor,
|
||||
depth: usize,
|
||||
) -> fmt::Result {
|
||||
let node = cursor.node();
|
||||
|
@ -2967,7 +2977,7 @@ mod test {
|
|||
// rule but `name` and `body` belong to an unnamed helper `_method_rest`.
|
||||
// This can cause a bug with a pretty-printing implementation that
|
||||
// uses `Node::field_name_for_child` to determine field names but is
|
||||
// fixed when using `TreeCursor::field_name`.
|
||||
// fixed when using `tree_sitter::TreeCursor::field_name`.
|
||||
let source = "def self.method_name
|
||||
true
|
||||
end";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue