datex_core/visitor/expression/
mod.rs

1pub mod visitable;
2use crate::ast::expressions::GenericInstantiation;
3use crate::ast::expressions::{
4    Apply, BinaryOperation, CallableDeclaration, ComparisonOperation,
5    Conditional, CreateRef, DatexExpression, DatexExpressionData, Deref,
6    DerefAssignment, List, Map, PropertyAccess, PropertyAssignment,
7    RemoteExecution, Slot, SlotAssignment, Statements, TypeDeclaration,
8    UnaryOperation, VariableAccess, VariableAssignment, VariableDeclaration,
9    VariantAccess,
10};
11use crate::values::core_values::decimal::Decimal;
12use crate::values::core_values::decimal::typed_decimal::TypedDecimal;
13use crate::values::core_values::endpoint::Endpoint;
14use crate::values::core_values::integer::Integer;
15use crate::values::core_values::integer::typed_integer::TypedInteger;
16use crate::values::pointer::PointerAddress;
17use crate::visitor::VisitAction;
18use crate::visitor::expression::visitable::{
19    ExpressionVisitResult, VisitableExpression,
20};
21use crate::visitor::type_expression::TypeExpressionVisitor;
22use core::ops::Range;
23
24pub trait ExpressionVisitor<E>: TypeExpressionVisitor<E> {
25    /// Handle expression error
26    /// Can either propagate the error or return a VisitAction to recover
27    /// Per default, it just propagates the error
28    fn handle_expression_error(
29        &mut self,
30        error: E,
31        expression: &DatexExpression,
32    ) -> Result<VisitAction<DatexExpression>, E> {
33        let _ = expression;
34        Err(error)
35    }
36
37    fn before_visit_datex_expression(
38        &mut self,
39        expression: &mut DatexExpression,
40    ) {
41        let _ = expression;
42    }
43    fn after_visit_datex_expression(
44        &mut self,
45        expression: &mut DatexExpression,
46    ) {
47        let _ = expression;
48    }
49
50    /// Visit datex expression
51    fn visit_datex_expression(
52        &mut self,
53        expr: &mut DatexExpression,
54    ) -> Result<(), E> {
55        self.before_visit_datex_expression(expr);
56        let visit_result = match &mut expr.data {
57            DatexExpressionData::PropertyAssignment(property_assignment) => {
58                self.visit_property_assignment(property_assignment, &expr.span)
59            }
60            DatexExpressionData::VariantAccess(variant_access) => {
61                self.visit_variant_access(variant_access, &expr.span)
62            }
63            DatexExpressionData::UnaryOperation(op) => {
64                self.visit_unary_operation(op, &expr.span)
65            }
66            DatexExpressionData::Statements(stmts) => {
67                self.visit_statements(stmts, &expr.span)
68            }
69            DatexExpressionData::VariableDeclaration(var_decl) => {
70                self.visit_variable_declaration(var_decl, &expr.span)
71            }
72            DatexExpressionData::VariableAssignment(var_assign) => {
73                self.visit_variable_assignment(var_assign, &expr.span)
74            }
75            DatexExpressionData::VariableAccess(var_access) => {
76                self.visit_variable_access(var_access, &expr.span)
77            }
78            DatexExpressionData::Integer(i) => {
79                self.visit_integer(i, &expr.span)
80            }
81            DatexExpressionData::TypedInteger(ti) => {
82                self.visit_typed_integer(ti, &expr.span)
83            }
84            DatexExpressionData::Decimal(d) => {
85                self.visit_decimal(d, &expr.span)
86            }
87            DatexExpressionData::TypedDecimal(td) => {
88                self.visit_typed_decimal(td, &expr.span)
89            }
90            DatexExpressionData::Text(s) => self.visit_text(s, &expr.span),
91            DatexExpressionData::Boolean(b) => {
92                self.visit_boolean(b, &expr.span)
93            }
94            DatexExpressionData::Endpoint(e) => {
95                self.visit_endpoint(e, &expr.span)
96            }
97            DatexExpressionData::Null => self.visit_null(&expr.span),
98            DatexExpressionData::List(list) => {
99                self.visit_list(list, &expr.span)
100            }
101            DatexExpressionData::Map(map) => self.visit_map(map, &expr.span),
102            DatexExpressionData::GetReference(pointer_address) => {
103                self.visit_get_reference(pointer_address, &expr.span)
104            }
105            DatexExpressionData::Conditional(conditional) => {
106                self.visit_conditional(conditional, &expr.span)
107            }
108            DatexExpressionData::TypeDeclaration(type_declaration) => {
109                self.visit_type_declaration(type_declaration, &expr.span)
110            }
111            DatexExpressionData::TypeExpression(type_expression) => self
112                .visit_type_expression(type_expression)
113                .map(|_| VisitAction::SkipChildren),
114            DatexExpressionData::CallableDeclaration(callable_declaration) => {
115                self.visit_callable_declaration(
116                    callable_declaration,
117                    &expr.span,
118                )
119            }
120            DatexExpressionData::CreateRef(create_ref) => {
121                self.visit_create_ref(create_ref, &expr.span)
122            }
123            DatexExpressionData::Deref(deref) => {
124                self.visit_deref(deref, &expr.span)
125            }
126            DatexExpressionData::Slot(slot) => {
127                self.visit_slot(slot, &expr.span)
128            }
129            DatexExpressionData::SlotAssignment(slot_assignment) => {
130                self.visit_slot_assignment(slot_assignment, &expr.span)
131            }
132            DatexExpressionData::PointerAddress(pointer_address) => {
133                self.visit_pointer_address(pointer_address, &expr.span)
134            }
135            DatexExpressionData::BinaryOperation(binary_operation) => {
136                self.visit_binary_operation(binary_operation, &expr.span)
137            }
138            DatexExpressionData::ComparisonOperation(comparison_operation) => {
139                self.visit_comparison_operation(
140                    comparison_operation,
141                    &expr.span,
142                )
143            }
144            DatexExpressionData::DerefAssignment(deref_assignment) => {
145                self.visit_deref_assignment(deref_assignment, &expr.span)
146            }
147            DatexExpressionData::Apply(apply_chain) => {
148                self.visit_apply(apply_chain, &expr.span)
149            }
150            DatexExpressionData::PropertyAccess(property_access) => {
151                self.visit_property_access(property_access, &expr.span)
152            }
153            DatexExpressionData::GenericInstantiation(
154                generic_instantiation,
155            ) => self
156                .visit_generic_instantiation(generic_instantiation, &expr.span),
157            DatexExpressionData::RemoteExecution(remote_execution) => {
158                self.visit_remote_execution(remote_execution, &expr.span)
159            }
160            DatexExpressionData::Identifier(identifier) => {
161                self.visit_identifier(identifier, &expr.span)
162            }
163            DatexExpressionData::Placeholder => {
164                self.visit_placeholder(&expr.span)
165            }
166            DatexExpressionData::Recover => {
167                unreachable!(
168                    "Placeholder and Recover expressions should not be visited"
169                )
170            }
171            DatexExpressionData::Noop => Ok(VisitAction::SkipChildren),
172            DatexExpressionData::NativeImplementationIndicator => {
173                Ok(VisitAction::SkipChildren)
174            }
175        };
176
177        let action = match visit_result {
178            Ok(act) => act,
179            Err(error) => self.handle_expression_error(error, expr)?,
180        };
181        let result = match action {
182            VisitAction::SetTypeRecurseChildNodes(type_annotation) => {
183                expr.ty = Some(type_annotation);
184                expr.walk_children(self)?;
185                Ok(())
186            }
187            VisitAction::SetTypeSkipChildren(type_annotation) => {
188                expr.ty = Some(type_annotation);
189                Ok(())
190            }
191            VisitAction::SkipChildren => Ok(()),
192            VisitAction::ToNoop => {
193                expr.data = DatexExpressionData::Noop;
194                Ok(())
195            }
196            VisitAction::VisitChildren => {
197                expr.walk_children(self)?;
198                Ok(())
199            }
200            VisitAction::Replace(new_expr) => {
201                *expr = new_expr.to_owned();
202                Ok(())
203            }
204            VisitAction::ReplaceRecurseChildNodes(new_expr) => {
205                expr.walk_children(self)?;
206                *expr = new_expr.to_owned();
207                Ok(())
208            }
209            VisitAction::ReplaceRecurse(new_expr) => {
210                *expr = new_expr.to_owned();
211                self.visit_datex_expression(expr)?;
212                Ok(())
213            }
214        };
215        self.after_visit_datex_expression(expr);
216        result
217    }
218
219    /// Visit statements
220    fn visit_statements(
221        &mut self,
222        statements: &mut Statements,
223        span: &Range<usize>,
224    ) -> ExpressionVisitResult<E> {
225        let _ = span;
226        let _ = statements;
227        Ok(VisitAction::VisitChildren)
228    }
229
230    /// Visit unary operation
231    fn visit_unary_operation(
232        &mut self,
233        unary_operation: &mut UnaryOperation,
234        span: &Range<usize>,
235    ) -> ExpressionVisitResult<E> {
236        let _ = span;
237        let _ = unary_operation;
238        Ok(VisitAction::VisitChildren)
239    }
240
241    /// Visit variant access
242    fn visit_variant_access(
243        &mut self,
244        variant_access: &mut VariantAccess,
245        span: &Range<usize>,
246    ) -> ExpressionVisitResult<E> {
247        let _ = span;
248        let _ = variant_access;
249        Ok(VisitAction::VisitChildren)
250    }
251
252    /// Visit property assignment
253    fn visit_property_assignment(
254        &mut self,
255        property_assignment: &mut PropertyAssignment,
256        span: &Range<usize>,
257    ) -> ExpressionVisitResult<E> {
258        let _ = span;
259        let _ = property_assignment;
260        Ok(VisitAction::VisitChildren)
261    }
262
263    /// Visit conditional expression
264    fn visit_conditional(
265        &mut self,
266        conditional: &mut Conditional,
267        span: &Range<usize>,
268    ) -> ExpressionVisitResult<E> {
269        let _ = span;
270        let _ = conditional;
271        Ok(VisitAction::VisitChildren)
272    }
273
274    /// Visit type declaration
275    fn visit_type_declaration(
276        &mut self,
277        type_declaration: &mut TypeDeclaration,
278        span: &Range<usize>,
279    ) -> ExpressionVisitResult<E> {
280        let _ = span;
281        let _ = type_declaration;
282        Ok(VisitAction::VisitChildren)
283    }
284
285    /// Visit binary operation
286    fn visit_binary_operation(
287        &mut self,
288        binary_operation: &mut BinaryOperation,
289        span: &Range<usize>,
290    ) -> ExpressionVisitResult<E> {
291        let _ = span;
292        let _ = binary_operation;
293        Ok(VisitAction::VisitChildren)
294    }
295
296    /// Visit comparison operation
297    fn visit_comparison_operation(
298        &mut self,
299        comparison_operation: &mut ComparisonOperation,
300        span: &Range<usize>,
301    ) -> ExpressionVisitResult<E> {
302        let _ = span;
303        let _ = comparison_operation;
304        Ok(VisitAction::VisitChildren)
305    }
306
307    /// Visit dereference assignment
308    fn visit_deref_assignment(
309        &mut self,
310        deref_assignment: &mut DerefAssignment,
311        span: &Range<usize>,
312    ) -> ExpressionVisitResult<E> {
313        let _ = span;
314        let _ = deref_assignment;
315        Ok(VisitAction::VisitChildren)
316    }
317
318    /// Visit apply chain
319    fn visit_apply(
320        &mut self,
321        apply: &mut Apply,
322        span: &Range<usize>,
323    ) -> ExpressionVisitResult<E> {
324        let _ = span;
325        let _ = apply;
326        Ok(VisitAction::VisitChildren)
327    }
328
329    /// Visit property access
330    fn visit_property_access(
331        &mut self,
332        property_access: &mut PropertyAccess,
333        span: &Range<usize>,
334    ) -> ExpressionVisitResult<E> {
335        let _ = span;
336        let _ = property_access;
337        Ok(VisitAction::VisitChildren)
338    }
339
340    /// Visit generic instantiation
341    fn visit_generic_instantiation(
342        &mut self,
343        generic_instantiation: &mut GenericInstantiation,
344        span: &Range<usize>,
345    ) -> ExpressionVisitResult<E> {
346        let _ = span;
347        let _ = generic_instantiation;
348        Ok(VisitAction::VisitChildren)
349    }
350
351    /// Visit remote execution
352    fn visit_remote_execution(
353        &mut self,
354        remote_execution: &mut RemoteExecution,
355        span: &Range<usize>,
356    ) -> ExpressionVisitResult<E> {
357        let _ = span;
358        let _ = remote_execution;
359        Ok(VisitAction::VisitChildren)
360    }
361
362    /// Visit callable declaration
363    fn visit_callable_declaration(
364        &mut self,
365        function_declaration: &mut CallableDeclaration,
366        span: &Range<usize>,
367    ) -> ExpressionVisitResult<E> {
368        let _ = span;
369        let _ = function_declaration;
370        Ok(VisitAction::VisitChildren)
371    }
372
373    /// Visit slot assignment
374    fn visit_slot_assignment(
375        &mut self,
376        slot_assignment: &mut SlotAssignment,
377        span: &Range<usize>,
378    ) -> ExpressionVisitResult<E> {
379        let _ = span;
380        let _ = slot_assignment;
381        Ok(VisitAction::VisitChildren)
382    }
383
384    /// Visit variable declaration
385    fn visit_variable_declaration(
386        &mut self,
387        variable_declaration: &mut VariableDeclaration,
388        span: &Range<usize>,
389    ) -> ExpressionVisitResult<E> {
390        let _ = span;
391        let _ = variable_declaration;
392        Ok(VisitAction::VisitChildren)
393    }
394
395    /// Visit variable assignment
396    fn visit_variable_assignment(
397        &mut self,
398        variable_assignment: &mut VariableAssignment,
399        span: &Range<usize>,
400    ) -> ExpressionVisitResult<E> {
401        let _ = span;
402        let _ = variable_assignment;
403        Ok(VisitAction::VisitChildren)
404    }
405
406    /// Visit variable access
407    fn visit_variable_access(
408        &mut self,
409        var_access: &mut VariableAccess,
410        span: &Range<usize>,
411    ) -> ExpressionVisitResult<E> {
412        let _ = span;
413        let _ = var_access;
414        Ok(VisitAction::SkipChildren)
415    }
416
417    /// Visit create reference expression
418    fn visit_create_ref(
419        &mut self,
420        create_ref: &mut CreateRef,
421        span: &Range<usize>,
422    ) -> ExpressionVisitResult<E> {
423        let _ = span;
424        let _ = create_ref;
425        Ok(VisitAction::VisitChildren)
426    }
427
428    /// Visit create mutable reference expression
429    fn visit_create_mut(
430        &mut self,
431        datex_expression: &mut DatexExpression,
432        span: &Range<usize>,
433    ) -> ExpressionVisitResult<E> {
434        let _ = span;
435        let _ = datex_expression;
436        Ok(VisitAction::VisitChildren)
437    }
438
439    /// Visit dereference expression
440    fn visit_deref(
441        &mut self,
442        deref: &mut Deref,
443        span: &Range<usize>,
444    ) -> ExpressionVisitResult<E> {
445        let _ = span;
446        let _ = deref;
447        Ok(VisitAction::VisitChildren)
448    }
449
450    /// Visit list expression
451    fn visit_list(
452        &mut self,
453        list: &mut List,
454        span: &Range<usize>,
455    ) -> ExpressionVisitResult<E> {
456        let _ = span;
457        let _ = list;
458        Ok(VisitAction::VisitChildren)
459    }
460
461    /// Visit map expression
462    fn visit_map(
463        &mut self,
464        map: &mut Map,
465        span: &Range<usize>,
466    ) -> ExpressionVisitResult<E> {
467        let _ = map;
468        let _ = span;
469        Ok(VisitAction::VisitChildren)
470    }
471
472    /// Visit integer literal
473    fn visit_integer(
474        &mut self,
475        integer: &mut Integer,
476        span: &Range<usize>,
477    ) -> ExpressionVisitResult<E> {
478        let _ = span;
479        let _ = integer;
480        Ok(VisitAction::SkipChildren)
481    }
482
483    /// Visit typed integer literal
484    fn visit_typed_integer(
485        &mut self,
486        typed_integer: &mut TypedInteger,
487        span: &Range<usize>,
488    ) -> ExpressionVisitResult<E> {
489        let _ = span;
490        let _ = typed_integer;
491        Ok(VisitAction::SkipChildren)
492    }
493
494    /// Visit decimal literal
495    fn visit_decimal(
496        &mut self,
497        decimal: &mut Decimal,
498        span: &Range<usize>,
499    ) -> ExpressionVisitResult<E> {
500        let _ = span;
501        let _ = decimal;
502        Ok(VisitAction::SkipChildren)
503    }
504
505    /// Visit typed decimal literal
506    fn visit_typed_decimal(
507        &mut self,
508        typed_decimal: &mut TypedDecimal,
509        span: &Range<usize>,
510    ) -> ExpressionVisitResult<E> {
511        let _ = span;
512        let _ = typed_decimal;
513        Ok(VisitAction::SkipChildren)
514    }
515
516    /// Visit identifier
517    fn visit_identifier(
518        &mut self,
519        identifier: &mut String,
520        span: &Range<usize>,
521    ) -> ExpressionVisitResult<E> {
522        let _ = span;
523        let _ = identifier;
524        Ok(VisitAction::SkipChildren)
525    }
526
527    fn visit_placeholder(
528        &mut self,
529        span: &Range<usize>,
530    ) -> ExpressionVisitResult<E> {
531        let _ = span;
532        Ok(VisitAction::SkipChildren)
533    }
534
535    /// Visit text literal
536    fn visit_text(
537        &mut self,
538        text: &mut String,
539        span: &Range<usize>,
540    ) -> ExpressionVisitResult<E> {
541        let _ = span;
542        let _ = text;
543        Ok(VisitAction::SkipChildren)
544    }
545
546    /// Visit get reference expression
547    fn visit_get_reference(
548        &mut self,
549        pointer_address: &mut PointerAddress,
550        span: &Range<usize>,
551    ) -> ExpressionVisitResult<E> {
552        let _ = span;
553        let _ = pointer_address;
554        Ok(VisitAction::SkipChildren)
555    }
556
557    /// Visit boolean literal
558    fn visit_boolean(
559        &mut self,
560        boolean: &mut bool,
561        span: &Range<usize>,
562    ) -> ExpressionVisitResult<E> {
563        let _ = span;
564        let _ = boolean;
565        Ok(VisitAction::SkipChildren)
566    }
567
568    /// Visit endpoint expression
569    fn visit_endpoint(
570        &mut self,
571        endpoint: &mut Endpoint,
572        span: &Range<usize>,
573    ) -> ExpressionVisitResult<E> {
574        let _ = span;
575        let _ = endpoint;
576        Ok(VisitAction::SkipChildren)
577    }
578
579    /// Visit null literal
580    fn visit_null(&mut self, span: &Range<usize>) -> ExpressionVisitResult<E> {
581        let _ = span;
582        Ok(VisitAction::SkipChildren)
583    }
584
585    /// Visit pointer address expression
586    fn visit_pointer_address(
587        &mut self,
588        pointer_address: &PointerAddress,
589        span: &Range<usize>,
590    ) -> ExpressionVisitResult<E> {
591        let _ = span;
592        let _ = pointer_address;
593        Ok(VisitAction::SkipChildren)
594    }
595
596    /// Visit slot expression
597    fn visit_slot(
598        &mut self,
599        slot: &Slot,
600        span: &Range<usize>,
601    ) -> ExpressionVisitResult<E> {
602        let _ = span;
603        let _ = slot;
604        Ok(VisitAction::SkipChildren)
605    }
606}