kodept_ast/graph/
changes.rs

1use crate::graph::tags::ChildTag;
2use crate::graph::utils::OptVec;
3use crate::graph::{AnyNode, GenericNodeId, HasChildrenMarker, NodeId};
4use crate::Uninit;
5
6pub type ChangeSet = OptVec<Change>;
7
8/// Represents a modification of AST
9pub enum Change {
10    /// Child removed
11    Delete {
12        parent_id: GenericNodeId,
13        child_id: GenericNodeId,
14    },
15    /// Child added
16    Add {
17        parent_id: GenericNodeId,
18        child: Uninit<AnyNode>,
19        tag: ChildTag,
20    },
21    /// Replace itself with other node
22    Replace {
23        from_id: GenericNodeId,
24        to: Uninit<AnyNode>,
25    },
26    /// Delete itself from ast hierarchy
27    DeleteSelf { node_id: GenericNodeId },
28}
29
30impl Change {
31    pub fn delete<T: Into<AnyNode>>(id: NodeId<T>) -> Change {
32        Change::DeleteSelf {
33            node_id: id.widen(),
34        }
35    }
36
37    pub fn add<T, U, const TAG: ChildTag>(to: NodeId<T>, element: Uninit<U>) -> Change
38    where
39        T: Into<AnyNode> + HasChildrenMarker<U, TAG>,
40        U: Into<AnyNode>,
41    {
42        Change::Add {
43            parent_id: to.widen(),
44            child: element.map_into(),
45            tag: TAG,
46        }
47    }
48
49    pub fn replace<T: Into<AnyNode>>(node: NodeId<AnyNode>, with: Uninit<T>) -> Change {
50        Change::Replace {
51            from_id: node.widen(),
52            to: with.map_into(),
53        }
54    }
55}