tree_sitter_edit/
editor.rs1use crate::traversal::{traverse, Order};
2use tree_sitter::{Node, Tree};
3
4#[derive(Debug)]
5pub struct Edit {
6 pub position: usize,
7 pub delete: usize,
8 pub insert: Vec<u8>,
9}
10
11pub trait Editor {
16 #[must_use]
18 fn has_edit(&self, tree: &Tree, node: &Node<'_>) -> bool;
19
20 fn edit(&self, source: &[u8], tree: &Tree, node: &Node<'_>) -> Vec<u8>;
22
23 fn in_order_edits<'a>(
29 &'a self,
30 source: &'a [u8],
31 tree: &'a Tree,
32 ) -> Box<dyn Iterator<Item = Edit> + 'a> {
33 Box::new(traverse(tree.walk(), Order::Pre).filter_map(|n| {
34 if self.has_edit(tree, &n) {
35 Some(Edit {
36 position: n.start_byte(),
37 delete: n.end_byte() - n.start_byte(),
38 insert: self.edit(source, tree, &n),
39 })
40 } else {
41 None
42 }
43 }))
44 }
45}