alder/cst/parsers/
node.rs1use 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}