alder/cst/parsers/
node.rs

1use crate::*;
2
3pub fn none() -> impl Parser {
4    node(NodeId::VIRTUAL, |_| ())
5}
6
7pub fn v_node(name: impl Into<Option<NodeId>>, f: impl Fn(&mut State)) -> impl Parser {
8    let alias = name.into().into_iter().collect();
9    node_inner(NodeId::VIRTUAL, alias, f)
10}
11
12fn node_inner(name: NodeId, alias: Vec<NodeId>, f: impl Fn(&mut State)) -> impl Parser {
13    move |state: &mut State| {
14        let n = Node {
15            name,
16            span: state.input.clone(),
17            alias: alias.clone(),
18            children: vec![],
19        };
20        state.nodes.push(n);
21        f(state);
22        let mut res = state.nodes.pop().expect("Node");
23        res.recalc_span(state);
24        res
25    }
26}
27
28pub fn node(name: NodeId, f: impl Fn(&mut State)) -> impl Parser {
29    node_inner(name, vec![], f)
30}
31
32pub fn field(name: NodeId, f: impl Parser) -> impl Parser {
33    map(f, move |mut node| {
34        node.alias.push(name);
35        node
36    })
37}