datex_core/visitor/expression/
visitable.rs1use crate::ast::expressions::Apply;
2use crate::ast::expressions::{
3 BinaryOperation, CallableDeclaration, ComparisonOperation, Conditional,
4 CreateRef, DatexExpression, DatexExpressionData, Deref, DerefAssignment,
5 GenericInstantiation, List, Map, PropertyAccess, PropertyAssignment,
6 RemoteExecution, SlotAssignment, Statements, TypeDeclaration,
7 UnaryOperation, VariableAssignment, VariableDeclaration,
8};
9use crate::visitor::VisitAction;
10use crate::visitor::expression::ExpressionVisitor;
11use crate::visitor::type_expression::visitable::VisitableTypeExpression;
12
13pub type ExpressionVisitResult<E> = Result<VisitAction<DatexExpression>, E>;
14
15pub trait VisitableExpression<E> {
16 fn walk_children(
17 &mut self,
18 visitor: &mut impl ExpressionVisitor<E>,
19 ) -> Result<(), E>;
20}
21
22impl<E> VisitableExpression<E> for BinaryOperation {
23 fn walk_children(
24 &mut self,
25 visitor: &mut impl ExpressionVisitor<E>,
26 ) -> Result<(), E> {
27 visitor.visit_datex_expression(&mut self.left)?;
28 visitor.visit_datex_expression(&mut self.right)?;
29 Ok(())
30 }
31}
32
33impl<E> VisitableExpression<E> for Statements {
34 fn walk_children(
35 &mut self,
36 visitor: &mut impl ExpressionVisitor<E>,
37 ) -> Result<(), E> {
38 for item in &mut self.statements {
39 visitor.visit_datex_expression(item)?;
40 }
41 Ok(())
42 }
43}
44impl<E> VisitableExpression<E> for List {
45 fn walk_children(
46 &mut self,
47 visitor: &mut impl ExpressionVisitor<E>,
48 ) -> Result<(), E> {
49 for item in &mut self.items {
50 visitor.visit_datex_expression(item)?;
51 }
52 Ok(())
53 }
54}
55impl<E> VisitableExpression<E> for Map {
56 fn walk_children(
57 &mut self,
58 visitor: &mut impl ExpressionVisitor<E>,
59 ) -> Result<(), E> {
60 for (_key, value) in &mut self.entries {
61 visitor.visit_datex_expression(value)?;
62 }
63 Ok(())
64 }
65}
66impl<E> VisitableExpression<E> for Conditional {
67 fn walk_children(
68 &mut self,
69 visitor: &mut impl ExpressionVisitor<E>,
70 ) -> Result<(), E> {
71 visitor.visit_datex_expression(&mut self.condition)?;
72 visitor.visit_datex_expression(&mut self.then_branch)?;
73 if let Some(else_branch) = &mut self.else_branch {
74 visitor.visit_datex_expression(else_branch)?;
75 }
76 Ok(())
77 }
78}
79impl<E> VisitableExpression<E> for VariableDeclaration {
80 fn walk_children(
81 &mut self,
82 visitor: &mut impl ExpressionVisitor<E>,
83 ) -> Result<(), E> {
84 visitor.visit_datex_expression(&mut self.init_expression)?;
86 if let Some(type_annotation) = &mut self.type_annotation {
87 visitor.visit_type_expression(type_annotation)?;
88 }
89 Ok(())
90 }
91}
92impl<E> VisitableExpression<E> for VariableAssignment {
93 fn walk_children(
94 &mut self,
95 visitor: &mut impl ExpressionVisitor<E>,
96 ) -> Result<(), E> {
97 visitor.visit_datex_expression(&mut self.expression)?;
98 Ok(())
99 }
100}
101impl<E> VisitableExpression<E> for UnaryOperation {
102 fn walk_children(
103 &mut self,
104 visitor: &mut impl ExpressionVisitor<E>,
105 ) -> Result<(), E> {
106 visitor.visit_datex_expression(&mut self.expression)?;
107 Ok(())
108 }
109}
110impl<E> VisitableExpression<E> for TypeDeclaration {
111 fn walk_children(
112 &mut self,
113 visitor: &mut impl ExpressionVisitor<E>,
114 ) -> Result<(), E> {
115 visitor.visit_type_expression(&mut self.definition)?;
116 Ok(())
117 }
118}
119impl<E> VisitableExpression<E> for ComparisonOperation {
120 fn walk_children(
121 &mut self,
122 visitor: &mut impl ExpressionVisitor<E>,
123 ) -> Result<(), E> {
124 visitor.visit_datex_expression(&mut self.left)?;
125 visitor.visit_datex_expression(&mut self.right)?;
126 Ok(())
127 }
128}
129impl<E> VisitableExpression<E> for DerefAssignment {
130 fn walk_children(
131 &mut self,
132 visitor: &mut impl ExpressionVisitor<E>,
133 ) -> Result<(), E> {
134 visitor.visit_datex_expression(&mut self.assigned_expression)?;
135 visitor.visit_datex_expression(&mut self.deref_expression)?;
136 Ok(())
137 }
138}
139impl<E> VisitableExpression<E> for Apply {
140 fn walk_children(
141 &mut self,
142 visitor: &mut impl ExpressionVisitor<E>,
143 ) -> Result<(), E> {
144 visitor.visit_datex_expression(&mut self.base)?;
145 for arg in &mut self.arguments {
146 visitor.visit_datex_expression(arg)?;
147 }
148 Ok(())
149 }
150}
151
152impl<E> VisitableExpression<E> for PropertyAccess {
153 fn walk_children(
154 &mut self,
155 visitor: &mut impl ExpressionVisitor<E>,
156 ) -> Result<(), E> {
157 visitor.visit_datex_expression(&mut self.base)?;
158 visitor.visit_datex_expression(&mut self.property)?;
159 Ok(())
160 }
161}
162
163impl<E> VisitableExpression<E> for GenericInstantiation {
164 fn walk_children(
165 &mut self,
166 visitor: &mut impl ExpressionVisitor<E>,
167 ) -> Result<(), E> {
168 visitor.visit_datex_expression(&mut self.base)?;
169 for arg in &mut self.generic_arguments {
170 visitor.visit_type_expression(arg)?;
171 }
172 Ok(())
173 }
174}
175
176impl<E> VisitableExpression<E> for RemoteExecution {
177 fn walk_children(
178 &mut self,
179 visitor: &mut impl ExpressionVisitor<E>,
180 ) -> Result<(), E> {
181 visitor.visit_datex_expression(&mut self.left)?;
182 visitor.visit_datex_expression(&mut self.right)?;
183 Ok(())
184 }
185}
186impl<E> VisitableExpression<E> for SlotAssignment {
187 fn walk_children(
188 &mut self,
189 visitor: &mut impl ExpressionVisitor<E>,
190 ) -> Result<(), E> {
191 visitor.visit_datex_expression(&mut self.expression)?;
192 Ok(())
193 }
194}
195impl<E> VisitableExpression<E> for CallableDeclaration {
196 fn walk_children(
197 &mut self,
198 visitor: &mut impl ExpressionVisitor<E>,
199 ) -> Result<(), E> {
200 if let Some(return_type) = &mut self.return_type {
201 visitor.visit_type_expression(return_type)?;
202 }
203 for (_, param_type) in &mut self.parameters {
204 visitor.visit_type_expression(param_type)?;
205 }
206 visitor.visit_datex_expression(&mut self.body)?;
207 Ok(())
208 }
209}
210
211impl<E> VisitableExpression<E> for Deref {
212 fn walk_children(
213 &mut self,
214 visitor: &mut impl ExpressionVisitor<E>,
215 ) -> Result<(), E> {
216 visitor.visit_datex_expression(&mut self.expression)?;
217 Ok(())
218 }
219}
220
221impl<E> VisitableExpression<E> for CreateRef {
222 fn walk_children(
223 &mut self,
224 visitor: &mut impl ExpressionVisitor<E>,
225 ) -> Result<(), E> {
226 visitor.visit_datex_expression(&mut self.expression)?;
227 Ok(())
228 }
229}
230
231impl<E> VisitableExpression<E> for PropertyAssignment {
232 fn walk_children(
233 &mut self,
234 visitor: &mut impl ExpressionVisitor<E>,
235 ) -> Result<(), E> {
236 visitor.visit_datex_expression(&mut self.base)?;
237 visitor.visit_datex_expression(&mut self.property)?;
238 visitor.visit_datex_expression(&mut self.assigned_expression)?;
239 Ok(())
240 }
241}
242
243impl<E> VisitableExpression<E> for DatexExpression {
244 fn walk_children(
245 &mut self,
246 visitor: &mut impl ExpressionVisitor<E>,
247 ) -> Result<(), E> {
248 match &mut self.data {
249 DatexExpressionData::PropertyAssignment(property_assignment) => {
250 property_assignment.walk_children(visitor)
251 }
252 DatexExpressionData::BinaryOperation(op) => {
253 op.walk_children(visitor)
254 }
255 DatexExpressionData::Statements(statements) => {
256 statements.walk_children(visitor)
257 }
258 DatexExpressionData::List(list) => list.walk_children(visitor),
259 DatexExpressionData::Map(map) => map.walk_children(visitor),
260 DatexExpressionData::Conditional(conditional) => {
261 conditional.walk_children(visitor)
262 }
263 DatexExpressionData::VariableDeclaration(variable_declaration) => {
264 variable_declaration.walk_children(visitor)
265 }
266 DatexExpressionData::VariableAssignment(variable_assignment) => {
267 variable_assignment.walk_children(visitor)
268 }
269 DatexExpressionData::TypeDeclaration(type_declaration) => {
270 type_declaration.walk_children(visitor)
271 }
272 DatexExpressionData::TypeExpression(type_expression) => {
273 type_expression.walk_children(visitor)
274 }
275 DatexExpressionData::CallableDeclaration(function_declaration) => {
276 function_declaration.walk_children(visitor)
277 }
278 DatexExpressionData::CreateRef(create_ref) => {
279 create_ref.walk_children(visitor)
280 }
281 DatexExpressionData::Deref(datex_expression) => {
282 datex_expression.walk_children(visitor)
283 }
284 DatexExpressionData::SlotAssignment(slot_assignment) => {
285 slot_assignment.walk_children(visitor)
286 }
287 DatexExpressionData::ComparisonOperation(comparison_operation) => {
288 comparison_operation.walk_children(visitor)
289 }
290 DatexExpressionData::DerefAssignment(deref_assignment) => {
291 deref_assignment.walk_children(visitor)
292 }
293 DatexExpressionData::UnaryOperation(unary_operation) => {
294 unary_operation.walk_children(visitor)
295 }
296 DatexExpressionData::Apply(apply_chain) => {
297 apply_chain.walk_children(visitor)
298 }
299 DatexExpressionData::PropertyAccess(property_access) => {
300 property_access.walk_children(visitor)
301 }
302 DatexExpressionData::GenericInstantiation(
303 generic_instantiation,
304 ) => generic_instantiation.walk_children(visitor),
305 DatexExpressionData::RemoteExecution(remote_execution) => {
306 remote_execution.walk_children(visitor)
307 }
308
309 DatexExpressionData::Noop
310 | DatexExpressionData::NativeImplementationIndicator
311 | DatexExpressionData::VariantAccess(_)
312 | DatexExpressionData::PointerAddress(_)
313 | DatexExpressionData::VariableAccess(_)
314 | DatexExpressionData::GetReference(_)
315 | DatexExpressionData::Slot(_)
316 | DatexExpressionData::Placeholder
317 | DatexExpressionData::Recover
318 | DatexExpressionData::Null
319 | DatexExpressionData::Boolean(_)
320 | DatexExpressionData::Text(_)
321 | DatexExpressionData::Decimal(_)
322 | DatexExpressionData::TypedDecimal(_)
323 | DatexExpressionData::Integer(_)
324 | DatexExpressionData::TypedInteger(_)
325 | DatexExpressionData::Identifier(_)
326 | DatexExpressionData::Endpoint(_) => Ok(()),
327 }
328 }
329}