tree_sitter_edit/editors/
replace.rs1use crate::traversal::{traverse, Order};
2use tree_sitter::{Node, Tree};
3
4use crate::editor::{Edit, Editor};
5use crate::id::NodeId;
6
7#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct Replace {
10 pub id: NodeId,
11 pub bytes: Vec<u8>,
12}
13
14impl Editor for Replace {
15 fn has_edit(&self, _tree: &Tree, node: &Node<'_>) -> bool {
16 self.id.is(node)
17 }
18
19 fn edit(&self, _source: &[u8], tree: &Tree, node: &Node<'_>) -> Vec<u8> {
20 debug_assert!(self.has_edit(tree, node));
21 self.bytes.clone()
22 }
23
24 fn in_order_edits(&self, _source: &[u8], tree: &Tree) -> Box<dyn Iterator<Item = Edit>> {
25 if let Some(node) = traverse(tree.walk(), Order::Pre).find(|n| NodeId::new(n) == self.id) {
26 Box::new(std::iter::once(Edit {
27 position: node.start_byte(),
28 delete: node.end_byte() - node.start_byte(),
29 insert: self.bytes.clone(),
30 }))
31 } else {
32 Box::new(std::iter::empty())
33 }
34 }
35}