1use std::marker::PhantomData;
2
3use crate::nodes::*;
4
5use super::node_processor::{NodePostProcessor, NodeProcessor};
6
7pub trait NodePostVisitor<T: NodeProcessor + NodePostProcessor> {
10 fn visit_block(block: &mut Block, processor: &mut T) {
11 processor.process_block(block);
12
13 block
14 .iter_mut_statements()
15 .for_each(|statement| Self::visit_statement(statement, processor));
16
17 if let Some(last_statement) = block.mutate_last_statement() {
18 Self::visit_last_statement(last_statement, processor);
19 };
20 processor.process_after_block(block);
21 }
22
23 fn visit_statement(statement: &mut Statement, processor: &mut T) {
24 processor.process_statement(statement);
25
26 match statement {
27 Statement::Assign(statement) => Self::visit_assign_statement(statement, processor),
28 Statement::Do(statement) => Self::visit_do_statement(statement, processor),
29 Statement::Call(statement) => Self::visit_function_call(statement, processor),
30 Statement::CompoundAssign(statement) => {
31 Self::visit_compound_assign(statement, processor)
32 }
33 Statement::Function(statement) => Self::visit_function_statement(statement, processor),
34 Statement::GenericFor(statement) => Self::visit_generic_for(statement, processor),
35 Statement::If(statement) => Self::visit_if_statement(statement, processor),
36 Statement::LocalAssign(statement) => Self::visit_local_assign(statement, processor),
37 Statement::LocalFunction(statement) => Self::visit_local_function(statement, processor),
38 Statement::NumericFor(statement) => Self::visit_numeric_for(statement, processor),
39 Statement::Repeat(statement) => Self::visit_repeat_statement(statement, processor),
40 Statement::While(statement) => Self::visit_while_statement(statement, processor),
41 Statement::TypeDeclaration(statement) => {
42 Self::visit_type_declaration(statement, processor)
43 }
44 Statement::TypeFunction(statement) => {
45 Self::visit_type_function_statement(statement, processor)
46 }
47 };
48 processor.process_after_statement(statement);
49 }
50
51 fn visit_last_statement(last_statement: &mut LastStatement, processor: &mut T) {
52 processor.process_last_statement(last_statement);
53
54 if let LastStatement::Return(expressions) = last_statement {
55 expressions
56 .iter_mut_expressions()
57 .for_each(|expression| Self::visit_expression(expression, processor));
58 };
59 processor.process_after_last_statement(last_statement);
60 }
61
62 fn visit_expression(expression: &mut Expression, processor: &mut T) {
63 processor.process_expression(expression);
64
65 match expression {
66 Expression::Binary(expression) => {
67 Self::visit_binary_expression(expression, processor);
68 }
69 Expression::Call(expression) => Self::visit_function_call(expression, processor),
70 Expression::Field(field) => Self::visit_field_expression(field, processor),
71 Expression::Function(function) => Self::visit_function_expression(function, processor),
72 Expression::Identifier(identifier) => Self::visit_identifier(identifier, processor),
73 Expression::If(if_expression) => Self::visit_if_expression(if_expression, processor),
74 Expression::Index(index) => Self::visit_index_expression(index, processor),
75 Expression::Number(number) => Self::visit_number_expression(number, processor),
76 Expression::Parenthese(expression) => {
77 Self::visit_parenthese_expression(expression, processor);
78 }
79 Expression::String(string) => {
80 Self::visit_string_expression(string, processor);
81 }
82 Expression::InterpolatedString(interpolated_string) => {
83 Self::visit_interpolated_string_expression(interpolated_string, processor);
84 }
85 Expression::Table(table) => Self::visit_table(table, processor),
86 Expression::Unary(unary) => {
87 Self::visit_unary_expression(unary, processor);
88 }
89 Expression::TypeCast(type_cast) => {
90 Self::visit_type_cast_expression(type_cast, processor);
91 }
92 Expression::TypeInstantiation(type_instantiation) => {
93 Self::visit_type_instantiation(type_instantiation, processor);
94 }
95 Expression::False(_)
96 | Expression::Nil(_)
97 | Expression::True(_)
98 | Expression::VariableArguments(_) => {}
99 }
100 processor.process_after_expression(expression);
101 }
102
103 fn visit_binary_expression(binary: &mut BinaryExpression, processor: &mut T) {
104 processor.process_binary_expression(binary);
105 Self::visit_expression(binary.mutate_left(), processor);
106 Self::visit_expression(binary.mutate_right(), processor);
107 processor.process_after_binary_expression(binary);
108 }
109
110 fn visit_number_expression(number: &mut NumberExpression, processor: &mut T) {
111 processor.process_number_expression(number);
112 processor.process_after_number_expression(number);
113 }
114
115 fn visit_parenthese_expression(parenthese: &mut ParentheseExpression, processor: &mut T) {
116 processor.process_parenthese_expression(parenthese);
117 Self::visit_expression(parenthese.mutate_inner_expression(), processor);
118 processor.process_after_parenthese_expression(parenthese);
119 }
120
121 fn visit_string_expression(string: &mut StringExpression, processor: &mut T) {
122 processor.process_string_expression(string);
123 processor.process_after_string_expression(string);
124 }
125
126 fn visit_interpolated_string_expression(
127 interpolated_string: &mut InterpolatedStringExpression,
128 processor: &mut T,
129 ) {
130 processor.process_interpolated_string_expression(interpolated_string);
131
132 for segment in interpolated_string.iter_mut_segments() {
133 match segment {
134 InterpolationSegment::String(_) => {}
135 InterpolationSegment::Value(value) => {
136 Self::visit_expression(value.mutate_expression(), processor)
137 }
138 }
139 }
140 processor.process_after_interpolated_string_expression(interpolated_string);
141 }
142
143 fn visit_unary_expression(unary: &mut UnaryExpression, processor: &mut T) {
144 processor.process_unary_expression(unary);
145 Self::visit_expression(unary.mutate_expression(), processor);
146 processor.process_after_unary_expression(unary);
147 }
148
149 fn visit_type_cast_expression(type_cast: &mut TypeCastExpression, processor: &mut T) {
150 processor.process_type_cast_expression(type_cast);
151
152 Self::visit_expression(type_cast.mutate_expression(), processor);
153 Self::visit_type(type_cast.mutate_type(), processor);
154 processor.process_after_type_cast_expression(type_cast);
155 }
156
157 fn visit_type_instantiation(
158 type_instantiation: &mut TypeInstantiationExpression,
159 processor: &mut T,
160 ) {
161 processor.process_type_instantiation(type_instantiation);
162 Self::visit_prefix_expression(type_instantiation.mutate_prefix(), processor);
163 for r#type in type_instantiation.iter_mut_types() {
164 Self::visit_type(r#type, processor);
165 }
166 processor.process_after_type_instantiation(type_instantiation);
167 }
168
169 fn visit_function_expression(function: &mut FunctionExpression, processor: &mut T) {
170 processor.process_function_expression(function);
171 Self::visit_attributes(function.mutate_attributes(), processor);
172
173 processor.process_scope(function.mutate_block(), None);
174
175 Self::visit_block(function.mutate_block(), processor);
176
177 for r#type in function
178 .iter_mut_parameters()
179 .filter_map(TypedIdentifier::mutate_type)
180 {
181 Self::visit_type(r#type, processor);
182 }
183
184 if let Some(variadic_type) = function.mutate_variadic_type() {
185 Self::visit_function_variadic_type(variadic_type, processor);
186 }
187
188 if let Some(return_type) = function.mutate_return_type() {
189 Self::visit_function_return_type(return_type, processor);
190 }
191 processor.process_after_function_expression(function);
192 }
193
194 fn visit_assign_statement(statement: &mut AssignStatement, processor: &mut T) {
195 processor.process_assign_statement(statement);
196
197 statement
198 .mutate_variables()
199 .iter_mut()
200 .for_each(|variable| Self::visit_variable(variable, processor));
201
202 statement
203 .iter_mut_values()
204 .for_each(|expression| Self::visit_expression(expression, processor));
205 processor.process_after_assign_statement(statement);
206 }
207
208 fn visit_do_statement(statement: &mut DoStatement, processor: &mut T) {
209 processor.process_do_statement(statement);
210 processor.process_scope(statement.mutate_block(), None);
211 Self::visit_block(statement.mutate_block(), processor);
212 processor.process_after_do_statement(statement);
213 }
214
215 fn visit_compound_assign(statement: &mut CompoundAssignStatement, processor: &mut T) {
216 processor.process_compound_assign_statement(statement);
217 Self::visit_variable(statement.mutate_variable(), processor);
218 Self::visit_expression(statement.mutate_value(), processor);
219 processor.process_after_compound_assign_statement(statement);
220 }
221
222 fn visit_function_statement(statement: &mut FunctionStatement, processor: &mut T) {
223 processor.process_function_statement(statement);
224 Self::visit_attributes(statement.mutate_attributes(), processor);
225
226 Self::visit_identifier(
227 statement.mutate_function_name().mutate_identifier(),
228 processor,
229 );
230
231 processor.process_scope(statement.mutate_block(), None);
232 Self::visit_block(statement.mutate_block(), processor);
233
234 for r#type in statement
235 .iter_mut_parameters()
236 .filter_map(TypedIdentifier::mutate_type)
237 {
238 Self::visit_type(r#type, processor);
239 }
240
241 if let Some(variadic_type) = statement.mutate_variadic_type() {
242 Self::visit_function_variadic_type(variadic_type, processor);
243 }
244
245 if let Some(return_type) = statement.mutate_return_type() {
246 Self::visit_function_return_type(return_type, processor);
247 }
248 processor.process_after_function_statement(statement);
249 }
250
251 fn visit_generic_for(statement: &mut GenericForStatement, processor: &mut T) {
252 processor.process_generic_for_statement(statement);
253
254 statement
255 .iter_mut_expressions()
256 .for_each(|expression| Self::visit_expression(expression, processor));
257
258 processor.process_scope(statement.mutate_block(), None);
259 Self::visit_block(statement.mutate_block(), processor);
260
261 for r#type in statement
262 .iter_mut_identifiers()
263 .filter_map(TypedIdentifier::mutate_type)
264 {
265 Self::visit_type(r#type, processor);
266 }
267 processor.process_after_generic_for_statement(statement);
268 }
269
270 fn visit_if_statement(statement: &mut IfStatement, processor: &mut T) {
271 processor.process_if_statement(statement);
272
273 statement.mutate_branches().iter_mut().for_each(|branch| {
274 Self::visit_expression(branch.mutate_condition(), processor);
275 processor.process_scope(branch.mutate_block(), None);
276 Self::visit_block(branch.mutate_block(), processor);
277 });
278
279 if let Some(block) = statement.mutate_else_block() {
280 processor.process_scope(block, None);
281 Self::visit_block(block, processor);
282 }
283 processor.process_after_if_statement(statement);
284 }
285
286 fn visit_local_assign(statement: &mut VariableAssignment, processor: &mut T) {
287 processor.process_local_assign_statement(statement);
288
289 statement
290 .iter_mut_values()
291 .for_each(|value| Self::visit_expression(value, processor));
292
293 for r#type in statement
294 .iter_mut_variables()
295 .filter_map(TypedIdentifier::mutate_type)
296 {
297 Self::visit_type(r#type, processor);
298 }
299 processor.process_after_local_assign_statement(statement);
300 }
301
302 fn visit_local_function(statement: &mut FunctionAssignment, processor: &mut T) {
303 processor.process_local_function_statement(statement);
304 Self::visit_attributes(statement.mutate_attributes(), processor);
305
306 processor.process_scope(statement.mutate_block(), None);
307 Self::visit_block(statement.mutate_block(), processor);
308
309 for r#type in statement
310 .iter_mut_parameters()
311 .filter_map(TypedIdentifier::mutate_type)
312 {
313 Self::visit_type(r#type, processor);
314 }
315
316 if let Some(variadic_type) = statement.mutate_variadic_type() {
317 Self::visit_function_variadic_type(variadic_type, processor);
318 }
319
320 if let Some(return_type) = statement.mutate_return_type() {
321 Self::visit_function_return_type(return_type, processor);
322 }
323 processor.process_after_local_function_statement(statement);
324 }
325
326 fn visit_function_variadic_type(variadic_type: &mut FunctionVariadicType, processor: &mut T) {
327 match variadic_type {
328 FunctionVariadicType::Type(r#type) => {
329 Self::visit_type(r#type, processor);
330 }
331 FunctionVariadicType::GenericTypePack(generic) => {
332 Self::visit_generic_type_pack(generic, processor);
333 }
334 }
335 }
336
337 fn visit_generic_type_pack(generic: &mut GenericTypePack, processor: &mut T) {
338 processor.process_generic_type_pack(generic);
339 processor.process_after_generic_type_pack(generic);
340 }
341
342 fn visit_numeric_for(statement: &mut NumericForStatement, processor: &mut T) {
343 processor.process_numeric_for_statement(statement);
344
345 Self::visit_expression(statement.mutate_start(), processor);
346 Self::visit_expression(statement.mutate_end(), processor);
347
348 if let Some(step) = statement.mutate_step() {
349 Self::visit_expression(step, processor);
350 };
351
352 processor.process_scope(statement.mutate_block(), None);
353 Self::visit_block(statement.mutate_block(), processor);
354
355 if let Some(r#type) = statement.mutate_identifier().mutate_type() {
356 Self::visit_type(r#type, processor);
357 }
358 processor.process_after_numeric_for_statement(statement);
359 }
360
361 fn visit_repeat_statement(statement: &mut RepeatStatement, processor: &mut T) {
362 processor.process_repeat_statement(statement);
363
364 let (block, condition) = statement.mutate_block_and_condition();
365 processor.process_scope(block, Some(condition));
366
367 Self::visit_expression(statement.mutate_condition(), processor);
368 Self::visit_block(statement.mutate_block(), processor);
369 processor.process_after_repeat_statement(statement);
370 }
371
372 fn visit_while_statement(statement: &mut WhileStatement, processor: &mut T) {
373 processor.process_while_statement(statement);
374
375 Self::visit_expression(statement.mutate_condition(), processor);
376
377 processor.process_scope(statement.mutate_block(), None);
378 Self::visit_block(statement.mutate_block(), processor);
379 processor.process_after_while_statement(statement);
380 }
381
382 fn visit_type_declaration(statement: &mut TypeDeclarationStatement, processor: &mut T) {
383 processor.process_type_declaration(statement);
384
385 if let Some(generic_parameters) = statement.mutate_generic_parameters() {
386 for parameter in generic_parameters {
387 match parameter {
388 GenericParameterMutRef::TypeVariable(_) => {}
389 GenericParameterMutRef::TypeVariableWithDefault(type_variable) => {
390 Self::visit_type(type_variable.mutate_default_type(), processor);
391 }
392 GenericParameterMutRef::GenericTypePack(generic_type_pack) => {
393 Self::visit_generic_type_pack(generic_type_pack, processor);
394 }
395 GenericParameterMutRef::GenericTypePackWithDefault(
396 generic_type_pack_with_default,
397 ) => {
398 Self::visit_generic_type_pack(
399 generic_type_pack_with_default.mutate_generic_type_pack(),
400 processor,
401 );
402
403 match generic_type_pack_with_default.mutate_default_type() {
404 GenericTypePackDefault::TypePack(type_pack) => {
405 Self::visit_type_pack(type_pack, processor);
406 }
407 GenericTypePackDefault::VariadicTypePack(variadic_type_pack) => {
408 Self::visit_variadic_type_pack(variadic_type_pack, processor);
409 }
410 GenericTypePackDefault::GenericTypePack(generic_type_pack) => {
411 Self::visit_generic_type_pack(generic_type_pack, processor);
412 }
413 }
414 }
415 }
416 }
417 }
418
419 Self::visit_type(statement.mutate_type(), processor);
420 processor.process_after_type_declaration(statement);
421 }
422
423 fn visit_type_function_statement(statement: &mut TypeFunctionStatement, processor: &mut T) {
424 processor.process_type_function(statement);
425 processor.process_scope(statement.mutate_block(), None);
426 Self::visit_block(statement.mutate_block(), processor);
427
428 for r#type in statement
429 .iter_mut_parameters()
430 .filter_map(TypedIdentifier::mutate_type)
431 {
432 Self::visit_type(r#type, processor);
433 }
434
435 if let Some(variadic_type) = statement.mutate_variadic_type() {
436 Self::visit_function_variadic_type(variadic_type, processor);
437 }
438
439 if let Some(return_type) = statement.mutate_return_type() {
440 Self::visit_function_return_type(return_type, processor);
441 }
442 processor.process_after_type_function(statement);
443 }
444
445 fn visit_variable(variable: &mut Variable, processor: &mut T) {
446 processor.process_variable(variable);
447
448 match variable {
449 Variable::Identifier(identifier) => Self::visit_identifier(identifier, processor),
450 Variable::Field(field) => Self::visit_field_expression(field, processor),
451 Variable::Index(index) => Self::visit_index_expression(index, processor),
452 }
453 processor.process_after_variable(variable);
454 }
455
456 fn visit_identifier(identifier: &mut Identifier, processor: &mut T) {
457 processor.process_variable_expression(identifier);
458 processor.process_after_variable_expression(identifier);
459 }
460
461 fn visit_if_expression(if_expression: &mut IfExpression, processor: &mut T) {
462 processor.process_if_expression(if_expression);
463
464 Self::visit_expression(if_expression.mutate_condition(), processor);
465 Self::visit_expression(if_expression.mutate_result(), processor);
466
467 for branch in if_expression.iter_mut_branches() {
468 Self::visit_expression(branch.mutate_condition(), processor);
469 Self::visit_expression(branch.mutate_result(), processor);
470 }
471
472 Self::visit_expression(if_expression.mutate_else_result(), processor);
473 processor.process_after_if_expression(if_expression);
474 }
475
476 fn visit_field_expression(field: &mut FieldExpression, processor: &mut T) {
477 processor.process_field_expression(field);
478
479 Self::visit_prefix_expression(field.mutate_prefix(), processor);
480 processor.process_after_field_expression(field);
481 }
482
483 fn visit_index_expression(index: &mut IndexExpression, processor: &mut T) {
484 processor.process_index_expression(index);
485
486 Self::visit_prefix_expression(index.mutate_prefix(), processor);
487 Self::visit_expression(index.mutate_index(), processor);
488 processor.process_after_index_expression(index);
489 }
490
491 fn visit_function_call(call: &mut FunctionCall, processor: &mut T) {
492 processor.process_function_call(call);
493
494 Self::visit_prefix_expression(call.mutate_prefix(), processor);
495 Self::visit_arguments(call.mutate_arguments(), processor);
496 processor.process_after_function_call(call);
497 }
498
499 fn visit_arguments(arguments: &mut Arguments, processor: &mut T) {
500 match arguments {
501 Arguments::String(string) => Self::visit_string_expression(string, processor),
502 Arguments::Table(table) => Self::visit_table(table, processor),
503 Arguments::Tuple(expressions) => expressions
504 .iter_mut_values()
505 .for_each(|expression| Self::visit_expression(expression, processor)),
506 }
507 }
508
509 fn visit_table(table: &mut TableExpression, processor: &mut T) {
510 processor.process_table_expression(table);
511
512 table.iter_mut_entries().for_each(|entry| match entry {
513 TableEntry::Field(entry) => Self::visit_expression(entry.mutate_value(), processor),
514 TableEntry::Index(entry) => {
515 Self::visit_expression(entry.mutate_key(), processor);
516 Self::visit_expression(entry.mutate_value(), processor);
517 }
518 TableEntry::Value(value) => Self::visit_expression(value, processor),
519 });
520 processor.process_after_table_expression(table);
521 }
522
523 fn visit_prefix_expression(prefix: &mut Prefix, processor: &mut T) {
524 processor.process_prefix_expression(prefix);
525
526 match prefix {
527 Prefix::Call(call) => Self::visit_function_call(call, processor),
528 Prefix::Field(field) => Self::visit_field_expression(field, processor),
529 Prefix::Identifier(identifier) => Self::visit_identifier(identifier, processor),
530 Prefix::Index(index) => Self::visit_index_expression(index, processor),
531 Prefix::Parenthese(expression) => {
532 Self::visit_parenthese_expression(expression, processor)
533 }
534 Prefix::TypeInstantiation(type_instantiation) => {
535 Self::visit_type_instantiation(type_instantiation, processor)
536 }
537 };
538 processor.process_after_prefix_expression(prefix);
539 }
540
541 fn visit_attributes(attributes: &mut Attributes, processor: &mut T) {
542 processor.process_attributes(attributes);
543 for attribute in attributes.iter_mut_attributes() {
544 match attribute {
545 Attribute::Group(group) => {
546 for arguments in group
547 .iter_mut_attributes()
548 .flat_map(AttributeGroupElement::mutate_arguments)
549 {
550 match arguments {
551 AttributeArguments::Tuple(arguments) => {
552 for value in arguments.iter_mut_values() {
553 match value {
554 LiteralExpression::True(_)
555 | LiteralExpression::False(_)
556 | LiteralExpression::Nil(_) => {}
557 LiteralExpression::Number(number) => {
558 Self::visit_number_expression(number, processor);
559 }
560 LiteralExpression::String(string) => {
561 Self::visit_string_expression(string, processor);
562 }
563 LiteralExpression::Table(table) => {
564 Self::visit_literal_table(table, processor);
565 }
566 }
567 }
568 }
569 AttributeArguments::String(string) => {
570 Self::visit_string_expression(string, processor);
571 }
572 AttributeArguments::Table(table) => {
573 Self::visit_literal_table(table, processor);
574 }
575 }
576 }
577 }
578 Attribute::Name(_) => {
579 }
581 }
582 }
583
584 processor.process_after_attributes(attributes);
585 }
586
587 fn visit_literal_table(table: &mut LiteralTable, processor: &mut T) {
588 processor.process_literal_table(table);
589
590 for entry in table.iter_mut_entries() {
591 match entry {
592 LiteralTableEntry::Field(field) => {
593 Self::visit_literal_expression(field.mutate_value(), processor);
594 }
595 LiteralTableEntry::Value(value) => {
596 Self::visit_literal_expression(value, processor);
597 }
598 }
599 }
600
601 processor.process_after_literal_table(table);
602 }
603
604 fn visit_literal_expression(expression: &mut LiteralExpression, processor: &mut T) {
605 processor.process_literal_expression(expression);
606
607 match expression {
608 LiteralExpression::Number(number) => {
609 Self::visit_number_expression(number, processor);
610 }
611 LiteralExpression::String(string) => {
612 Self::visit_string_expression(string, processor);
613 }
614 LiteralExpression::Table(table) => {
615 Self::visit_literal_table(table, processor);
616 }
617 LiteralExpression::True(_)
618 | LiteralExpression::False(_)
619 | LiteralExpression::Nil(_) => {}
620 }
621
622 processor.process_after_literal_expression(expression);
623 }
624
625 fn visit_type(r#type: &mut Type, processor: &mut T) {
626 processor.process_type(r#type);
627
628 match r#type {
629 Type::Name(type_name) => Self::visit_type_name(type_name, processor),
630 Type::Field(type_field) => Self::visit_type_field(type_field, processor),
631 Type::Array(array) => Self::visit_array_type(array, processor),
632 Type::Table(table) => Self::visit_table_type(table, processor),
633 Type::TypeOf(expression_type) => {
634 Self::visit_expression_type(expression_type, processor)
635 }
636 Type::Parenthese(parenthese) => Self::visit_parenthese_type(parenthese, processor),
637 Type::Function(function) => Self::visit_function_type(function, processor),
638 Type::Optional(optional) => Self::visit_optional_type(optional, processor),
639 Type::Intersection(intersection) => {
640 Self::visit_intersection_type(intersection, processor)
641 }
642 Type::Union(union) => Self::visit_union_type(union, processor),
643 Type::String(string) => Self::visit_string_type(string, processor),
644 Type::True(_) | Type::False(_) | Type::Nil(_) => {}
645 }
646 processor.process_after_type(r#type);
647 }
648
649 fn visit_type_name(type_name: &mut TypeName, processor: &mut T) {
650 processor.process_type_name(type_name);
651
652 if let Some(type_parameters) = type_name.mutate_type_parameters() {
653 for type_parameter in type_parameters {
654 match type_parameter {
655 TypeParameter::Type(next_type) => {
656 Self::visit_type(next_type, processor);
657 }
658 TypeParameter::TypePack(type_pack) => {
659 Self::visit_type_pack(type_pack, processor);
660 }
661 TypeParameter::VariadicTypePack(variadic_type_pack) => {
662 Self::visit_variadic_type_pack(variadic_type_pack, processor);
663 }
664 TypeParameter::GenericTypePack(generic_type_pack) => {
665 Self::visit_generic_type_pack(generic_type_pack, processor);
666 }
667 }
668 }
669 }
670 processor.process_after_type_name(type_name);
671 }
672
673 fn visit_type_field(type_field: &mut TypeField, processor: &mut T) {
674 processor.process_type_field(type_field);
675 Self::visit_type_name(type_field.mutate_type_name(), processor);
676 processor.process_after_type_field(type_field);
677 }
678
679 fn visit_array_type(array: &mut ArrayType, processor: &mut T) {
680 processor.process_array_type(array);
681 Self::visit_type(array.mutate_element_type(), processor);
682 processor.process_after_array_type(array);
683 }
684
685 fn visit_table_type(table: &mut TableType, processor: &mut T) {
686 processor.process_table_type(table);
687
688 for entry in table.iter_mut_entries() {
689 match entry {
690 TableEntryType::Property(property) => {
691 Self::visit_type(property.mutate_type(), processor);
692 }
693 TableEntryType::Literal(property) => {
694 Self::visit_string_type(property.mutate_string(), processor);
695 Self::visit_type(property.mutate_type(), processor);
696 }
697 TableEntryType::Indexer(indexer) => {
698 Self::visit_type(indexer.mutate_key_type(), processor);
699 Self::visit_type(indexer.mutate_value_type(), processor);
700 }
701 }
702 }
703 processor.process_after_table_type(table);
704 }
705
706 fn visit_expression_type(expression_type: &mut ExpressionType, processor: &mut T) {
707 processor.process_expression_type(expression_type);
708 Self::visit_expression(expression_type.mutate_expression(), processor);
709 processor.process_after_expression_type(expression_type);
710 }
711
712 fn visit_parenthese_type(parenthese: &mut ParentheseType, processor: &mut T) {
713 processor.process_parenthese_type(parenthese);
714 Self::visit_type(parenthese.mutate_inner_type(), processor);
715 processor.process_after_parenthese_type(parenthese);
716 }
717
718 fn visit_function_type(function: &mut FunctionType, processor: &mut T) {
719 processor.process_function_type(function);
720
721 for argument in function.iter_mut_arguments() {
722 Self::visit_type(argument.mutate_type(), processor);
723 }
724
725 if let Some(variadic_type) = function.mutate_variadic_argument_type() {
726 Self::visit_variadic_argument_type(variadic_type, processor);
727 }
728
729 Self::visit_function_return_type(function.mutate_return_type(), processor);
730
731 processor.process_after_function_type(function);
732 }
733
734 fn visit_optional_type(optional: &mut OptionalType, processor: &mut T) {
735 processor.process_optional_type(optional);
736 Self::visit_type(optional.mutate_inner_type(), processor);
737 processor.process_after_optional_type(optional);
738 }
739
740 fn visit_intersection_type(intersection: &mut IntersectionType, processor: &mut T) {
741 processor.process_intersection_type(intersection);
742
743 for r#type in intersection.iter_mut_types() {
744 Self::visit_type(r#type, processor);
745 }
746 processor.process_after_intersection_type(intersection);
747 }
748
749 fn visit_union_type(union: &mut UnionType, processor: &mut T) {
750 processor.process_union_type(union);
751
752 for r#type in union.iter_mut_types() {
753 Self::visit_type(r#type, processor);
754 }
755 processor.process_after_union_type(union);
756 }
757
758 fn visit_string_type(string: &mut StringType, processor: &mut T) {
759 processor.process_string_type(string);
760 processor.process_after_string_type(string);
761 }
762
763 fn visit_type_pack(type_pack: &mut TypePack, processor: &mut T) {
764 processor.process_type_pack(type_pack);
765
766 for next_type in type_pack.into_iter() {
767 Self::visit_type(next_type, processor)
768 }
769 if let Some(variadic_type) = type_pack.mutate_variadic_type() {
770 Self::visit_variadic_argument_type(variadic_type, processor);
771 }
772 processor.process_after_type_pack(type_pack);
773 }
774
775 fn visit_variadic_type_pack(variadic_type_pack: &mut VariadicTypePack, processor: &mut T) {
776 processor.process_variadic_type_pack(variadic_type_pack);
777 Self::visit_type(variadic_type_pack.mutate_type(), processor);
778 processor.process_after_variadic_type_pack(variadic_type_pack);
779 }
780
781 fn visit_variadic_argument_type(variadic_type: &mut VariadicArgumentType, processor: &mut T) {
782 match variadic_type {
783 VariadicArgumentType::VariadicTypePack(variadic_type_pack) => {
784 Self::visit_variadic_type_pack(variadic_type_pack, processor);
785 }
786 VariadicArgumentType::GenericTypePack(generic_type_pack) => {
787 Self::visit_generic_type_pack(generic_type_pack, processor);
788 }
789 }
790 }
791
792 fn visit_function_return_type(
793 function_return_type: &mut FunctionReturnType,
794 processor: &mut T,
795 ) {
796 match function_return_type {
797 FunctionReturnType::Type(next_type) => {
798 Self::visit_type(next_type, processor);
799 }
800 FunctionReturnType::TypePack(type_pack) => Self::visit_type_pack(type_pack, processor),
801 FunctionReturnType::VariadicTypePack(variadic_type_pack) => {
802 Self::visit_variadic_type_pack(variadic_type_pack, processor);
803 }
804 FunctionReturnType::GenericTypePack(generic_type_pack) => {
805 Self::visit_generic_type_pack(generic_type_pack, processor);
806 }
807 }
808 }
809}
810
811pub struct DefaultPostVisitor<T> {
813 _phantom: PhantomData<T>,
814}
815
816impl<T: NodeProcessor + NodePostProcessor> NodePostVisitor<T> for DefaultPostVisitor<T> {}