Skip to main content

darklua_core/nodes/
mod.rs

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