mirror of https://github.com/helix-editor/helix
progress
parent
1bd36f528a
commit
29ffc20290
@ -0,0 +1,66 @@
|
||||
use std::ptr::{self, NonNull};
|
||||
|
||||
use regex_cursor::Cursor;
|
||||
|
||||
use crate::tree_sitter::query::Query;
|
||||
use crate::tree_sitter::syntax_tree_node::SyntaxTreeNodeRaw;
|
||||
|
||||
enum QueryCursorData {}
|
||||
|
||||
pub struct QueryCaptures<'a> {
|
||||
query: &'a Query,
|
||||
query_cursor: &'a mut QueryCursorData,
|
||||
text_cursor: regex_cursor::RopeyCursor<'a>,
|
||||
}
|
||||
|
||||
impl<C: Cursor> QueryCaptures<'_, C> {
|
||||
fn next(&mut self) {
|
||||
let mut query_match = TSQueryMatch {
|
||||
id: 0,
|
||||
pattern_index: 0,
|
||||
capture_count: 0,
|
||||
captures: ptr::null(),
|
||||
};
|
||||
let mut capture_idx = 0;
|
||||
loop {
|
||||
let success = unsafe {
|
||||
ts_query_cursor_next_capture(
|
||||
&mut self.query_cursor,
|
||||
&mut query_match,
|
||||
&mut capture_idx,
|
||||
)
|
||||
};
|
||||
if !success {
|
||||
break;
|
||||
}
|
||||
}
|
||||
let mut input = regex_cursor::Input::new(self.text_cursor.clone());
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug)]
|
||||
struct TSQueryCapture {
|
||||
node: SyntaxTreeNodeRaw,
|
||||
index: u32,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug)]
|
||||
struct TSQueryMatch {
|
||||
id: u32,
|
||||
pattern_index: u16,
|
||||
capture_count: u16,
|
||||
captures: *const TSQueryCapture,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
/// Advance to the next capture of the currently running query.
|
||||
/// If there is a capture, write its match to `*match` and its index within
|
||||
/// the matche's capture list to `*capture_index`. Otherwise, return `false`.
|
||||
fn ts_query_cursor_next_capture(
|
||||
self_: &mut QueryCursorData,
|
||||
match_: &mut TSQueryMatch,
|
||||
capture_index: &mut u32,
|
||||
) -> bool;
|
||||
}
|
Loading…
Reference in New Issue