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        /// Clears all comments from the tokens in this node.
34        pub fn clear_comments(&mut self) {
35            $(
36                self.$field.clear_comments();
37            )*
38            $($(
39                    for token in self.$iter_field.iter_mut() {
40                        token.clear_comments();
41                    }
42            )*)?
43            $($(
44                    for token in self.$iter_flatten_field.iter_mut().flatten() {
45                        token.clear_comments();
46                    }
47            )*)?
48        }
49
50        /// Clears all whitespaces information from the tokens in this node.
51        pub fn clear_whitespaces(&mut self) {
52            $(
53                self.$field.clear_whitespaces();
54            )*
55            $($(
56                for token in self.$iter_field.iter_mut() {
57                    token.clear_whitespaces();
58                }
59            )*)?
60            $($(
61                for token in self.$iter_flatten_field.iter_mut().flatten() {
62                    token.clear_whitespaces();
63                }
64            )*)?
65        }
66
67        pub(crate) fn replace_referenced_tokens(&mut self, code: &str) {
68            $(
69                self.$field.replace_referenced_tokens(code);
70            )*
71            $($(
72                for token in self.$iter_field.iter_mut() {
73                    token.replace_referenced_tokens(code);
74                }
75            )*)?
76            $($(
77                for token in self.$iter_flatten_field.iter_mut().flatten() {
78                    token.replace_referenced_tokens(code);
79                }
80            )*)?
81        }
82
83        pub(crate) fn shift_token_line(&mut self, amount: isize) {
84            $(
85                self.$field.shift_token_line(amount);
86            )*
87            $($(
88                for token in self.$iter_field.iter_mut() {
89                    token.shift_token_line(amount);
90                }
91            )*)?
92            $($(
93                for token in self.$iter_flatten_field.iter_mut().flatten() {
94                    token.shift_token_line(amount);
95                }
96            )*)?
97        }
98
99        pub(crate) fn filter_comments(&mut self, filter: impl Fn(&crate::nodes::Trivia) -> bool) {
100            $(
101                self.$field.filter_comments(&filter);
102            )*
103            $($(
104                for token in self.$iter_field.iter_mut() {
105                    token.filter_comments(&filter);
106                }
107            )*)?
108            $($(
109                for token in self.$iter_flatten_field.iter_mut().flatten() {
110                    token.filter_comments(&filter);
111                }
112            )*)?
113        }
114    };
115
116    (
117        iter = [$($field:ident),*]
118        iter_flatten = [$($flatten_field:ident),*]
119    ) => {
120        $crate::nodes::impl_token_fns!(
121            target = []
122            iter = [ $($field,)* ]
123            iter_flatten = [ $($flatten_field,)* ]
124        );
125    };
126
127    (
128        iter = [$($field:ident),*]
129    ) => {
130        $crate::nodes::impl_token_fns!(
131            target = []
132            iter = [ $($field,)* ]
133            iter_flatten = []
134        );
135    };
136
137    (
138        iter_flatten = [$($field:ident),*]
139    ) => {
140        $crate::nodes::impl_token_fns!(
141            target = []
142            iter = []
143            iter_flatten = [ $($field,)* ]
144        );
145    };
146}
147
148pub(crate) use impl_token_fns;