teo_parser/macros/
parse.rs

1#[macro_export]
2macro_rules! parse_insert_punctuation {
3    ($context:ident, $current:ident, $children:ident, $content:expr) => {
4        {
5            let punc = crate::ast::punctuations::Punctuation::new($content, parse_span(&$current), $context.next_path());
6            $children.insert(crate::traits::identifiable::Identifiable::id(&punc), punc.into());
7        }
8    };
9}
10
11#[macro_export]
12macro_rules! parse_insert_operator {
13    ($context:ident, $current:ident, $children:ident, $content:expr) => {
14        {
15            let op = crate::ast::operators::Operator::new($content, parse_span(&$current), $context.next_path());
16            $children.insert(crate::traits::identifiable::Identifiable::id(&op), op.into());
17        }
18    };
19}
20
21#[macro_export]
22macro_rules! parse_insert_keyword {
23    ($context:ident, $current:ident, $children:ident, $content:expr) => {
24        {
25            let keyword = crate::ast::keyword::Keyword::new($content, parse_span(&$current), $context.next_path());
26            $children.insert(crate::traits::identifiable::Identifiable::id(&keyword), keyword.into());
27        }
28    };
29}
30
31#[macro_export]
32macro_rules! parse_append {
33    ($expr:expr, $children:ident) => {
34        {
35            let node = $expr;
36            $children.insert(crate::traits::identifiable::Identifiable::id(&node), node.into());
37        }
38    };
39}
40
41#[macro_export]
42macro_rules! parse_insert {
43    ($expr:expr, $children:ident, $dest:ident) => {
44        {
45            let node = $expr;
46            $dest.push(crate::traits::identifiable::Identifiable::id(&node));
47            $children.insert(crate::traits::identifiable::Identifiable::id(&node), node.into());
48        }
49    };
50}
51
52#[macro_export]
53macro_rules! parse_set {
54    ($expr:expr, $children:ident, $dest:ident) => {
55        {
56            let node = $expr;
57            $dest = crate::traits::identifiable::Identifiable::id(&node);
58            $children.insert(crate::traits::identifiable::Identifiable::id(&node), node.into());
59        }
60    };
61}
62
63#[macro_export]
64macro_rules! parse_set_optional {
65    ($expr:expr, $children:ident, $dest:ident) => {
66        {
67            let node = $expr;
68            $dest = Some(crate::traits::identifiable::Identifiable::id(&node));
69            $children.insert(crate::traits::identifiable::Identifiable::id(&node), node.into());
70        }
71    };
72}
73
74#[macro_export]
75macro_rules! parse_set_identifier_and_string_path {
76    ($context: ident, $current: ident, $children: ident, $identifier: ident, $string_path: ident) => {
77        {
78            let node = crate::parser::parse_identifier::parse_identifier(&$current, $context);
79            $identifier = crate::traits::identifiable::Identifiable::id(&node);
80            $string_path = $context.next_parent_string_path(node.name());
81            $children.insert(crate::traits::identifiable::Identifiable::id(&node), node.into());
82        }
83    };
84}
85
86#[macro_export]
87macro_rules! parse_container_node_variables_without_span {
88    ($context:ident) => {
89        {
90            let children: std::collections::BTreeMap<usize, crate::ast::node::Node> = std::collections::BTreeMap::new();
91            let path = $context.next_parent_path();
92            (path, children)
93        }
94    };
95}
96
97#[macro_export]
98macro_rules! parse_container_node_variables {
99    ($pair:ident, $context:ident) => {
100        {
101            let span = parse_span(&$pair);
102            let children: std::collections::BTreeMap<usize, crate::ast::node::Node> = std::collections::BTreeMap::new();
103            let path = $context.next_parent_path();
104            (span, path, children)
105        }
106    };
107    ($pair:ident, $context:ident, named) => {
108        {
109            let span = parse_span(&$pair);
110            let children: std::collections::BTreeMap<usize, crate::ast::node::Node> = std::collections::BTreeMap::new();
111            let path = $context.next_parent_path();
112            let string_path: Vec<String> = Vec::new();
113            (span, path, string_path, children)
114        }
115    };
116    ($pair:ident, $context:ident, availability) => {
117        {
118            let span = parse_span(&$pair);
119            let children: std::collections::BTreeMap<usize, crate::ast::node::Node> = std::collections::BTreeMap::new();
120            let path = $context.next_parent_path();
121            let define_availability = $context.current_availability_flag();
122            let actual_availability = std::cell::RefCell::new(crate::availability::Availability::none());
123            (span, path, children, define_availability, actual_availability)
124        }
125    };
126    ($pair:ident, $context:ident, named, availability) => {
127        {
128            let span = parse_span(&$pair);
129            let children: std::collections::BTreeMap<usize, crate::ast::node::Node> = std::collections::BTreeMap::new();
130            let path = $context.next_parent_path();
131            let string_path: Vec<String> = Vec::new();
132            let define_availability = $context.current_availability_flag();
133            let actual_availability = std::cell::RefCell::new(crate::availability::Availability::none());
134            (span, path, string_path, children, define_availability, actual_availability)
135        }
136    };
137}
138
139#[macro_export]
140macro_rules! parse_container_node_variables_cleanup {
141    ($context: ident) => {
142        $context.pop_parent_id();
143    };
144    ($context: ident, named) => {
145        $context.pop_parent_id();
146        $context.pop_string_path();
147    }
148}
149
150#[macro_export]
151macro_rules! parse_node_variables {
152    ($pair:ident, $context:ident) => {
153        {
154            let span = parse_span(&$pair);
155            let path = $context.next_path();
156            (span, path)
157        }
158    };
159}