reovim_plugin_treesitter/
parser.rs1use tree_sitter::{InputEdit, Parser, Tree};
4
5pub struct BufferParser {
7 parser: Parser,
9 tree: Option<Tree>,
11 language_id: String,
13 version: u64,
15}
16
17impl BufferParser {
18 #[must_use]
22 pub fn new(language: &tree_sitter::Language, language_id: &str) -> Option<Self> {
23 let mut parser = Parser::new();
24 parser.set_language(language).ok()?;
25
26 Some(Self {
27 parser,
28 tree: None,
29 language_id: language_id.to_string(),
30 version: 0,
31 })
32 }
33
34 #[must_use]
36 pub fn language_id(&self) -> &str {
37 &self.language_id
38 }
39
40 #[must_use]
42 pub const fn version(&self) -> u64 {
43 self.version
44 }
45
46 #[must_use]
48 pub const fn tree(&self) -> Option<&Tree> {
49 self.tree.as_ref()
50 }
51
52 pub fn parse_full(&mut self, content: &str) -> Option<&Tree> {
56 self.tree = self.parser.parse(content, None);
57 self.version = self.version.wrapping_add(1);
58 self.tree.as_ref()
59 }
60
61 pub fn parse_incremental(&mut self, content: &str, edit: &InputEdit) -> Option<&Tree> {
66 if let Some(ref mut tree) = self.tree {
68 tree.edit(edit);
69 }
70
71 self.tree = self.parser.parse(content, self.tree.as_ref());
73 self.version = self.version.wrapping_add(1);
74 self.tree.as_ref()
75 }
76
77 #[must_use]
79 pub const fn has_tree(&self) -> bool {
80 self.tree.is_some()
81 }
82}