tree_sitter_edit/editors/
delete.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 deletes the text of a single [Node].
8#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct Delete {
10    id: NodeId,
11}
12
13impl Delete {
14    #[must_use]
15    pub fn new(id: NodeId) -> Self {
16        Delete { id }
17    }
18}
19
20impl Editor for Delete {
21    fn has_edit(&self, _tree: &Tree, node: &Node<'_>) -> bool {
22        self.id.is(node)
23    }
24
25    fn edit(&self, _source: &[u8], tree: &Tree, node: &Node<'_>) -> Vec<u8> {
26        debug_assert!(self.has_edit(tree, node));
27        Vec::new()
28    }
29
30    fn in_order_edits(&self, _source: &[u8], tree: &Tree) -> Box<dyn Iterator<Item = Edit> + '_> {
31        if let Some(node) = traverse(tree.walk(), Order::Pre).find(|n| NodeId::new(n) == self.id) {
32            Box::new(std::iter::once(Edit {
33                position: node.start_byte(),
34                delete: node.end_byte() - node.start_byte(),
35                insert: Vec::new(),
36            }))
37        } else {
38            Box::new(std::iter::empty())
39        }
40    }
41}