tree_sitter_edit/editors/
replace.rs

1use crate::traversal::{traverse, Order};
2use tree_sitter::{Node, Tree};
3
4use crate::editor::{Edit, Editor};
5use crate::id::NodeId;
6
7/// An [Editor] that replaces the text of a single [Node].
8#[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}