Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-core/src/textobject.rs')
-rw-r--r--helix-core/src/textobject.rs15
1 files changed, 8 insertions, 7 deletions
diff --git a/helix-core/src/textobject.rs b/helix-core/src/textobject.rs
index 008228f4..7576b3a7 100644
--- a/helix-core/src/textobject.rs
+++ b/helix-core/src/textobject.rs
@@ -1,12 +1,13 @@
use std::fmt::Display;
use ropey::RopeSlice;
+use tree_sitter::{Node, QueryCursor};
use crate::chars::{categorize_char, char_is_whitespace, CharCategory};
use crate::graphemes::{next_grapheme_boundary, prev_grapheme_boundary};
use crate::line_ending::rope_is_line_ending;
use crate::movement::Direction;
-use crate::syntax;
+use crate::syntax::LanguageConfiguration;
use crate::Range;
use crate::{surround, Syntax};
@@ -259,18 +260,18 @@ pub fn textobject_treesitter(
range: Range,
textobject: TextObject,
object_name: &str,
- syntax: &Syntax,
- loader: &syntax::Loader,
+ slice_tree: Node,
+ lang_config: &LanguageConfiguration,
_count: usize,
) -> Range {
- let root = syntax.tree().root_node();
- let textobject_query = loader.textobject_query(syntax.root_language());
let get_range = move || -> Option<Range> {
let byte_pos = slice.char_to_byte(range.cursor(slice));
let capture_name = format!("{}.{}", object_name, textobject); // eg. function.inner
- let node = textobject_query?
- .capture_nodes(&capture_name, &root, slice)?
+ let mut cursor = QueryCursor::new();
+ let node = lang_config
+ .textobject_query()?
+ .capture_nodes(&capture_name, slice_tree, slice, &mut cursor)?
.filter(|node| node.byte_range().contains(&byte_pos))
.min_by_key(|node| node.byte_range().len())?;