darklua_core/nodes/
mod.rs

1//! The collection of nodes used for the Lua abstract syntax tree.
2
3mod arguments;
4mod block;
5mod expressions;
6mod function_body;
7mod function_call;
8mod identifier;
9mod statements;
10mod token;
11mod typed_identifier;
12mod types;
13mod variable;
14
15pub use arguments::*;
16pub use block::*;
17pub use expressions::*;
18pub use function_body::*;
19pub use function_call::*;
20pub use identifier::*;
21pub use statements::*;
22pub use token::*;
23pub use typed_identifier::*;
24pub use types::*;
25pub use variable::*;
26
27macro_rules! impl_token_fns {
28    (
29        target = [ $( $field:ident ),* $(,)? ]
30        $(iter = [ $( $iter_field:ident),* $(,)? ])?
31        $(iter_flatten = [ $( $iter_flatten_field:ident),* $(,)? ])?
32    ) => {
33        pub fn clear_comments(&mut self) {
34            $(
35                self.$field.clear_comments();
36            )*
37            $($(
38                    for token in self.$iter_field.iter_mut() {
39                        token.clear_comments();
40                    }
41            )*)?
42            $($(
43                    for token in self.$iter_flatten_field.iter_mut().flatten() {
44                        token.clear_comments();
45                    }
46            )*)?
47        }
48
49        pub fn clear_whitespaces(&mut self) {
50            $(
51                self.$field.clear_whitespaces();
52            )*
53            $($(
54                for token in self.$iter_field.iter_mut() {
55                    token.clear_whitespaces();
56                }
57            )*)?
58            $($(
59                for token in self.$iter_flatten_field.iter_mut().flatten() {
60                    token.clear_whitespaces();
61                }
62            )*)?
63        }
64
65        pub(crate) fn replace_referenced_tokens(&mut self, code: &str) {
66            $(
67                self.$field.replace_referenced_tokens(code);
68            )*
69            $($(
70                for token in self.$iter_field.iter_mut() {
71                    token.replace_referenced_tokens(code);
72                }
73            )*)?
74            $($(
75                for token in self.$iter_flatten_field.iter_mut().flatten() {
76                    token.replace_referenced_tokens(code);
77                }
78            )*)?
79        }
80
81        pub(crate) fn shift_token_line(&mut self, amount: usize) {
82            $(
83                self.$field.shift_token_line(amount);
84            )*
85            $($(
86                for token in self.$iter_field.iter_mut() {
87                    token.shift_token_line(amount);
88                }
89            )*)?
90            $($(
91                for token in self.$iter_flatten_field.iter_mut().flatten() {
92                    token.shift_token_line(amount);
93                }
94            )*)?
95        }
96
97        pub(crate) fn filter_comments(&mut self, filter: impl Fn(&crate::nodes::Trivia) -> bool) {
98            $(
99                self.$field.filter_comments(&filter);
100            )*
101            $($(
102                for token in self.$iter_field.iter_mut() {
103                    token.filter_comments(&filter);
104                }
105            )*)?
106            $($(
107                for token in self.$iter_flatten_field.iter_mut().flatten() {
108                    token.filter_comments(&filter);
109                }
110            )*)?
111        }
112    };
113
114    (
115        iter = [$($field:ident),*]
116        iter_flatten = [$($flatten_field:ident),*]
117    ) => {
118        $crate::nodes::impl_token_fns!(
119            target = []
120            iter = [ $($field,)* ]
121            iter_flatten = [ $($flatten_field,)* ]
122        );
123    };
124
125    (
126        iter = [$($field:ident),*]
127    ) => {
128        $crate::nodes::impl_token_fns!(
129            target = []
130            iter = [ $($field,)* ]
131            iter_flatten = []
132        );
133    };
134
135    (
136        iter_flatten = [$($field:ident),*]
137    ) => {
138        $crate::nodes::impl_token_fns!(
139            target = []
140            iter = []
141            iter_flatten = [ $($field,)* ]
142        );
143    };
144}
145
146pub(crate) use impl_token_fns;