Skip to main content

darklua_core/process/
post_visitor.rs

1use std::marker::PhantomData;
2
3use crate::nodes::*;
4
5use super::node_processor::{NodePostProcessor, NodeProcessor};
6
7/// Similar to the NodeVisitor, except that visits the AST using a NodePostVisitor, which
8/// makes it possible to run transforms when leaving a node.
9pub 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                    // nothing to do
580                }
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
811/// A node visitor for NodePostVisitor.
812pub struct DefaultPostVisitor<T> {
813    _phantom: PhantomData<T>,
814}
815
816impl<T: NodeProcessor + NodePostProcessor> NodePostVisitor<T> for DefaultPostVisitor<T> {}