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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 fn visit_null(&mut self, span: &Range<usize>) -> ExpressionVisitResult<E> {
581 let _ = span;
582 Ok(VisitAction::SkipChildren)
583 }
584
585 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 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}