tree_sitter_edit/editors/
left_biased_or.rs

1use tree_sitter::{Node, Tree};
2
3use crate::editor::Editor;
4
5/// An [Editor] that merges the edits from two [Editor]s, preferring the left
6/// one.
7#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct LeftBiasedOr<L, R>
9where
10    L: Editor,
11    R: Editor,
12{
13    pub left: L,
14    pub right: R,
15}
16
17impl<L: Editor, R: Editor> Editor for LeftBiasedOr<L, R> {
18    fn has_edit(&self, tree: &Tree, node: &Node<'_>) -> bool {
19        self.left.has_edit(tree, node) || self.right.has_edit(tree, node)
20    }
21
22    fn edit(&self, source: &[u8], tree: &Tree, node: &Node<'_>) -> Vec<u8> {
23        debug_assert!(self.has_edit(tree, node));
24        if self.left.has_edit(tree, node) {
25            self.left.edit(source, tree, node)
26        } else {
27            debug_assert!(self.right.has_edit(tree, node));
28            self.right.edit(source, tree, node)
29        }
30    }
31}