oxc_ast_visit/generated/
visit_mut.rs

1// Auto-generated code, DO NOT EDIT DIRECTLY!
2// To edit this generated file you have to edit `tasks/ast_tools/src/generators/visit.rs`.
3
4//! Visitor Pattern
5//!
6//! See:
7//! * [visitor pattern](https://rust-unofficial.github.io/patterns/patterns/behavioural/visitor.html)
8//! * [rustc visitor](https://github.com/rust-lang/rust/blob/1.82.0/compiler/rustc_ast/src/visit.rs)
9
10#![expect(unused_variables, clippy::match_same_arms, clippy::semicolon_if_nothing_returned)]
11#![allow(clippy::needless_pass_by_ref_mut, clippy::trivially_copy_pass_by_ref)]
12
13use std::cell::Cell;
14
15use oxc_allocator::Vec;
16use oxc_syntax::scope::{ScopeFlags, ScopeId};
17
18use oxc_ast::ast::*;
19use oxc_ast::ast_kind::AstType;
20
21use walk_mut::*;
22
23/// Syntax tree traversal
24pub trait VisitMut<'a>: Sized {
25    #[inline]
26    fn enter_node(&mut self, kind: AstType) {}
27    #[inline]
28    fn leave_node(&mut self, kind: AstType) {}
29
30    #[inline]
31    fn enter_scope(&mut self, flags: ScopeFlags, scope_id: &Cell<Option<ScopeId>>) {}
32    #[inline]
33    fn leave_scope(&mut self) {}
34
35    #[inline]
36    fn visit_program(&mut self, it: &mut Program<'a>) {
37        walk_program(self, it);
38    }
39
40    #[inline]
41    fn visit_expression(&mut self, it: &mut Expression<'a>) {
42        walk_expression(self, it);
43    }
44
45    #[inline]
46    fn visit_identifier_name(&mut self, it: &mut IdentifierName<'a>) {
47        walk_identifier_name(self, it);
48    }
49
50    #[inline]
51    fn visit_identifier_reference(&mut self, it: &mut IdentifierReference<'a>) {
52        walk_identifier_reference(self, it);
53    }
54
55    #[inline]
56    fn visit_binding_identifier(&mut self, it: &mut BindingIdentifier<'a>) {
57        walk_binding_identifier(self, it);
58    }
59
60    #[inline]
61    fn visit_label_identifier(&mut self, it: &mut LabelIdentifier<'a>) {
62        walk_label_identifier(self, it);
63    }
64
65    #[inline]
66    fn visit_this_expression(&mut self, it: &mut ThisExpression) {
67        walk_this_expression(self, it);
68    }
69
70    #[inline]
71    fn visit_array_expression(&mut self, it: &mut ArrayExpression<'a>) {
72        walk_array_expression(self, it);
73    }
74
75    #[inline]
76    fn visit_array_expression_element(&mut self, it: &mut ArrayExpressionElement<'a>) {
77        walk_array_expression_element(self, it);
78    }
79
80    #[inline]
81    fn visit_elision(&mut self, it: &mut Elision) {
82        walk_elision(self, it);
83    }
84
85    #[inline]
86    fn visit_object_expression(&mut self, it: &mut ObjectExpression<'a>) {
87        walk_object_expression(self, it);
88    }
89
90    #[inline]
91    fn visit_object_property_kind(&mut self, it: &mut ObjectPropertyKind<'a>) {
92        walk_object_property_kind(self, it);
93    }
94
95    #[inline]
96    fn visit_object_property(&mut self, it: &mut ObjectProperty<'a>) {
97        walk_object_property(self, it);
98    }
99
100    #[inline]
101    fn visit_property_key(&mut self, it: &mut PropertyKey<'a>) {
102        walk_property_key(self, it);
103    }
104
105    #[inline]
106    fn visit_template_literal(&mut self, it: &mut TemplateLiteral<'a>) {
107        walk_template_literal(self, it);
108    }
109
110    #[inline]
111    fn visit_tagged_template_expression(&mut self, it: &mut TaggedTemplateExpression<'a>) {
112        walk_tagged_template_expression(self, it);
113    }
114
115    #[inline]
116    fn visit_template_element(&mut self, it: &mut TemplateElement<'a>) {
117        walk_template_element(self, it);
118    }
119
120    #[inline]
121    fn visit_member_expression(&mut self, it: &mut MemberExpression<'a>) {
122        walk_member_expression(self, it);
123    }
124
125    #[inline]
126    fn visit_computed_member_expression(&mut self, it: &mut ComputedMemberExpression<'a>) {
127        walk_computed_member_expression(self, it);
128    }
129
130    #[inline]
131    fn visit_static_member_expression(&mut self, it: &mut StaticMemberExpression<'a>) {
132        walk_static_member_expression(self, it);
133    }
134
135    #[inline]
136    fn visit_private_field_expression(&mut self, it: &mut PrivateFieldExpression<'a>) {
137        walk_private_field_expression(self, it);
138    }
139
140    #[inline]
141    fn visit_call_expression(&mut self, it: &mut CallExpression<'a>) {
142        walk_call_expression(self, it);
143    }
144
145    #[inline]
146    fn visit_new_expression(&mut self, it: &mut NewExpression<'a>) {
147        walk_new_expression(self, it);
148    }
149
150    #[inline]
151    fn visit_meta_property(&mut self, it: &mut MetaProperty<'a>) {
152        walk_meta_property(self, it);
153    }
154
155    #[inline]
156    fn visit_spread_element(&mut self, it: &mut SpreadElement<'a>) {
157        walk_spread_element(self, it);
158    }
159
160    #[inline]
161    fn visit_argument(&mut self, it: &mut Argument<'a>) {
162        walk_argument(self, it);
163    }
164
165    #[inline]
166    fn visit_update_expression(&mut self, it: &mut UpdateExpression<'a>) {
167        walk_update_expression(self, it);
168    }
169
170    #[inline]
171    fn visit_unary_expression(&mut self, it: &mut UnaryExpression<'a>) {
172        walk_unary_expression(self, it);
173    }
174
175    #[inline]
176    fn visit_binary_expression(&mut self, it: &mut BinaryExpression<'a>) {
177        walk_binary_expression(self, it);
178    }
179
180    #[inline]
181    fn visit_private_in_expression(&mut self, it: &mut PrivateInExpression<'a>) {
182        walk_private_in_expression(self, it);
183    }
184
185    #[inline]
186    fn visit_logical_expression(&mut self, it: &mut LogicalExpression<'a>) {
187        walk_logical_expression(self, it);
188    }
189
190    #[inline]
191    fn visit_conditional_expression(&mut self, it: &mut ConditionalExpression<'a>) {
192        walk_conditional_expression(self, it);
193    }
194
195    #[inline]
196    fn visit_assignment_expression(&mut self, it: &mut AssignmentExpression<'a>) {
197        walk_assignment_expression(self, it);
198    }
199
200    #[inline]
201    fn visit_assignment_target(&mut self, it: &mut AssignmentTarget<'a>) {
202        walk_assignment_target(self, it);
203    }
204
205    #[inline]
206    fn visit_simple_assignment_target(&mut self, it: &mut SimpleAssignmentTarget<'a>) {
207        walk_simple_assignment_target(self, it);
208    }
209
210    #[inline]
211    fn visit_assignment_target_pattern(&mut self, it: &mut AssignmentTargetPattern<'a>) {
212        walk_assignment_target_pattern(self, it);
213    }
214
215    #[inline]
216    fn visit_array_assignment_target(&mut self, it: &mut ArrayAssignmentTarget<'a>) {
217        walk_array_assignment_target(self, it);
218    }
219
220    #[inline]
221    fn visit_object_assignment_target(&mut self, it: &mut ObjectAssignmentTarget<'a>) {
222        walk_object_assignment_target(self, it);
223    }
224
225    #[inline]
226    fn visit_assignment_target_rest(&mut self, it: &mut AssignmentTargetRest<'a>) {
227        walk_assignment_target_rest(self, it);
228    }
229
230    #[inline]
231    fn visit_assignment_target_maybe_default(&mut self, it: &mut AssignmentTargetMaybeDefault<'a>) {
232        walk_assignment_target_maybe_default(self, it);
233    }
234
235    #[inline]
236    fn visit_assignment_target_with_default(&mut self, it: &mut AssignmentTargetWithDefault<'a>) {
237        walk_assignment_target_with_default(self, it);
238    }
239
240    #[inline]
241    fn visit_assignment_target_property(&mut self, it: &mut AssignmentTargetProperty<'a>) {
242        walk_assignment_target_property(self, it);
243    }
244
245    #[inline]
246    fn visit_assignment_target_property_identifier(
247        &mut self,
248        it: &mut AssignmentTargetPropertyIdentifier<'a>,
249    ) {
250        walk_assignment_target_property_identifier(self, it);
251    }
252
253    #[inline]
254    fn visit_assignment_target_property_property(
255        &mut self,
256        it: &mut AssignmentTargetPropertyProperty<'a>,
257    ) {
258        walk_assignment_target_property_property(self, it);
259    }
260
261    #[inline]
262    fn visit_sequence_expression(&mut self, it: &mut SequenceExpression<'a>) {
263        walk_sequence_expression(self, it);
264    }
265
266    #[inline]
267    fn visit_super(&mut self, it: &mut Super) {
268        walk_super(self, it);
269    }
270
271    #[inline]
272    fn visit_await_expression(&mut self, it: &mut AwaitExpression<'a>) {
273        walk_await_expression(self, it);
274    }
275
276    #[inline]
277    fn visit_chain_expression(&mut self, it: &mut ChainExpression<'a>) {
278        walk_chain_expression(self, it);
279    }
280
281    #[inline]
282    fn visit_chain_element(&mut self, it: &mut ChainElement<'a>) {
283        walk_chain_element(self, it);
284    }
285
286    #[inline]
287    fn visit_parenthesized_expression(&mut self, it: &mut ParenthesizedExpression<'a>) {
288        walk_parenthesized_expression(self, it);
289    }
290
291    #[inline]
292    fn visit_statement(&mut self, it: &mut Statement<'a>) {
293        walk_statement(self, it);
294    }
295
296    #[inline]
297    fn visit_directive(&mut self, it: &mut Directive<'a>) {
298        walk_directive(self, it);
299    }
300
301    #[inline]
302    fn visit_hashbang(&mut self, it: &mut Hashbang<'a>) {
303        walk_hashbang(self, it);
304    }
305
306    #[inline]
307    fn visit_block_statement(&mut self, it: &mut BlockStatement<'a>) {
308        walk_block_statement(self, it);
309    }
310
311    #[inline]
312    fn visit_declaration(&mut self, it: &mut Declaration<'a>) {
313        walk_declaration(self, it);
314    }
315
316    #[inline]
317    fn visit_variable_declaration(&mut self, it: &mut VariableDeclaration<'a>) {
318        walk_variable_declaration(self, it);
319    }
320
321    #[inline]
322    fn visit_variable_declarator(&mut self, it: &mut VariableDeclarator<'a>) {
323        walk_variable_declarator(self, it);
324    }
325
326    #[inline]
327    fn visit_empty_statement(&mut self, it: &mut EmptyStatement) {
328        walk_empty_statement(self, it);
329    }
330
331    #[inline]
332    fn visit_expression_statement(&mut self, it: &mut ExpressionStatement<'a>) {
333        walk_expression_statement(self, it);
334    }
335
336    #[inline]
337    fn visit_if_statement(&mut self, it: &mut IfStatement<'a>) {
338        walk_if_statement(self, it);
339    }
340
341    #[inline]
342    fn visit_do_while_statement(&mut self, it: &mut DoWhileStatement<'a>) {
343        walk_do_while_statement(self, it);
344    }
345
346    #[inline]
347    fn visit_while_statement(&mut self, it: &mut WhileStatement<'a>) {
348        walk_while_statement(self, it);
349    }
350
351    #[inline]
352    fn visit_for_statement(&mut self, it: &mut ForStatement<'a>) {
353        walk_for_statement(self, it);
354    }
355
356    #[inline]
357    fn visit_for_statement_init(&mut self, it: &mut ForStatementInit<'a>) {
358        walk_for_statement_init(self, it);
359    }
360
361    #[inline]
362    fn visit_for_in_statement(&mut self, it: &mut ForInStatement<'a>) {
363        walk_for_in_statement(self, it);
364    }
365
366    #[inline]
367    fn visit_for_statement_left(&mut self, it: &mut ForStatementLeft<'a>) {
368        walk_for_statement_left(self, it);
369    }
370
371    #[inline]
372    fn visit_for_of_statement(&mut self, it: &mut ForOfStatement<'a>) {
373        walk_for_of_statement(self, it);
374    }
375
376    #[inline]
377    fn visit_continue_statement(&mut self, it: &mut ContinueStatement<'a>) {
378        walk_continue_statement(self, it);
379    }
380
381    #[inline]
382    fn visit_break_statement(&mut self, it: &mut BreakStatement<'a>) {
383        walk_break_statement(self, it);
384    }
385
386    #[inline]
387    fn visit_return_statement(&mut self, it: &mut ReturnStatement<'a>) {
388        walk_return_statement(self, it);
389    }
390
391    #[inline]
392    fn visit_with_statement(&mut self, it: &mut WithStatement<'a>) {
393        walk_with_statement(self, it);
394    }
395
396    #[inline]
397    fn visit_switch_statement(&mut self, it: &mut SwitchStatement<'a>) {
398        walk_switch_statement(self, it);
399    }
400
401    #[inline]
402    fn visit_switch_case(&mut self, it: &mut SwitchCase<'a>) {
403        walk_switch_case(self, it);
404    }
405
406    #[inline]
407    fn visit_labeled_statement(&mut self, it: &mut LabeledStatement<'a>) {
408        walk_labeled_statement(self, it);
409    }
410
411    #[inline]
412    fn visit_throw_statement(&mut self, it: &mut ThrowStatement<'a>) {
413        walk_throw_statement(self, it);
414    }
415
416    #[inline]
417    fn visit_try_statement(&mut self, it: &mut TryStatement<'a>) {
418        walk_try_statement(self, it);
419    }
420
421    #[inline]
422    fn visit_catch_clause(&mut self, it: &mut CatchClause<'a>) {
423        walk_catch_clause(self, it);
424    }
425
426    #[inline]
427    fn visit_catch_parameter(&mut self, it: &mut CatchParameter<'a>) {
428        walk_catch_parameter(self, it);
429    }
430
431    #[inline]
432    fn visit_debugger_statement(&mut self, it: &mut DebuggerStatement) {
433        walk_debugger_statement(self, it);
434    }
435
436    #[inline]
437    fn visit_binding_pattern(&mut self, it: &mut BindingPattern<'a>) {
438        walk_binding_pattern(self, it);
439    }
440
441    #[inline]
442    fn visit_binding_pattern_kind(&mut self, it: &mut BindingPatternKind<'a>) {
443        walk_binding_pattern_kind(self, it);
444    }
445
446    #[inline]
447    fn visit_assignment_pattern(&mut self, it: &mut AssignmentPattern<'a>) {
448        walk_assignment_pattern(self, it);
449    }
450
451    #[inline]
452    fn visit_object_pattern(&mut self, it: &mut ObjectPattern<'a>) {
453        walk_object_pattern(self, it);
454    }
455
456    #[inline]
457    fn visit_binding_property(&mut self, it: &mut BindingProperty<'a>) {
458        walk_binding_property(self, it);
459    }
460
461    #[inline]
462    fn visit_array_pattern(&mut self, it: &mut ArrayPattern<'a>) {
463        walk_array_pattern(self, it);
464    }
465
466    #[inline]
467    fn visit_binding_rest_element(&mut self, it: &mut BindingRestElement<'a>) {
468        walk_binding_rest_element(self, it);
469    }
470
471    #[inline]
472    fn visit_function(&mut self, it: &mut Function<'a>, flags: ScopeFlags) {
473        walk_function(self, it, flags);
474    }
475
476    #[inline]
477    fn visit_formal_parameters(&mut self, it: &mut FormalParameters<'a>) {
478        walk_formal_parameters(self, it);
479    }
480
481    #[inline]
482    fn visit_formal_parameter(&mut self, it: &mut FormalParameter<'a>) {
483        walk_formal_parameter(self, it);
484    }
485
486    #[inline]
487    fn visit_function_body(&mut self, it: &mut FunctionBody<'a>) {
488        walk_function_body(self, it);
489    }
490
491    #[inline]
492    fn visit_arrow_function_expression(&mut self, it: &mut ArrowFunctionExpression<'a>) {
493        walk_arrow_function_expression(self, it);
494    }
495
496    #[inline]
497    fn visit_yield_expression(&mut self, it: &mut YieldExpression<'a>) {
498        walk_yield_expression(self, it);
499    }
500
501    #[inline]
502    fn visit_class(&mut self, it: &mut Class<'a>) {
503        walk_class(self, it);
504    }
505
506    #[inline]
507    fn visit_class_body(&mut self, it: &mut ClassBody<'a>) {
508        walk_class_body(self, it);
509    }
510
511    #[inline]
512    fn visit_class_element(&mut self, it: &mut ClassElement<'a>) {
513        walk_class_element(self, it);
514    }
515
516    #[inline]
517    fn visit_method_definition(&mut self, it: &mut MethodDefinition<'a>) {
518        walk_method_definition(self, it);
519    }
520
521    #[inline]
522    fn visit_property_definition(&mut self, it: &mut PropertyDefinition<'a>) {
523        walk_property_definition(self, it);
524    }
525
526    #[inline]
527    fn visit_private_identifier(&mut self, it: &mut PrivateIdentifier<'a>) {
528        walk_private_identifier(self, it);
529    }
530
531    #[inline]
532    fn visit_static_block(&mut self, it: &mut StaticBlock<'a>) {
533        walk_static_block(self, it);
534    }
535
536    #[inline]
537    fn visit_module_declaration(&mut self, it: &mut ModuleDeclaration<'a>) {
538        walk_module_declaration(self, it);
539    }
540
541    #[inline]
542    fn visit_accessor_property(&mut self, it: &mut AccessorProperty<'a>) {
543        walk_accessor_property(self, it);
544    }
545
546    #[inline]
547    fn visit_import_expression(&mut self, it: &mut ImportExpression<'a>) {
548        walk_import_expression(self, it);
549    }
550
551    #[inline]
552    fn visit_import_declaration(&mut self, it: &mut ImportDeclaration<'a>) {
553        walk_import_declaration(self, it);
554    }
555
556    #[inline]
557    fn visit_import_declaration_specifier(&mut self, it: &mut ImportDeclarationSpecifier<'a>) {
558        walk_import_declaration_specifier(self, it);
559    }
560
561    #[inline]
562    fn visit_import_specifier(&mut self, it: &mut ImportSpecifier<'a>) {
563        walk_import_specifier(self, it);
564    }
565
566    #[inline]
567    fn visit_import_default_specifier(&mut self, it: &mut ImportDefaultSpecifier<'a>) {
568        walk_import_default_specifier(self, it);
569    }
570
571    #[inline]
572    fn visit_import_namespace_specifier(&mut self, it: &mut ImportNamespaceSpecifier<'a>) {
573        walk_import_namespace_specifier(self, it);
574    }
575
576    #[inline]
577    fn visit_with_clause(&mut self, it: &mut WithClause<'a>) {
578        walk_with_clause(self, it);
579    }
580
581    #[inline]
582    fn visit_import_attribute(&mut self, it: &mut ImportAttribute<'a>) {
583        walk_import_attribute(self, it);
584    }
585
586    #[inline]
587    fn visit_import_attribute_key(&mut self, it: &mut ImportAttributeKey<'a>) {
588        walk_import_attribute_key(self, it);
589    }
590
591    #[inline]
592    fn visit_export_named_declaration(&mut self, it: &mut ExportNamedDeclaration<'a>) {
593        walk_export_named_declaration(self, it);
594    }
595
596    #[inline]
597    fn visit_export_default_declaration(&mut self, it: &mut ExportDefaultDeclaration<'a>) {
598        walk_export_default_declaration(self, it);
599    }
600
601    #[inline]
602    fn visit_export_all_declaration(&mut self, it: &mut ExportAllDeclaration<'a>) {
603        walk_export_all_declaration(self, it);
604    }
605
606    #[inline]
607    fn visit_export_specifier(&mut self, it: &mut ExportSpecifier<'a>) {
608        walk_export_specifier(self, it);
609    }
610
611    #[inline]
612    fn visit_export_default_declaration_kind(&mut self, it: &mut ExportDefaultDeclarationKind<'a>) {
613        walk_export_default_declaration_kind(self, it);
614    }
615
616    #[inline]
617    fn visit_module_export_name(&mut self, it: &mut ModuleExportName<'a>) {
618        walk_module_export_name(self, it);
619    }
620
621    #[inline]
622    fn visit_v_8_intrinsic_expression(&mut self, it: &mut V8IntrinsicExpression<'a>) {
623        walk_v_8_intrinsic_expression(self, it);
624    }
625
626    #[inline]
627    fn visit_boolean_literal(&mut self, it: &mut BooleanLiteral) {
628        walk_boolean_literal(self, it);
629    }
630
631    #[inline]
632    fn visit_null_literal(&mut self, it: &mut NullLiteral) {
633        walk_null_literal(self, it);
634    }
635
636    #[inline]
637    fn visit_numeric_literal(&mut self, it: &mut NumericLiteral<'a>) {
638        walk_numeric_literal(self, it);
639    }
640
641    #[inline]
642    fn visit_string_literal(&mut self, it: &mut StringLiteral<'a>) {
643        walk_string_literal(self, it);
644    }
645
646    #[inline]
647    fn visit_big_int_literal(&mut self, it: &mut BigIntLiteral<'a>) {
648        walk_big_int_literal(self, it);
649    }
650
651    #[inline]
652    fn visit_reg_exp_literal(&mut self, it: &mut RegExpLiteral<'a>) {
653        walk_reg_exp_literal(self, it);
654    }
655
656    #[inline]
657    fn visit_jsx_element(&mut self, it: &mut JSXElement<'a>) {
658        walk_jsx_element(self, it);
659    }
660
661    #[inline]
662    fn visit_jsx_opening_element(&mut self, it: &mut JSXOpeningElement<'a>) {
663        walk_jsx_opening_element(self, it);
664    }
665
666    #[inline]
667    fn visit_jsx_closing_element(&mut self, it: &mut JSXClosingElement<'a>) {
668        walk_jsx_closing_element(self, it);
669    }
670
671    #[inline]
672    fn visit_jsx_fragment(&mut self, it: &mut JSXFragment<'a>) {
673        walk_jsx_fragment(self, it);
674    }
675
676    #[inline]
677    fn visit_jsx_opening_fragment(&mut self, it: &mut JSXOpeningFragment) {
678        walk_jsx_opening_fragment(self, it);
679    }
680
681    #[inline]
682    fn visit_jsx_closing_fragment(&mut self, it: &mut JSXClosingFragment) {
683        walk_jsx_closing_fragment(self, it);
684    }
685
686    #[inline]
687    fn visit_jsx_element_name(&mut self, it: &mut JSXElementName<'a>) {
688        walk_jsx_element_name(self, it);
689    }
690
691    #[inline]
692    fn visit_jsx_namespaced_name(&mut self, it: &mut JSXNamespacedName<'a>) {
693        walk_jsx_namespaced_name(self, it);
694    }
695
696    #[inline]
697    fn visit_jsx_member_expression(&mut self, it: &mut JSXMemberExpression<'a>) {
698        walk_jsx_member_expression(self, it);
699    }
700
701    #[inline]
702    fn visit_jsx_member_expression_object(&mut self, it: &mut JSXMemberExpressionObject<'a>) {
703        walk_jsx_member_expression_object(self, it);
704    }
705
706    #[inline]
707    fn visit_jsx_expression_container(&mut self, it: &mut JSXExpressionContainer<'a>) {
708        walk_jsx_expression_container(self, it);
709    }
710
711    #[inline]
712    fn visit_jsx_expression(&mut self, it: &mut JSXExpression<'a>) {
713        walk_jsx_expression(self, it);
714    }
715
716    #[inline]
717    fn visit_jsx_empty_expression(&mut self, it: &mut JSXEmptyExpression) {
718        walk_jsx_empty_expression(self, it);
719    }
720
721    #[inline]
722    fn visit_jsx_attribute_item(&mut self, it: &mut JSXAttributeItem<'a>) {
723        walk_jsx_attribute_item(self, it);
724    }
725
726    #[inline]
727    fn visit_jsx_attribute(&mut self, it: &mut JSXAttribute<'a>) {
728        walk_jsx_attribute(self, it);
729    }
730
731    #[inline]
732    fn visit_jsx_spread_attribute(&mut self, it: &mut JSXSpreadAttribute<'a>) {
733        walk_jsx_spread_attribute(self, it);
734    }
735
736    #[inline]
737    fn visit_jsx_attribute_name(&mut self, it: &mut JSXAttributeName<'a>) {
738        walk_jsx_attribute_name(self, it);
739    }
740
741    #[inline]
742    fn visit_jsx_attribute_value(&mut self, it: &mut JSXAttributeValue<'a>) {
743        walk_jsx_attribute_value(self, it);
744    }
745
746    #[inline]
747    fn visit_jsx_identifier(&mut self, it: &mut JSXIdentifier<'a>) {
748        walk_jsx_identifier(self, it);
749    }
750
751    #[inline]
752    fn visit_jsx_child(&mut self, it: &mut JSXChild<'a>) {
753        walk_jsx_child(self, it);
754    }
755
756    #[inline]
757    fn visit_jsx_spread_child(&mut self, it: &mut JSXSpreadChild<'a>) {
758        walk_jsx_spread_child(self, it);
759    }
760
761    #[inline]
762    fn visit_jsx_text(&mut self, it: &mut JSXText<'a>) {
763        walk_jsx_text(self, it);
764    }
765
766    #[inline]
767    fn visit_ts_this_parameter(&mut self, it: &mut TSThisParameter<'a>) {
768        walk_ts_this_parameter(self, it);
769    }
770
771    #[inline]
772    fn visit_ts_enum_declaration(&mut self, it: &mut TSEnumDeclaration<'a>) {
773        walk_ts_enum_declaration(self, it);
774    }
775
776    #[inline]
777    fn visit_ts_enum_body(&mut self, it: &mut TSEnumBody<'a>) {
778        walk_ts_enum_body(self, it);
779    }
780
781    #[inline]
782    fn visit_ts_enum_member(&mut self, it: &mut TSEnumMember<'a>) {
783        walk_ts_enum_member(self, it);
784    }
785
786    #[inline]
787    fn visit_ts_enum_member_name(&mut self, it: &mut TSEnumMemberName<'a>) {
788        walk_ts_enum_member_name(self, it);
789    }
790
791    #[inline]
792    fn visit_ts_type_annotation(&mut self, it: &mut TSTypeAnnotation<'a>) {
793        walk_ts_type_annotation(self, it);
794    }
795
796    #[inline]
797    fn visit_ts_literal_type(&mut self, it: &mut TSLiteralType<'a>) {
798        walk_ts_literal_type(self, it);
799    }
800
801    #[inline]
802    fn visit_ts_literal(&mut self, it: &mut TSLiteral<'a>) {
803        walk_ts_literal(self, it);
804    }
805
806    #[inline]
807    fn visit_ts_type(&mut self, it: &mut TSType<'a>) {
808        walk_ts_type(self, it);
809    }
810
811    #[inline]
812    fn visit_ts_conditional_type(&mut self, it: &mut TSConditionalType<'a>) {
813        walk_ts_conditional_type(self, it);
814    }
815
816    #[inline]
817    fn visit_ts_union_type(&mut self, it: &mut TSUnionType<'a>) {
818        walk_ts_union_type(self, it);
819    }
820
821    #[inline]
822    fn visit_ts_intersection_type(&mut self, it: &mut TSIntersectionType<'a>) {
823        walk_ts_intersection_type(self, it);
824    }
825
826    #[inline]
827    fn visit_ts_parenthesized_type(&mut self, it: &mut TSParenthesizedType<'a>) {
828        walk_ts_parenthesized_type(self, it);
829    }
830
831    #[inline]
832    fn visit_ts_type_operator(&mut self, it: &mut TSTypeOperator<'a>) {
833        walk_ts_type_operator(self, it);
834    }
835
836    #[inline]
837    fn visit_ts_array_type(&mut self, it: &mut TSArrayType<'a>) {
838        walk_ts_array_type(self, it);
839    }
840
841    #[inline]
842    fn visit_ts_indexed_access_type(&mut self, it: &mut TSIndexedAccessType<'a>) {
843        walk_ts_indexed_access_type(self, it);
844    }
845
846    #[inline]
847    fn visit_ts_tuple_type(&mut self, it: &mut TSTupleType<'a>) {
848        walk_ts_tuple_type(self, it);
849    }
850
851    #[inline]
852    fn visit_ts_named_tuple_member(&mut self, it: &mut TSNamedTupleMember<'a>) {
853        walk_ts_named_tuple_member(self, it);
854    }
855
856    #[inline]
857    fn visit_ts_optional_type(&mut self, it: &mut TSOptionalType<'a>) {
858        walk_ts_optional_type(self, it);
859    }
860
861    #[inline]
862    fn visit_ts_rest_type(&mut self, it: &mut TSRestType<'a>) {
863        walk_ts_rest_type(self, it);
864    }
865
866    #[inline]
867    fn visit_ts_tuple_element(&mut self, it: &mut TSTupleElement<'a>) {
868        walk_ts_tuple_element(self, it);
869    }
870
871    #[inline]
872    fn visit_ts_any_keyword(&mut self, it: &mut TSAnyKeyword) {
873        walk_ts_any_keyword(self, it);
874    }
875
876    #[inline]
877    fn visit_ts_string_keyword(&mut self, it: &mut TSStringKeyword) {
878        walk_ts_string_keyword(self, it);
879    }
880
881    #[inline]
882    fn visit_ts_boolean_keyword(&mut self, it: &mut TSBooleanKeyword) {
883        walk_ts_boolean_keyword(self, it);
884    }
885
886    #[inline]
887    fn visit_ts_number_keyword(&mut self, it: &mut TSNumberKeyword) {
888        walk_ts_number_keyword(self, it);
889    }
890
891    #[inline]
892    fn visit_ts_never_keyword(&mut self, it: &mut TSNeverKeyword) {
893        walk_ts_never_keyword(self, it);
894    }
895
896    #[inline]
897    fn visit_ts_intrinsic_keyword(&mut self, it: &mut TSIntrinsicKeyword) {
898        walk_ts_intrinsic_keyword(self, it);
899    }
900
901    #[inline]
902    fn visit_ts_unknown_keyword(&mut self, it: &mut TSUnknownKeyword) {
903        walk_ts_unknown_keyword(self, it);
904    }
905
906    #[inline]
907    fn visit_ts_null_keyword(&mut self, it: &mut TSNullKeyword) {
908        walk_ts_null_keyword(self, it);
909    }
910
911    #[inline]
912    fn visit_ts_undefined_keyword(&mut self, it: &mut TSUndefinedKeyword) {
913        walk_ts_undefined_keyword(self, it);
914    }
915
916    #[inline]
917    fn visit_ts_void_keyword(&mut self, it: &mut TSVoidKeyword) {
918        walk_ts_void_keyword(self, it);
919    }
920
921    #[inline]
922    fn visit_ts_symbol_keyword(&mut self, it: &mut TSSymbolKeyword) {
923        walk_ts_symbol_keyword(self, it);
924    }
925
926    #[inline]
927    fn visit_ts_this_type(&mut self, it: &mut TSThisType) {
928        walk_ts_this_type(self, it);
929    }
930
931    #[inline]
932    fn visit_ts_object_keyword(&mut self, it: &mut TSObjectKeyword) {
933        walk_ts_object_keyword(self, it);
934    }
935
936    #[inline]
937    fn visit_ts_big_int_keyword(&mut self, it: &mut TSBigIntKeyword) {
938        walk_ts_big_int_keyword(self, it);
939    }
940
941    #[inline]
942    fn visit_ts_type_reference(&mut self, it: &mut TSTypeReference<'a>) {
943        walk_ts_type_reference(self, it);
944    }
945
946    #[inline]
947    fn visit_ts_type_name(&mut self, it: &mut TSTypeName<'a>) {
948        walk_ts_type_name(self, it);
949    }
950
951    #[inline]
952    fn visit_ts_qualified_name(&mut self, it: &mut TSQualifiedName<'a>) {
953        walk_ts_qualified_name(self, it);
954    }
955
956    #[inline]
957    fn visit_ts_type_parameter_instantiation(&mut self, it: &mut TSTypeParameterInstantiation<'a>) {
958        walk_ts_type_parameter_instantiation(self, it);
959    }
960
961    #[inline]
962    fn visit_ts_type_parameter(&mut self, it: &mut TSTypeParameter<'a>) {
963        walk_ts_type_parameter(self, it);
964    }
965
966    #[inline]
967    fn visit_ts_type_parameter_declaration(&mut self, it: &mut TSTypeParameterDeclaration<'a>) {
968        walk_ts_type_parameter_declaration(self, it);
969    }
970
971    #[inline]
972    fn visit_ts_type_alias_declaration(&mut self, it: &mut TSTypeAliasDeclaration<'a>) {
973        walk_ts_type_alias_declaration(self, it);
974    }
975
976    #[inline]
977    fn visit_ts_class_implements(&mut self, it: &mut TSClassImplements<'a>) {
978        walk_ts_class_implements(self, it);
979    }
980
981    #[inline]
982    fn visit_ts_interface_declaration(&mut self, it: &mut TSInterfaceDeclaration<'a>) {
983        walk_ts_interface_declaration(self, it);
984    }
985
986    #[inline]
987    fn visit_ts_interface_body(&mut self, it: &mut TSInterfaceBody<'a>) {
988        walk_ts_interface_body(self, it);
989    }
990
991    #[inline]
992    fn visit_ts_property_signature(&mut self, it: &mut TSPropertySignature<'a>) {
993        walk_ts_property_signature(self, it);
994    }
995
996    #[inline]
997    fn visit_ts_signature(&mut self, it: &mut TSSignature<'a>) {
998        walk_ts_signature(self, it);
999    }
1000
1001    #[inline]
1002    fn visit_ts_index_signature(&mut self, it: &mut TSIndexSignature<'a>) {
1003        walk_ts_index_signature(self, it);
1004    }
1005
1006    #[inline]
1007    fn visit_ts_call_signature_declaration(&mut self, it: &mut TSCallSignatureDeclaration<'a>) {
1008        walk_ts_call_signature_declaration(self, it);
1009    }
1010
1011    #[inline]
1012    fn visit_ts_method_signature(&mut self, it: &mut TSMethodSignature<'a>) {
1013        walk_ts_method_signature(self, it);
1014    }
1015
1016    #[inline]
1017    fn visit_ts_construct_signature_declaration(
1018        &mut self,
1019        it: &mut TSConstructSignatureDeclaration<'a>,
1020    ) {
1021        walk_ts_construct_signature_declaration(self, it);
1022    }
1023
1024    #[inline]
1025    fn visit_ts_index_signature_name(&mut self, it: &mut TSIndexSignatureName<'a>) {
1026        walk_ts_index_signature_name(self, it);
1027    }
1028
1029    #[inline]
1030    fn visit_ts_interface_heritage(&mut self, it: &mut TSInterfaceHeritage<'a>) {
1031        walk_ts_interface_heritage(self, it);
1032    }
1033
1034    #[inline]
1035    fn visit_ts_type_predicate(&mut self, it: &mut TSTypePredicate<'a>) {
1036        walk_ts_type_predicate(self, it);
1037    }
1038
1039    #[inline]
1040    fn visit_ts_type_predicate_name(&mut self, it: &mut TSTypePredicateName<'a>) {
1041        walk_ts_type_predicate_name(self, it);
1042    }
1043
1044    #[inline]
1045    fn visit_ts_module_declaration(&mut self, it: &mut TSModuleDeclaration<'a>) {
1046        walk_ts_module_declaration(self, it);
1047    }
1048
1049    #[inline]
1050    fn visit_ts_module_declaration_name(&mut self, it: &mut TSModuleDeclarationName<'a>) {
1051        walk_ts_module_declaration_name(self, it);
1052    }
1053
1054    #[inline]
1055    fn visit_ts_module_declaration_body(&mut self, it: &mut TSModuleDeclarationBody<'a>) {
1056        walk_ts_module_declaration_body(self, it);
1057    }
1058
1059    #[inline]
1060    fn visit_ts_global_declaration(&mut self, it: &mut TSGlobalDeclaration<'a>) {
1061        walk_ts_global_declaration(self, it);
1062    }
1063
1064    #[inline]
1065    fn visit_ts_module_block(&mut self, it: &mut TSModuleBlock<'a>) {
1066        walk_ts_module_block(self, it);
1067    }
1068
1069    #[inline]
1070    fn visit_ts_type_literal(&mut self, it: &mut TSTypeLiteral<'a>) {
1071        walk_ts_type_literal(self, it);
1072    }
1073
1074    #[inline]
1075    fn visit_ts_infer_type(&mut self, it: &mut TSInferType<'a>) {
1076        walk_ts_infer_type(self, it);
1077    }
1078
1079    #[inline]
1080    fn visit_ts_type_query(&mut self, it: &mut TSTypeQuery<'a>) {
1081        walk_ts_type_query(self, it);
1082    }
1083
1084    #[inline]
1085    fn visit_ts_type_query_expr_name(&mut self, it: &mut TSTypeQueryExprName<'a>) {
1086        walk_ts_type_query_expr_name(self, it);
1087    }
1088
1089    #[inline]
1090    fn visit_ts_import_type(&mut self, it: &mut TSImportType<'a>) {
1091        walk_ts_import_type(self, it);
1092    }
1093
1094    #[inline]
1095    fn visit_ts_import_type_qualifier(&mut self, it: &mut TSImportTypeQualifier<'a>) {
1096        walk_ts_import_type_qualifier(self, it);
1097    }
1098
1099    #[inline]
1100    fn visit_ts_import_type_qualified_name(&mut self, it: &mut TSImportTypeQualifiedName<'a>) {
1101        walk_ts_import_type_qualified_name(self, it);
1102    }
1103
1104    #[inline]
1105    fn visit_ts_function_type(&mut self, it: &mut TSFunctionType<'a>) {
1106        walk_ts_function_type(self, it);
1107    }
1108
1109    #[inline]
1110    fn visit_ts_constructor_type(&mut self, it: &mut TSConstructorType<'a>) {
1111        walk_ts_constructor_type(self, it);
1112    }
1113
1114    #[inline]
1115    fn visit_ts_mapped_type(&mut self, it: &mut TSMappedType<'a>) {
1116        walk_ts_mapped_type(self, it);
1117    }
1118
1119    #[inline]
1120    fn visit_ts_template_literal_type(&mut self, it: &mut TSTemplateLiteralType<'a>) {
1121        walk_ts_template_literal_type(self, it);
1122    }
1123
1124    #[inline]
1125    fn visit_ts_as_expression(&mut self, it: &mut TSAsExpression<'a>) {
1126        walk_ts_as_expression(self, it);
1127    }
1128
1129    #[inline]
1130    fn visit_ts_satisfies_expression(&mut self, it: &mut TSSatisfiesExpression<'a>) {
1131        walk_ts_satisfies_expression(self, it);
1132    }
1133
1134    #[inline]
1135    fn visit_ts_type_assertion(&mut self, it: &mut TSTypeAssertion<'a>) {
1136        walk_ts_type_assertion(self, it);
1137    }
1138
1139    #[inline]
1140    fn visit_ts_import_equals_declaration(&mut self, it: &mut TSImportEqualsDeclaration<'a>) {
1141        walk_ts_import_equals_declaration(self, it);
1142    }
1143
1144    #[inline]
1145    fn visit_ts_module_reference(&mut self, it: &mut TSModuleReference<'a>) {
1146        walk_ts_module_reference(self, it);
1147    }
1148
1149    #[inline]
1150    fn visit_ts_external_module_reference(&mut self, it: &mut TSExternalModuleReference<'a>) {
1151        walk_ts_external_module_reference(self, it);
1152    }
1153
1154    #[inline]
1155    fn visit_ts_non_null_expression(&mut self, it: &mut TSNonNullExpression<'a>) {
1156        walk_ts_non_null_expression(self, it);
1157    }
1158
1159    #[inline]
1160    fn visit_decorator(&mut self, it: &mut Decorator<'a>) {
1161        walk_decorator(self, it);
1162    }
1163
1164    #[inline]
1165    fn visit_ts_export_assignment(&mut self, it: &mut TSExportAssignment<'a>) {
1166        walk_ts_export_assignment(self, it);
1167    }
1168
1169    #[inline]
1170    fn visit_ts_namespace_export_declaration(&mut self, it: &mut TSNamespaceExportDeclaration<'a>) {
1171        walk_ts_namespace_export_declaration(self, it);
1172    }
1173
1174    #[inline]
1175    fn visit_ts_instantiation_expression(&mut self, it: &mut TSInstantiationExpression<'a>) {
1176        walk_ts_instantiation_expression(self, it);
1177    }
1178
1179    #[inline]
1180    fn visit_js_doc_nullable_type(&mut self, it: &mut JSDocNullableType<'a>) {
1181        walk_js_doc_nullable_type(self, it);
1182    }
1183
1184    #[inline]
1185    fn visit_js_doc_non_nullable_type(&mut self, it: &mut JSDocNonNullableType<'a>) {
1186        walk_js_doc_non_nullable_type(self, it);
1187    }
1188
1189    #[inline]
1190    fn visit_js_doc_unknown_type(&mut self, it: &mut JSDocUnknownType) {
1191        walk_js_doc_unknown_type(self, it);
1192    }
1193
1194    #[inline]
1195    fn visit_span(&mut self, it: &mut Span) {
1196        walk_span(self, it);
1197    }
1198
1199    #[inline]
1200    fn visit_directives(&mut self, it: &mut Vec<'a, Directive<'a>>) {
1201        walk_directives(self, it);
1202    }
1203
1204    #[inline]
1205    fn visit_statements(&mut self, it: &mut Vec<'a, Statement<'a>>) {
1206        walk_statements(self, it);
1207    }
1208
1209    #[inline]
1210    fn visit_array_expression_elements(&mut self, it: &mut Vec<'a, ArrayExpressionElement<'a>>) {
1211        walk_array_expression_elements(self, it);
1212    }
1213
1214    #[inline]
1215    fn visit_object_property_kinds(&mut self, it: &mut Vec<'a, ObjectPropertyKind<'a>>) {
1216        walk_object_property_kinds(self, it);
1217    }
1218
1219    #[inline]
1220    fn visit_template_elements(&mut self, it: &mut Vec<'a, TemplateElement<'a>>) {
1221        walk_template_elements(self, it);
1222    }
1223
1224    #[inline]
1225    fn visit_expressions(&mut self, it: &mut Vec<'a, Expression<'a>>) {
1226        walk_expressions(self, it);
1227    }
1228
1229    #[inline]
1230    fn visit_arguments(&mut self, it: &mut Vec<'a, Argument<'a>>) {
1231        walk_arguments(self, it);
1232    }
1233
1234    #[inline]
1235    fn visit_assignment_target_properties(
1236        &mut self,
1237        it: &mut Vec<'a, AssignmentTargetProperty<'a>>,
1238    ) {
1239        walk_assignment_target_properties(self, it);
1240    }
1241
1242    #[inline]
1243    fn visit_variable_declarators(&mut self, it: &mut Vec<'a, VariableDeclarator<'a>>) {
1244        walk_variable_declarators(self, it);
1245    }
1246
1247    #[inline]
1248    fn visit_switch_cases(&mut self, it: &mut Vec<'a, SwitchCase<'a>>) {
1249        walk_switch_cases(self, it);
1250    }
1251
1252    #[inline]
1253    fn visit_binding_properties(&mut self, it: &mut Vec<'a, BindingProperty<'a>>) {
1254        walk_binding_properties(self, it);
1255    }
1256
1257    #[inline]
1258    fn visit_formal_parameter_list(&mut self, it: &mut Vec<'a, FormalParameter<'a>>) {
1259        walk_formal_parameter_list(self, it);
1260    }
1261
1262    #[inline]
1263    fn visit_decorators(&mut self, it: &mut Vec<'a, Decorator<'a>>) {
1264        walk_decorators(self, it);
1265    }
1266
1267    #[inline]
1268    fn visit_ts_class_implements_list(&mut self, it: &mut Vec<'a, TSClassImplements<'a>>) {
1269        walk_ts_class_implements_list(self, it);
1270    }
1271
1272    #[inline]
1273    fn visit_class_elements(&mut self, it: &mut Vec<'a, ClassElement<'a>>) {
1274        walk_class_elements(self, it);
1275    }
1276
1277    #[inline]
1278    fn visit_import_declaration_specifiers(
1279        &mut self,
1280        it: &mut Vec<'a, ImportDeclarationSpecifier<'a>>,
1281    ) {
1282        walk_import_declaration_specifiers(self, it);
1283    }
1284
1285    #[inline]
1286    fn visit_import_attributes(&mut self, it: &mut Vec<'a, ImportAttribute<'a>>) {
1287        walk_import_attributes(self, it);
1288    }
1289
1290    #[inline]
1291    fn visit_export_specifiers(&mut self, it: &mut Vec<'a, ExportSpecifier<'a>>) {
1292        walk_export_specifiers(self, it);
1293    }
1294
1295    #[inline]
1296    fn visit_jsx_children(&mut self, it: &mut Vec<'a, JSXChild<'a>>) {
1297        walk_jsx_children(self, it);
1298    }
1299
1300    #[inline]
1301    fn visit_jsx_attribute_items(&mut self, it: &mut Vec<'a, JSXAttributeItem<'a>>) {
1302        walk_jsx_attribute_items(self, it);
1303    }
1304
1305    #[inline]
1306    fn visit_ts_enum_members(&mut self, it: &mut Vec<'a, TSEnumMember<'a>>) {
1307        walk_ts_enum_members(self, it);
1308    }
1309
1310    #[inline]
1311    fn visit_ts_types(&mut self, it: &mut Vec<'a, TSType<'a>>) {
1312        walk_ts_types(self, it);
1313    }
1314
1315    #[inline]
1316    fn visit_ts_tuple_elements(&mut self, it: &mut Vec<'a, TSTupleElement<'a>>) {
1317        walk_ts_tuple_elements(self, it);
1318    }
1319
1320    #[inline]
1321    fn visit_ts_type_parameters(&mut self, it: &mut Vec<'a, TSTypeParameter<'a>>) {
1322        walk_ts_type_parameters(self, it);
1323    }
1324
1325    #[inline]
1326    fn visit_ts_interface_heritages(&mut self, it: &mut Vec<'a, TSInterfaceHeritage<'a>>) {
1327        walk_ts_interface_heritages(self, it);
1328    }
1329
1330    #[inline]
1331    fn visit_ts_signatures(&mut self, it: &mut Vec<'a, TSSignature<'a>>) {
1332        walk_ts_signatures(self, it);
1333    }
1334
1335    #[inline]
1336    fn visit_ts_index_signature_names(&mut self, it: &mut Vec<'a, TSIndexSignatureName<'a>>) {
1337        walk_ts_index_signature_names(self, it);
1338    }
1339
1340    #[inline]
1341    fn visit_spans(&mut self, it: &mut Vec<'a, Span>) {
1342        walk_spans(self, it);
1343    }
1344}
1345
1346pub mod walk_mut {
1347    use super::*;
1348
1349    #[inline]
1350    pub fn walk_program<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Program<'a>) {
1351        let kind = AstType::Program;
1352        visitor.enter_node(kind);
1353        visitor.enter_scope(
1354            {
1355                let mut flags = ScopeFlags::Top;
1356                if it.source_type.is_strict() || it.has_use_strict_directive() {
1357                    flags |= ScopeFlags::StrictMode;
1358                }
1359                flags
1360            },
1361            &it.scope_id,
1362        );
1363        visitor.visit_span(&mut it.span);
1364        if let Some(hashbang) = &mut it.hashbang {
1365            visitor.visit_hashbang(hashbang);
1366        }
1367        visitor.visit_directives(&mut it.directives);
1368        visitor.visit_statements(&mut it.body);
1369        visitor.leave_scope();
1370        visitor.leave_node(kind);
1371    }
1372
1373    pub fn walk_expression<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Expression<'a>) {
1374        // No `AstType` for this type
1375        match it {
1376            Expression::BooleanLiteral(it) => visitor.visit_boolean_literal(it),
1377            Expression::NullLiteral(it) => visitor.visit_null_literal(it),
1378            Expression::NumericLiteral(it) => visitor.visit_numeric_literal(it),
1379            Expression::BigIntLiteral(it) => visitor.visit_big_int_literal(it),
1380            Expression::RegExpLiteral(it) => visitor.visit_reg_exp_literal(it),
1381            Expression::StringLiteral(it) => visitor.visit_string_literal(it),
1382            Expression::TemplateLiteral(it) => visitor.visit_template_literal(it),
1383            Expression::Identifier(it) => visitor.visit_identifier_reference(it),
1384            Expression::MetaProperty(it) => visitor.visit_meta_property(it),
1385            Expression::Super(it) => visitor.visit_super(it),
1386            Expression::ArrayExpression(it) => visitor.visit_array_expression(it),
1387            Expression::ArrowFunctionExpression(it) => visitor.visit_arrow_function_expression(it),
1388            Expression::AssignmentExpression(it) => visitor.visit_assignment_expression(it),
1389            Expression::AwaitExpression(it) => visitor.visit_await_expression(it),
1390            Expression::BinaryExpression(it) => visitor.visit_binary_expression(it),
1391            Expression::CallExpression(it) => visitor.visit_call_expression(it),
1392            Expression::ChainExpression(it) => visitor.visit_chain_expression(it),
1393            Expression::ClassExpression(it) => visitor.visit_class(it),
1394            Expression::ConditionalExpression(it) => visitor.visit_conditional_expression(it),
1395            Expression::FunctionExpression(it) => {
1396                let flags = ScopeFlags::Function;
1397                visitor.visit_function(it, flags)
1398            }
1399            Expression::ImportExpression(it) => visitor.visit_import_expression(it),
1400            Expression::LogicalExpression(it) => visitor.visit_logical_expression(it),
1401            Expression::NewExpression(it) => visitor.visit_new_expression(it),
1402            Expression::ObjectExpression(it) => visitor.visit_object_expression(it),
1403            Expression::ParenthesizedExpression(it) => visitor.visit_parenthesized_expression(it),
1404            Expression::SequenceExpression(it) => visitor.visit_sequence_expression(it),
1405            Expression::TaggedTemplateExpression(it) => {
1406                visitor.visit_tagged_template_expression(it)
1407            }
1408            Expression::ThisExpression(it) => visitor.visit_this_expression(it),
1409            Expression::UnaryExpression(it) => visitor.visit_unary_expression(it),
1410            Expression::UpdateExpression(it) => visitor.visit_update_expression(it),
1411            Expression::YieldExpression(it) => visitor.visit_yield_expression(it),
1412            Expression::PrivateInExpression(it) => visitor.visit_private_in_expression(it),
1413            Expression::JSXElement(it) => visitor.visit_jsx_element(it),
1414            Expression::JSXFragment(it) => visitor.visit_jsx_fragment(it),
1415            Expression::TSAsExpression(it) => visitor.visit_ts_as_expression(it),
1416            Expression::TSSatisfiesExpression(it) => visitor.visit_ts_satisfies_expression(it),
1417            Expression::TSTypeAssertion(it) => visitor.visit_ts_type_assertion(it),
1418            Expression::TSNonNullExpression(it) => visitor.visit_ts_non_null_expression(it),
1419            Expression::TSInstantiationExpression(it) => {
1420                visitor.visit_ts_instantiation_expression(it)
1421            }
1422            Expression::V8IntrinsicExpression(it) => visitor.visit_v_8_intrinsic_expression(it),
1423            match_member_expression!(Expression) => {
1424                visitor.visit_member_expression(it.to_member_expression_mut())
1425            }
1426        }
1427    }
1428
1429    #[inline]
1430    pub fn walk_identifier_name<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut IdentifierName<'a>) {
1431        let kind = AstType::IdentifierName;
1432        visitor.enter_node(kind);
1433        visitor.visit_span(&mut it.span);
1434        visitor.leave_node(kind);
1435    }
1436
1437    #[inline]
1438    pub fn walk_identifier_reference<'a, V: VisitMut<'a>>(
1439        visitor: &mut V,
1440        it: &mut IdentifierReference<'a>,
1441    ) {
1442        let kind = AstType::IdentifierReference;
1443        visitor.enter_node(kind);
1444        visitor.visit_span(&mut it.span);
1445        visitor.leave_node(kind);
1446    }
1447
1448    #[inline]
1449    pub fn walk_binding_identifier<'a, V: VisitMut<'a>>(
1450        visitor: &mut V,
1451        it: &mut BindingIdentifier<'a>,
1452    ) {
1453        let kind = AstType::BindingIdentifier;
1454        visitor.enter_node(kind);
1455        visitor.visit_span(&mut it.span);
1456        visitor.leave_node(kind);
1457    }
1458
1459    #[inline]
1460    pub fn walk_label_identifier<'a, V: VisitMut<'a>>(
1461        visitor: &mut V,
1462        it: &mut LabelIdentifier<'a>,
1463    ) {
1464        let kind = AstType::LabelIdentifier;
1465        visitor.enter_node(kind);
1466        visitor.visit_span(&mut it.span);
1467        visitor.leave_node(kind);
1468    }
1469
1470    #[inline]
1471    pub fn walk_this_expression<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ThisExpression) {
1472        let kind = AstType::ThisExpression;
1473        visitor.enter_node(kind);
1474        visitor.visit_span(&mut it.span);
1475        visitor.leave_node(kind);
1476    }
1477
1478    #[inline]
1479    pub fn walk_array_expression<'a, V: VisitMut<'a>>(
1480        visitor: &mut V,
1481        it: &mut ArrayExpression<'a>,
1482    ) {
1483        let kind = AstType::ArrayExpression;
1484        visitor.enter_node(kind);
1485        visitor.visit_span(&mut it.span);
1486        visitor.visit_array_expression_elements(&mut it.elements);
1487        visitor.leave_node(kind);
1488    }
1489
1490    #[inline]
1491    pub fn walk_array_expression_element<'a, V: VisitMut<'a>>(
1492        visitor: &mut V,
1493        it: &mut ArrayExpressionElement<'a>,
1494    ) {
1495        // No `AstType` for this type
1496        match it {
1497            ArrayExpressionElement::SpreadElement(it) => visitor.visit_spread_element(it),
1498            ArrayExpressionElement::Elision(it) => visitor.visit_elision(it),
1499            match_expression!(ArrayExpressionElement) => {
1500                visitor.visit_expression(it.to_expression_mut())
1501            }
1502        }
1503    }
1504
1505    #[inline]
1506    pub fn walk_elision<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Elision) {
1507        let kind = AstType::Elision;
1508        visitor.enter_node(kind);
1509        visitor.visit_span(&mut it.span);
1510        visitor.leave_node(kind);
1511    }
1512
1513    #[inline]
1514    pub fn walk_object_expression<'a, V: VisitMut<'a>>(
1515        visitor: &mut V,
1516        it: &mut ObjectExpression<'a>,
1517    ) {
1518        let kind = AstType::ObjectExpression;
1519        visitor.enter_node(kind);
1520        visitor.visit_span(&mut it.span);
1521        visitor.visit_object_property_kinds(&mut it.properties);
1522        visitor.leave_node(kind);
1523    }
1524
1525    #[inline]
1526    pub fn walk_object_property_kind<'a, V: VisitMut<'a>>(
1527        visitor: &mut V,
1528        it: &mut ObjectPropertyKind<'a>,
1529    ) {
1530        // No `AstType` for this type
1531        match it {
1532            ObjectPropertyKind::ObjectProperty(it) => visitor.visit_object_property(it),
1533            ObjectPropertyKind::SpreadProperty(it) => visitor.visit_spread_element(it),
1534        }
1535    }
1536
1537    #[inline]
1538    pub fn walk_object_property<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ObjectProperty<'a>) {
1539        let kind = AstType::ObjectProperty;
1540        visitor.enter_node(kind);
1541        visitor.visit_span(&mut it.span);
1542        visitor.visit_property_key(&mut it.key);
1543        visitor.visit_expression(&mut it.value);
1544        visitor.leave_node(kind);
1545    }
1546
1547    #[inline]
1548    pub fn walk_property_key<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut PropertyKey<'a>) {
1549        // No `AstType` for this type
1550        match it {
1551            PropertyKey::StaticIdentifier(it) => visitor.visit_identifier_name(it),
1552            PropertyKey::PrivateIdentifier(it) => visitor.visit_private_identifier(it),
1553            match_expression!(PropertyKey) => visitor.visit_expression(it.to_expression_mut()),
1554        }
1555    }
1556
1557    #[inline]
1558    pub fn walk_template_literal<'a, V: VisitMut<'a>>(
1559        visitor: &mut V,
1560        it: &mut TemplateLiteral<'a>,
1561    ) {
1562        let kind = AstType::TemplateLiteral;
1563        visitor.enter_node(kind);
1564        visitor.visit_span(&mut it.span);
1565        visitor.visit_template_elements(&mut it.quasis);
1566        visitor.visit_expressions(&mut it.expressions);
1567        visitor.leave_node(kind);
1568    }
1569
1570    #[inline]
1571    pub fn walk_tagged_template_expression<'a, V: VisitMut<'a>>(
1572        visitor: &mut V,
1573        it: &mut TaggedTemplateExpression<'a>,
1574    ) {
1575        let kind = AstType::TaggedTemplateExpression;
1576        visitor.enter_node(kind);
1577        visitor.visit_span(&mut it.span);
1578        visitor.visit_expression(&mut it.tag);
1579        if let Some(type_arguments) = &mut it.type_arguments {
1580            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1581        }
1582        visitor.visit_template_literal(&mut it.quasi);
1583        visitor.leave_node(kind);
1584    }
1585
1586    #[inline]
1587    pub fn walk_template_element<'a, V: VisitMut<'a>>(
1588        visitor: &mut V,
1589        it: &mut TemplateElement<'a>,
1590    ) {
1591        let kind = AstType::TemplateElement;
1592        visitor.enter_node(kind);
1593        visitor.visit_span(&mut it.span);
1594        visitor.leave_node(kind);
1595    }
1596
1597    #[inline]
1598    pub fn walk_member_expression<'a, V: VisitMut<'a>>(
1599        visitor: &mut V,
1600        it: &mut MemberExpression<'a>,
1601    ) {
1602        // No `AstType` for this type
1603        match it {
1604            MemberExpression::ComputedMemberExpression(it) => {
1605                visitor.visit_computed_member_expression(it)
1606            }
1607            MemberExpression::StaticMemberExpression(it) => {
1608                visitor.visit_static_member_expression(it)
1609            }
1610            MemberExpression::PrivateFieldExpression(it) => {
1611                visitor.visit_private_field_expression(it)
1612            }
1613        }
1614    }
1615
1616    #[inline]
1617    pub fn walk_computed_member_expression<'a, V: VisitMut<'a>>(
1618        visitor: &mut V,
1619        it: &mut ComputedMemberExpression<'a>,
1620    ) {
1621        let kind = AstType::ComputedMemberExpression;
1622        visitor.enter_node(kind);
1623        visitor.visit_span(&mut it.span);
1624        visitor.visit_expression(&mut it.object);
1625        visitor.visit_expression(&mut it.expression);
1626        visitor.leave_node(kind);
1627    }
1628
1629    #[inline]
1630    pub fn walk_static_member_expression<'a, V: VisitMut<'a>>(
1631        visitor: &mut V,
1632        it: &mut StaticMemberExpression<'a>,
1633    ) {
1634        let kind = AstType::StaticMemberExpression;
1635        visitor.enter_node(kind);
1636        visitor.visit_span(&mut it.span);
1637        visitor.visit_expression(&mut it.object);
1638        visitor.visit_identifier_name(&mut it.property);
1639        visitor.leave_node(kind);
1640    }
1641
1642    #[inline]
1643    pub fn walk_private_field_expression<'a, V: VisitMut<'a>>(
1644        visitor: &mut V,
1645        it: &mut PrivateFieldExpression<'a>,
1646    ) {
1647        let kind = AstType::PrivateFieldExpression;
1648        visitor.enter_node(kind);
1649        visitor.visit_span(&mut it.span);
1650        visitor.visit_expression(&mut it.object);
1651        visitor.visit_private_identifier(&mut it.field);
1652        visitor.leave_node(kind);
1653    }
1654
1655    #[inline]
1656    pub fn walk_call_expression<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut CallExpression<'a>) {
1657        let kind = AstType::CallExpression;
1658        visitor.enter_node(kind);
1659        visitor.visit_span(&mut it.span);
1660        visitor.visit_expression(&mut it.callee);
1661        if let Some(type_arguments) = &mut it.type_arguments {
1662            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1663        }
1664        visitor.visit_arguments(&mut it.arguments);
1665        visitor.leave_node(kind);
1666    }
1667
1668    #[inline]
1669    pub fn walk_new_expression<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut NewExpression<'a>) {
1670        let kind = AstType::NewExpression;
1671        visitor.enter_node(kind);
1672        visitor.visit_span(&mut it.span);
1673        visitor.visit_expression(&mut it.callee);
1674        if let Some(type_arguments) = &mut it.type_arguments {
1675            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1676        }
1677        visitor.visit_arguments(&mut it.arguments);
1678        visitor.leave_node(kind);
1679    }
1680
1681    #[inline]
1682    pub fn walk_meta_property<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut MetaProperty<'a>) {
1683        let kind = AstType::MetaProperty;
1684        visitor.enter_node(kind);
1685        visitor.visit_span(&mut it.span);
1686        visitor.visit_identifier_name(&mut it.meta);
1687        visitor.visit_identifier_name(&mut it.property);
1688        visitor.leave_node(kind);
1689    }
1690
1691    #[inline]
1692    pub fn walk_spread_element<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut SpreadElement<'a>) {
1693        let kind = AstType::SpreadElement;
1694        visitor.enter_node(kind);
1695        visitor.visit_span(&mut it.span);
1696        visitor.visit_expression(&mut it.argument);
1697        visitor.leave_node(kind);
1698    }
1699
1700    #[inline]
1701    pub fn walk_argument<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Argument<'a>) {
1702        // No `AstType` for this type
1703        match it {
1704            Argument::SpreadElement(it) => visitor.visit_spread_element(it),
1705            match_expression!(Argument) => visitor.visit_expression(it.to_expression_mut()),
1706        }
1707    }
1708
1709    #[inline]
1710    pub fn walk_update_expression<'a, V: VisitMut<'a>>(
1711        visitor: &mut V,
1712        it: &mut UpdateExpression<'a>,
1713    ) {
1714        let kind = AstType::UpdateExpression;
1715        visitor.enter_node(kind);
1716        visitor.visit_span(&mut it.span);
1717        visitor.visit_simple_assignment_target(&mut it.argument);
1718        visitor.leave_node(kind);
1719    }
1720
1721    #[inline]
1722    pub fn walk_unary_expression<'a, V: VisitMut<'a>>(
1723        visitor: &mut V,
1724        it: &mut UnaryExpression<'a>,
1725    ) {
1726        let kind = AstType::UnaryExpression;
1727        visitor.enter_node(kind);
1728        visitor.visit_span(&mut it.span);
1729        visitor.visit_expression(&mut it.argument);
1730        visitor.leave_node(kind);
1731    }
1732
1733    #[inline]
1734    pub fn walk_binary_expression<'a, V: VisitMut<'a>>(
1735        visitor: &mut V,
1736        it: &mut BinaryExpression<'a>,
1737    ) {
1738        let kind = AstType::BinaryExpression;
1739        visitor.enter_node(kind);
1740        visitor.visit_span(&mut it.span);
1741        visitor.visit_expression(&mut it.left);
1742        visitor.visit_expression(&mut it.right);
1743        visitor.leave_node(kind);
1744    }
1745
1746    #[inline]
1747    pub fn walk_private_in_expression<'a, V: VisitMut<'a>>(
1748        visitor: &mut V,
1749        it: &mut PrivateInExpression<'a>,
1750    ) {
1751        let kind = AstType::PrivateInExpression;
1752        visitor.enter_node(kind);
1753        visitor.visit_span(&mut it.span);
1754        visitor.visit_private_identifier(&mut it.left);
1755        visitor.visit_expression(&mut it.right);
1756        visitor.leave_node(kind);
1757    }
1758
1759    #[inline]
1760    pub fn walk_logical_expression<'a, V: VisitMut<'a>>(
1761        visitor: &mut V,
1762        it: &mut LogicalExpression<'a>,
1763    ) {
1764        let kind = AstType::LogicalExpression;
1765        visitor.enter_node(kind);
1766        visitor.visit_span(&mut it.span);
1767        visitor.visit_expression(&mut it.left);
1768        visitor.visit_expression(&mut it.right);
1769        visitor.leave_node(kind);
1770    }
1771
1772    #[inline]
1773    pub fn walk_conditional_expression<'a, V: VisitMut<'a>>(
1774        visitor: &mut V,
1775        it: &mut ConditionalExpression<'a>,
1776    ) {
1777        let kind = AstType::ConditionalExpression;
1778        visitor.enter_node(kind);
1779        visitor.visit_span(&mut it.span);
1780        visitor.visit_expression(&mut it.test);
1781        visitor.visit_expression(&mut it.consequent);
1782        visitor.visit_expression(&mut it.alternate);
1783        visitor.leave_node(kind);
1784    }
1785
1786    #[inline]
1787    pub fn walk_assignment_expression<'a, V: VisitMut<'a>>(
1788        visitor: &mut V,
1789        it: &mut AssignmentExpression<'a>,
1790    ) {
1791        let kind = AstType::AssignmentExpression;
1792        visitor.enter_node(kind);
1793        visitor.visit_span(&mut it.span);
1794        visitor.visit_assignment_target(&mut it.left);
1795        visitor.visit_expression(&mut it.right);
1796        visitor.leave_node(kind);
1797    }
1798
1799    #[inline]
1800    pub fn walk_assignment_target<'a, V: VisitMut<'a>>(
1801        visitor: &mut V,
1802        it: &mut AssignmentTarget<'a>,
1803    ) {
1804        // No `AstType` for this type
1805        match it {
1806            match_simple_assignment_target!(AssignmentTarget) => {
1807                visitor.visit_simple_assignment_target(it.to_simple_assignment_target_mut())
1808            }
1809            match_assignment_target_pattern!(AssignmentTarget) => {
1810                visitor.visit_assignment_target_pattern(it.to_assignment_target_pattern_mut())
1811            }
1812        }
1813    }
1814
1815    pub fn walk_simple_assignment_target<'a, V: VisitMut<'a>>(
1816        visitor: &mut V,
1817        it: &mut SimpleAssignmentTarget<'a>,
1818    ) {
1819        // No `AstType` for this type
1820        match it {
1821            SimpleAssignmentTarget::AssignmentTargetIdentifier(it) => {
1822                visitor.visit_identifier_reference(it)
1823            }
1824            SimpleAssignmentTarget::TSAsExpression(it) => visitor.visit_ts_as_expression(it),
1825            SimpleAssignmentTarget::TSSatisfiesExpression(it) => {
1826                visitor.visit_ts_satisfies_expression(it)
1827            }
1828            SimpleAssignmentTarget::TSNonNullExpression(it) => {
1829                visitor.visit_ts_non_null_expression(it)
1830            }
1831            SimpleAssignmentTarget::TSTypeAssertion(it) => visitor.visit_ts_type_assertion(it),
1832            match_member_expression!(SimpleAssignmentTarget) => {
1833                visitor.visit_member_expression(it.to_member_expression_mut())
1834            }
1835        }
1836    }
1837
1838    #[inline]
1839    pub fn walk_assignment_target_pattern<'a, V: VisitMut<'a>>(
1840        visitor: &mut V,
1841        it: &mut AssignmentTargetPattern<'a>,
1842    ) {
1843        // No `AstType` for this type
1844        match it {
1845            AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
1846                visitor.visit_array_assignment_target(it)
1847            }
1848            AssignmentTargetPattern::ObjectAssignmentTarget(it) => {
1849                visitor.visit_object_assignment_target(it)
1850            }
1851        }
1852    }
1853
1854    #[inline]
1855    pub fn walk_array_assignment_target<'a, V: VisitMut<'a>>(
1856        visitor: &mut V,
1857        it: &mut ArrayAssignmentTarget<'a>,
1858    ) {
1859        let kind = AstType::ArrayAssignmentTarget;
1860        visitor.enter_node(kind);
1861        visitor.visit_span(&mut it.span);
1862        for el in it.elements.iter_mut().flatten() {
1863            visitor.visit_assignment_target_maybe_default(el);
1864        }
1865        if let Some(rest) = &mut it.rest {
1866            visitor.visit_assignment_target_rest(rest);
1867        }
1868        visitor.leave_node(kind);
1869    }
1870
1871    #[inline]
1872    pub fn walk_object_assignment_target<'a, V: VisitMut<'a>>(
1873        visitor: &mut V,
1874        it: &mut ObjectAssignmentTarget<'a>,
1875    ) {
1876        let kind = AstType::ObjectAssignmentTarget;
1877        visitor.enter_node(kind);
1878        visitor.visit_span(&mut it.span);
1879        visitor.visit_assignment_target_properties(&mut it.properties);
1880        if let Some(rest) = &mut it.rest {
1881            visitor.visit_assignment_target_rest(rest);
1882        }
1883        visitor.leave_node(kind);
1884    }
1885
1886    #[inline]
1887    pub fn walk_assignment_target_rest<'a, V: VisitMut<'a>>(
1888        visitor: &mut V,
1889        it: &mut AssignmentTargetRest<'a>,
1890    ) {
1891        let kind = AstType::AssignmentTargetRest;
1892        visitor.enter_node(kind);
1893        visitor.visit_span(&mut it.span);
1894        visitor.visit_assignment_target(&mut it.target);
1895        visitor.leave_node(kind);
1896    }
1897
1898    #[inline]
1899    pub fn walk_assignment_target_maybe_default<'a, V: VisitMut<'a>>(
1900        visitor: &mut V,
1901        it: &mut AssignmentTargetMaybeDefault<'a>,
1902    ) {
1903        // No `AstType` for this type
1904        match it {
1905            AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(it) => {
1906                visitor.visit_assignment_target_with_default(it)
1907            }
1908            match_assignment_target!(AssignmentTargetMaybeDefault) => {
1909                visitor.visit_assignment_target(it.to_assignment_target_mut())
1910            }
1911        }
1912    }
1913
1914    #[inline]
1915    pub fn walk_assignment_target_with_default<'a, V: VisitMut<'a>>(
1916        visitor: &mut V,
1917        it: &mut AssignmentTargetWithDefault<'a>,
1918    ) {
1919        let kind = AstType::AssignmentTargetWithDefault;
1920        visitor.enter_node(kind);
1921        visitor.visit_span(&mut it.span);
1922        visitor.visit_assignment_target(&mut it.binding);
1923        visitor.visit_expression(&mut it.init);
1924        visitor.leave_node(kind);
1925    }
1926
1927    #[inline]
1928    pub fn walk_assignment_target_property<'a, V: VisitMut<'a>>(
1929        visitor: &mut V,
1930        it: &mut AssignmentTargetProperty<'a>,
1931    ) {
1932        // No `AstType` for this type
1933        match it {
1934            AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(it) => {
1935                visitor.visit_assignment_target_property_identifier(it)
1936            }
1937            AssignmentTargetProperty::AssignmentTargetPropertyProperty(it) => {
1938                visitor.visit_assignment_target_property_property(it)
1939            }
1940        }
1941    }
1942
1943    #[inline]
1944    pub fn walk_assignment_target_property_identifier<'a, V: VisitMut<'a>>(
1945        visitor: &mut V,
1946        it: &mut AssignmentTargetPropertyIdentifier<'a>,
1947    ) {
1948        let kind = AstType::AssignmentTargetPropertyIdentifier;
1949        visitor.enter_node(kind);
1950        visitor.visit_span(&mut it.span);
1951        visitor.visit_identifier_reference(&mut it.binding);
1952        if let Some(init) = &mut it.init {
1953            visitor.visit_expression(init);
1954        }
1955        visitor.leave_node(kind);
1956    }
1957
1958    #[inline]
1959    pub fn walk_assignment_target_property_property<'a, V: VisitMut<'a>>(
1960        visitor: &mut V,
1961        it: &mut AssignmentTargetPropertyProperty<'a>,
1962    ) {
1963        let kind = AstType::AssignmentTargetPropertyProperty;
1964        visitor.enter_node(kind);
1965        visitor.visit_span(&mut it.span);
1966        visitor.visit_property_key(&mut it.name);
1967        visitor.visit_assignment_target_maybe_default(&mut it.binding);
1968        visitor.leave_node(kind);
1969    }
1970
1971    #[inline]
1972    pub fn walk_sequence_expression<'a, V: VisitMut<'a>>(
1973        visitor: &mut V,
1974        it: &mut SequenceExpression<'a>,
1975    ) {
1976        let kind = AstType::SequenceExpression;
1977        visitor.enter_node(kind);
1978        visitor.visit_span(&mut it.span);
1979        visitor.visit_expressions(&mut it.expressions);
1980        visitor.leave_node(kind);
1981    }
1982
1983    #[inline]
1984    pub fn walk_super<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Super) {
1985        let kind = AstType::Super;
1986        visitor.enter_node(kind);
1987        visitor.visit_span(&mut it.span);
1988        visitor.leave_node(kind);
1989    }
1990
1991    #[inline]
1992    pub fn walk_await_expression<'a, V: VisitMut<'a>>(
1993        visitor: &mut V,
1994        it: &mut AwaitExpression<'a>,
1995    ) {
1996        let kind = AstType::AwaitExpression;
1997        visitor.enter_node(kind);
1998        visitor.visit_span(&mut it.span);
1999        visitor.visit_expression(&mut it.argument);
2000        visitor.leave_node(kind);
2001    }
2002
2003    #[inline]
2004    pub fn walk_chain_expression<'a, V: VisitMut<'a>>(
2005        visitor: &mut V,
2006        it: &mut ChainExpression<'a>,
2007    ) {
2008        let kind = AstType::ChainExpression;
2009        visitor.enter_node(kind);
2010        visitor.visit_span(&mut it.span);
2011        visitor.visit_chain_element(&mut it.expression);
2012        visitor.leave_node(kind);
2013    }
2014
2015    #[inline]
2016    pub fn walk_chain_element<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ChainElement<'a>) {
2017        // No `AstType` for this type
2018        match it {
2019            ChainElement::CallExpression(it) => visitor.visit_call_expression(it),
2020            ChainElement::TSNonNullExpression(it) => visitor.visit_ts_non_null_expression(it),
2021            match_member_expression!(ChainElement) => {
2022                visitor.visit_member_expression(it.to_member_expression_mut())
2023            }
2024        }
2025    }
2026
2027    #[inline]
2028    pub fn walk_parenthesized_expression<'a, V: VisitMut<'a>>(
2029        visitor: &mut V,
2030        it: &mut ParenthesizedExpression<'a>,
2031    ) {
2032        let kind = AstType::ParenthesizedExpression;
2033        visitor.enter_node(kind);
2034        visitor.visit_span(&mut it.span);
2035        visitor.visit_expression(&mut it.expression);
2036        visitor.leave_node(kind);
2037    }
2038
2039    pub fn walk_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Statement<'a>) {
2040        // No `AstType` for this type
2041        match it {
2042            Statement::BlockStatement(it) => visitor.visit_block_statement(it),
2043            Statement::BreakStatement(it) => visitor.visit_break_statement(it),
2044            Statement::ContinueStatement(it) => visitor.visit_continue_statement(it),
2045            Statement::DebuggerStatement(it) => visitor.visit_debugger_statement(it),
2046            Statement::DoWhileStatement(it) => visitor.visit_do_while_statement(it),
2047            Statement::EmptyStatement(it) => visitor.visit_empty_statement(it),
2048            Statement::ExpressionStatement(it) => visitor.visit_expression_statement(it),
2049            Statement::ForInStatement(it) => visitor.visit_for_in_statement(it),
2050            Statement::ForOfStatement(it) => visitor.visit_for_of_statement(it),
2051            Statement::ForStatement(it) => visitor.visit_for_statement(it),
2052            Statement::IfStatement(it) => visitor.visit_if_statement(it),
2053            Statement::LabeledStatement(it) => visitor.visit_labeled_statement(it),
2054            Statement::ReturnStatement(it) => visitor.visit_return_statement(it),
2055            Statement::SwitchStatement(it) => visitor.visit_switch_statement(it),
2056            Statement::ThrowStatement(it) => visitor.visit_throw_statement(it),
2057            Statement::TryStatement(it) => visitor.visit_try_statement(it),
2058            Statement::WhileStatement(it) => visitor.visit_while_statement(it),
2059            Statement::WithStatement(it) => visitor.visit_with_statement(it),
2060            match_declaration!(Statement) => visitor.visit_declaration(it.to_declaration_mut()),
2061            match_module_declaration!(Statement) => {
2062                visitor.visit_module_declaration(it.to_module_declaration_mut())
2063            }
2064        }
2065    }
2066
2067    #[inline]
2068    pub fn walk_directive<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Directive<'a>) {
2069        let kind = AstType::Directive;
2070        visitor.enter_node(kind);
2071        visitor.visit_span(&mut it.span);
2072        visitor.visit_string_literal(&mut it.expression);
2073        visitor.leave_node(kind);
2074    }
2075
2076    #[inline]
2077    pub fn walk_hashbang<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Hashbang<'a>) {
2078        let kind = AstType::Hashbang;
2079        visitor.enter_node(kind);
2080        visitor.visit_span(&mut it.span);
2081        visitor.leave_node(kind);
2082    }
2083
2084    #[inline]
2085    pub fn walk_block_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut BlockStatement<'a>) {
2086        let kind = AstType::BlockStatement;
2087        visitor.enter_node(kind);
2088        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2089        visitor.visit_span(&mut it.span);
2090        visitor.visit_statements(&mut it.body);
2091        visitor.leave_scope();
2092        visitor.leave_node(kind);
2093    }
2094
2095    pub fn walk_declaration<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Declaration<'a>) {
2096        // No `AstType` for this type
2097        match it {
2098            Declaration::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2099            Declaration::FunctionDeclaration(it) => {
2100                let flags = ScopeFlags::Function;
2101                visitor.visit_function(it, flags)
2102            }
2103            Declaration::ClassDeclaration(it) => visitor.visit_class(it),
2104            Declaration::TSTypeAliasDeclaration(it) => visitor.visit_ts_type_alias_declaration(it),
2105            Declaration::TSInterfaceDeclaration(it) => visitor.visit_ts_interface_declaration(it),
2106            Declaration::TSEnumDeclaration(it) => visitor.visit_ts_enum_declaration(it),
2107            Declaration::TSModuleDeclaration(it) => visitor.visit_ts_module_declaration(it),
2108            Declaration::TSGlobalDeclaration(it) => visitor.visit_ts_global_declaration(it),
2109            Declaration::TSImportEqualsDeclaration(it) => {
2110                visitor.visit_ts_import_equals_declaration(it)
2111            }
2112        }
2113    }
2114
2115    #[inline]
2116    pub fn walk_variable_declaration<'a, V: VisitMut<'a>>(
2117        visitor: &mut V,
2118        it: &mut VariableDeclaration<'a>,
2119    ) {
2120        let kind = AstType::VariableDeclaration;
2121        visitor.enter_node(kind);
2122        visitor.visit_span(&mut it.span);
2123        visitor.visit_variable_declarators(&mut it.declarations);
2124        visitor.leave_node(kind);
2125    }
2126
2127    #[inline]
2128    pub fn walk_variable_declarator<'a, V: VisitMut<'a>>(
2129        visitor: &mut V,
2130        it: &mut VariableDeclarator<'a>,
2131    ) {
2132        let kind = AstType::VariableDeclarator;
2133        visitor.enter_node(kind);
2134        visitor.visit_span(&mut it.span);
2135        visitor.visit_binding_pattern(&mut it.id);
2136        if let Some(init) = &mut it.init {
2137            visitor.visit_expression(init);
2138        }
2139        visitor.leave_node(kind);
2140    }
2141
2142    #[inline]
2143    pub fn walk_empty_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut EmptyStatement) {
2144        let kind = AstType::EmptyStatement;
2145        visitor.enter_node(kind);
2146        visitor.visit_span(&mut it.span);
2147        visitor.leave_node(kind);
2148    }
2149
2150    #[inline]
2151    pub fn walk_expression_statement<'a, V: VisitMut<'a>>(
2152        visitor: &mut V,
2153        it: &mut ExpressionStatement<'a>,
2154    ) {
2155        let kind = AstType::ExpressionStatement;
2156        visitor.enter_node(kind);
2157        visitor.visit_span(&mut it.span);
2158        visitor.visit_expression(&mut it.expression);
2159        visitor.leave_node(kind);
2160    }
2161
2162    #[inline]
2163    pub fn walk_if_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut IfStatement<'a>) {
2164        let kind = AstType::IfStatement;
2165        visitor.enter_node(kind);
2166        visitor.visit_span(&mut it.span);
2167        visitor.visit_expression(&mut it.test);
2168        visitor.visit_statement(&mut it.consequent);
2169        if let Some(alternate) = &mut it.alternate {
2170            visitor.visit_statement(alternate);
2171        }
2172        visitor.leave_node(kind);
2173    }
2174
2175    #[inline]
2176    pub fn walk_do_while_statement<'a, V: VisitMut<'a>>(
2177        visitor: &mut V,
2178        it: &mut DoWhileStatement<'a>,
2179    ) {
2180        let kind = AstType::DoWhileStatement;
2181        visitor.enter_node(kind);
2182        visitor.visit_span(&mut it.span);
2183        visitor.visit_statement(&mut it.body);
2184        visitor.visit_expression(&mut it.test);
2185        visitor.leave_node(kind);
2186    }
2187
2188    #[inline]
2189    pub fn walk_while_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut WhileStatement<'a>) {
2190        let kind = AstType::WhileStatement;
2191        visitor.enter_node(kind);
2192        visitor.visit_span(&mut it.span);
2193        visitor.visit_expression(&mut it.test);
2194        visitor.visit_statement(&mut it.body);
2195        visitor.leave_node(kind);
2196    }
2197
2198    #[inline]
2199    pub fn walk_for_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ForStatement<'a>) {
2200        let kind = AstType::ForStatement;
2201        visitor.enter_node(kind);
2202        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2203        visitor.visit_span(&mut it.span);
2204        if let Some(init) = &mut it.init {
2205            visitor.visit_for_statement_init(init);
2206        }
2207        if let Some(test) = &mut it.test {
2208            visitor.visit_expression(test);
2209        }
2210        if let Some(update) = &mut it.update {
2211            visitor.visit_expression(update);
2212        }
2213        visitor.visit_statement(&mut it.body);
2214        visitor.leave_scope();
2215        visitor.leave_node(kind);
2216    }
2217
2218    #[inline]
2219    pub fn walk_for_statement_init<'a, V: VisitMut<'a>>(
2220        visitor: &mut V,
2221        it: &mut ForStatementInit<'a>,
2222    ) {
2223        // No `AstType` for this type
2224        match it {
2225            ForStatementInit::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2226            match_expression!(ForStatementInit) => visitor.visit_expression(it.to_expression_mut()),
2227        }
2228    }
2229
2230    #[inline]
2231    pub fn walk_for_in_statement<'a, V: VisitMut<'a>>(
2232        visitor: &mut V,
2233        it: &mut ForInStatement<'a>,
2234    ) {
2235        let kind = AstType::ForInStatement;
2236        visitor.enter_node(kind);
2237        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2238        visitor.visit_span(&mut it.span);
2239        visitor.visit_for_statement_left(&mut it.left);
2240        visitor.visit_expression(&mut it.right);
2241        visitor.visit_statement(&mut it.body);
2242        visitor.leave_scope();
2243        visitor.leave_node(kind);
2244    }
2245
2246    #[inline]
2247    pub fn walk_for_statement_left<'a, V: VisitMut<'a>>(
2248        visitor: &mut V,
2249        it: &mut ForStatementLeft<'a>,
2250    ) {
2251        // No `AstType` for this type
2252        match it {
2253            ForStatementLeft::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2254            match_assignment_target!(ForStatementLeft) => {
2255                visitor.visit_assignment_target(it.to_assignment_target_mut())
2256            }
2257        }
2258    }
2259
2260    #[inline]
2261    pub fn walk_for_of_statement<'a, V: VisitMut<'a>>(
2262        visitor: &mut V,
2263        it: &mut ForOfStatement<'a>,
2264    ) {
2265        let kind = AstType::ForOfStatement;
2266        visitor.enter_node(kind);
2267        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2268        visitor.visit_span(&mut it.span);
2269        visitor.visit_for_statement_left(&mut it.left);
2270        visitor.visit_expression(&mut it.right);
2271        visitor.visit_statement(&mut it.body);
2272        visitor.leave_scope();
2273        visitor.leave_node(kind);
2274    }
2275
2276    #[inline]
2277    pub fn walk_continue_statement<'a, V: VisitMut<'a>>(
2278        visitor: &mut V,
2279        it: &mut ContinueStatement<'a>,
2280    ) {
2281        let kind = AstType::ContinueStatement;
2282        visitor.enter_node(kind);
2283        visitor.visit_span(&mut it.span);
2284        if let Some(label) = &mut it.label {
2285            visitor.visit_label_identifier(label);
2286        }
2287        visitor.leave_node(kind);
2288    }
2289
2290    #[inline]
2291    pub fn walk_break_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut BreakStatement<'a>) {
2292        let kind = AstType::BreakStatement;
2293        visitor.enter_node(kind);
2294        visitor.visit_span(&mut it.span);
2295        if let Some(label) = &mut it.label {
2296            visitor.visit_label_identifier(label);
2297        }
2298        visitor.leave_node(kind);
2299    }
2300
2301    #[inline]
2302    pub fn walk_return_statement<'a, V: VisitMut<'a>>(
2303        visitor: &mut V,
2304        it: &mut ReturnStatement<'a>,
2305    ) {
2306        let kind = AstType::ReturnStatement;
2307        visitor.enter_node(kind);
2308        visitor.visit_span(&mut it.span);
2309        if let Some(argument) = &mut it.argument {
2310            visitor.visit_expression(argument);
2311        }
2312        visitor.leave_node(kind);
2313    }
2314
2315    #[inline]
2316    pub fn walk_with_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut WithStatement<'a>) {
2317        let kind = AstType::WithStatement;
2318        visitor.enter_node(kind);
2319        visitor.visit_span(&mut it.span);
2320        visitor.visit_expression(&mut it.object);
2321        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2322        visitor.visit_statement(&mut it.body);
2323        visitor.leave_scope();
2324        visitor.leave_node(kind);
2325    }
2326
2327    #[inline]
2328    pub fn walk_switch_statement<'a, V: VisitMut<'a>>(
2329        visitor: &mut V,
2330        it: &mut SwitchStatement<'a>,
2331    ) {
2332        let kind = AstType::SwitchStatement;
2333        visitor.enter_node(kind);
2334        visitor.visit_span(&mut it.span);
2335        visitor.visit_expression(&mut it.discriminant);
2336        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2337        visitor.visit_switch_cases(&mut it.cases);
2338        visitor.leave_scope();
2339        visitor.leave_node(kind);
2340    }
2341
2342    #[inline]
2343    pub fn walk_switch_case<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut SwitchCase<'a>) {
2344        let kind = AstType::SwitchCase;
2345        visitor.enter_node(kind);
2346        visitor.visit_span(&mut it.span);
2347        if let Some(test) = &mut it.test {
2348            visitor.visit_expression(test);
2349        }
2350        visitor.visit_statements(&mut it.consequent);
2351        visitor.leave_node(kind);
2352    }
2353
2354    #[inline]
2355    pub fn walk_labeled_statement<'a, V: VisitMut<'a>>(
2356        visitor: &mut V,
2357        it: &mut LabeledStatement<'a>,
2358    ) {
2359        let kind = AstType::LabeledStatement;
2360        visitor.enter_node(kind);
2361        visitor.visit_span(&mut it.span);
2362        visitor.visit_label_identifier(&mut it.label);
2363        visitor.visit_statement(&mut it.body);
2364        visitor.leave_node(kind);
2365    }
2366
2367    #[inline]
2368    pub fn walk_throw_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ThrowStatement<'a>) {
2369        let kind = AstType::ThrowStatement;
2370        visitor.enter_node(kind);
2371        visitor.visit_span(&mut it.span);
2372        visitor.visit_expression(&mut it.argument);
2373        visitor.leave_node(kind);
2374    }
2375
2376    #[inline]
2377    pub fn walk_try_statement<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TryStatement<'a>) {
2378        let kind = AstType::TryStatement;
2379        visitor.enter_node(kind);
2380        visitor.visit_span(&mut it.span);
2381        visitor.visit_block_statement(&mut it.block);
2382        if let Some(handler) = &mut it.handler {
2383            visitor.visit_catch_clause(handler);
2384        }
2385        if let Some(finalizer) = &mut it.finalizer {
2386            visitor.visit_block_statement(finalizer);
2387        }
2388        visitor.leave_node(kind);
2389    }
2390
2391    #[inline]
2392    pub fn walk_catch_clause<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut CatchClause<'a>) {
2393        let kind = AstType::CatchClause;
2394        visitor.enter_node(kind);
2395        visitor.enter_scope(ScopeFlags::CatchClause, &it.scope_id);
2396        visitor.visit_span(&mut it.span);
2397        if let Some(param) = &mut it.param {
2398            visitor.visit_catch_parameter(param);
2399        }
2400        visitor.visit_block_statement(&mut it.body);
2401        visitor.leave_scope();
2402        visitor.leave_node(kind);
2403    }
2404
2405    #[inline]
2406    pub fn walk_catch_parameter<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut CatchParameter<'a>) {
2407        let kind = AstType::CatchParameter;
2408        visitor.enter_node(kind);
2409        visitor.visit_span(&mut it.span);
2410        visitor.visit_binding_pattern(&mut it.pattern);
2411        visitor.leave_node(kind);
2412    }
2413
2414    #[inline]
2415    pub fn walk_debugger_statement<'a, V: VisitMut<'a>>(
2416        visitor: &mut V,
2417        it: &mut DebuggerStatement,
2418    ) {
2419        let kind = AstType::DebuggerStatement;
2420        visitor.enter_node(kind);
2421        visitor.visit_span(&mut it.span);
2422        visitor.leave_node(kind);
2423    }
2424
2425    #[inline]
2426    pub fn walk_binding_pattern<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut BindingPattern<'a>) {
2427        // No `AstType` for this type
2428        visitor.visit_binding_pattern_kind(&mut it.kind);
2429        if let Some(type_annotation) = &mut it.type_annotation {
2430            visitor.visit_ts_type_annotation(type_annotation);
2431        }
2432    }
2433
2434    #[inline]
2435    pub fn walk_binding_pattern_kind<'a, V: VisitMut<'a>>(
2436        visitor: &mut V,
2437        it: &mut BindingPatternKind<'a>,
2438    ) {
2439        // No `AstType` for this type
2440        match it {
2441            BindingPatternKind::BindingIdentifier(it) => visitor.visit_binding_identifier(it),
2442            BindingPatternKind::ObjectPattern(it) => visitor.visit_object_pattern(it),
2443            BindingPatternKind::ArrayPattern(it) => visitor.visit_array_pattern(it),
2444            BindingPatternKind::AssignmentPattern(it) => visitor.visit_assignment_pattern(it),
2445        }
2446    }
2447
2448    #[inline]
2449    pub fn walk_assignment_pattern<'a, V: VisitMut<'a>>(
2450        visitor: &mut V,
2451        it: &mut AssignmentPattern<'a>,
2452    ) {
2453        let kind = AstType::AssignmentPattern;
2454        visitor.enter_node(kind);
2455        visitor.visit_span(&mut it.span);
2456        visitor.visit_binding_pattern(&mut it.left);
2457        visitor.visit_expression(&mut it.right);
2458        visitor.leave_node(kind);
2459    }
2460
2461    #[inline]
2462    pub fn walk_object_pattern<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ObjectPattern<'a>) {
2463        let kind = AstType::ObjectPattern;
2464        visitor.enter_node(kind);
2465        visitor.visit_span(&mut it.span);
2466        visitor.visit_binding_properties(&mut it.properties);
2467        if let Some(rest) = &mut it.rest {
2468            visitor.visit_binding_rest_element(rest);
2469        }
2470        visitor.leave_node(kind);
2471    }
2472
2473    #[inline]
2474    pub fn walk_binding_property<'a, V: VisitMut<'a>>(
2475        visitor: &mut V,
2476        it: &mut BindingProperty<'a>,
2477    ) {
2478        let kind = AstType::BindingProperty;
2479        visitor.enter_node(kind);
2480        visitor.visit_span(&mut it.span);
2481        visitor.visit_property_key(&mut it.key);
2482        visitor.visit_binding_pattern(&mut it.value);
2483        visitor.leave_node(kind);
2484    }
2485
2486    #[inline]
2487    pub fn walk_array_pattern<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ArrayPattern<'a>) {
2488        let kind = AstType::ArrayPattern;
2489        visitor.enter_node(kind);
2490        visitor.visit_span(&mut it.span);
2491        for el in it.elements.iter_mut().flatten() {
2492            visitor.visit_binding_pattern(el);
2493        }
2494        if let Some(rest) = &mut it.rest {
2495            visitor.visit_binding_rest_element(rest);
2496        }
2497        visitor.leave_node(kind);
2498    }
2499
2500    #[inline]
2501    pub fn walk_binding_rest_element<'a, V: VisitMut<'a>>(
2502        visitor: &mut V,
2503        it: &mut BindingRestElement<'a>,
2504    ) {
2505        let kind = AstType::BindingRestElement;
2506        visitor.enter_node(kind);
2507        visitor.visit_span(&mut it.span);
2508        visitor.visit_binding_pattern(&mut it.argument);
2509        visitor.leave_node(kind);
2510    }
2511
2512    pub fn walk_function<'a, V: VisitMut<'a>>(
2513        visitor: &mut V,
2514        it: &mut Function<'a>,
2515        flags: ScopeFlags,
2516    ) {
2517        let kind = AstType::Function;
2518        visitor.enter_node(kind);
2519        visitor.enter_scope(
2520            {
2521                let mut flags = flags;
2522                if it.has_use_strict_directive() {
2523                    flags |= ScopeFlags::StrictMode;
2524                }
2525                flags
2526            },
2527            &it.scope_id,
2528        );
2529        visitor.visit_span(&mut it.span);
2530        if let Some(id) = &mut it.id {
2531            visitor.visit_binding_identifier(id);
2532        }
2533        if let Some(type_parameters) = &mut it.type_parameters {
2534            visitor.visit_ts_type_parameter_declaration(type_parameters);
2535        }
2536        if let Some(this_param) = &mut it.this_param {
2537            visitor.visit_ts_this_parameter(this_param);
2538        }
2539        visitor.visit_formal_parameters(&mut it.params);
2540        if let Some(return_type) = &mut it.return_type {
2541            visitor.visit_ts_type_annotation(return_type);
2542        }
2543        if let Some(body) = &mut it.body {
2544            visitor.visit_function_body(body);
2545        }
2546        visitor.leave_scope();
2547        visitor.leave_node(kind);
2548    }
2549
2550    #[inline]
2551    pub fn walk_formal_parameters<'a, V: VisitMut<'a>>(
2552        visitor: &mut V,
2553        it: &mut FormalParameters<'a>,
2554    ) {
2555        let kind = AstType::FormalParameters;
2556        visitor.enter_node(kind);
2557        visitor.visit_span(&mut it.span);
2558        visitor.visit_formal_parameter_list(&mut it.items);
2559        if let Some(rest) = &mut it.rest {
2560            visitor.visit_binding_rest_element(rest);
2561        }
2562        visitor.leave_node(kind);
2563    }
2564
2565    #[inline]
2566    pub fn walk_formal_parameter<'a, V: VisitMut<'a>>(
2567        visitor: &mut V,
2568        it: &mut FormalParameter<'a>,
2569    ) {
2570        let kind = AstType::FormalParameter;
2571        visitor.enter_node(kind);
2572        visitor.visit_span(&mut it.span);
2573        visitor.visit_decorators(&mut it.decorators);
2574        visitor.visit_binding_pattern(&mut it.pattern);
2575        visitor.leave_node(kind);
2576    }
2577
2578    #[inline]
2579    pub fn walk_function_body<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut FunctionBody<'a>) {
2580        let kind = AstType::FunctionBody;
2581        visitor.enter_node(kind);
2582        visitor.visit_span(&mut it.span);
2583        visitor.visit_directives(&mut it.directives);
2584        visitor.visit_statements(&mut it.statements);
2585        visitor.leave_node(kind);
2586    }
2587
2588    #[inline]
2589    pub fn walk_arrow_function_expression<'a, V: VisitMut<'a>>(
2590        visitor: &mut V,
2591        it: &mut ArrowFunctionExpression<'a>,
2592    ) {
2593        let kind = AstType::ArrowFunctionExpression;
2594        visitor.enter_node(kind);
2595        visitor.enter_scope(
2596            {
2597                let mut flags = ScopeFlags::Function | ScopeFlags::Arrow;
2598                if it.has_use_strict_directive() {
2599                    flags |= ScopeFlags::StrictMode;
2600                }
2601                flags
2602            },
2603            &it.scope_id,
2604        );
2605        visitor.visit_span(&mut it.span);
2606        if let Some(type_parameters) = &mut it.type_parameters {
2607            visitor.visit_ts_type_parameter_declaration(type_parameters);
2608        }
2609        visitor.visit_formal_parameters(&mut it.params);
2610        if let Some(return_type) = &mut it.return_type {
2611            visitor.visit_ts_type_annotation(return_type);
2612        }
2613        visitor.visit_function_body(&mut it.body);
2614        visitor.leave_scope();
2615        visitor.leave_node(kind);
2616    }
2617
2618    #[inline]
2619    pub fn walk_yield_expression<'a, V: VisitMut<'a>>(
2620        visitor: &mut V,
2621        it: &mut YieldExpression<'a>,
2622    ) {
2623        let kind = AstType::YieldExpression;
2624        visitor.enter_node(kind);
2625        visitor.visit_span(&mut it.span);
2626        if let Some(argument) = &mut it.argument {
2627            visitor.visit_expression(argument);
2628        }
2629        visitor.leave_node(kind);
2630    }
2631
2632    pub fn walk_class<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Class<'a>) {
2633        let kind = AstType::Class;
2634        visitor.enter_node(kind);
2635        visitor.visit_span(&mut it.span);
2636        visitor.visit_decorators(&mut it.decorators);
2637        if let Some(id) = &mut it.id {
2638            visitor.visit_binding_identifier(id);
2639        }
2640        visitor.enter_scope(ScopeFlags::StrictMode, &it.scope_id);
2641        if let Some(type_parameters) = &mut it.type_parameters {
2642            visitor.visit_ts_type_parameter_declaration(type_parameters);
2643        }
2644        if let Some(super_class) = &mut it.super_class {
2645            visitor.visit_expression(super_class);
2646        }
2647        if let Some(super_type_arguments) = &mut it.super_type_arguments {
2648            visitor.visit_ts_type_parameter_instantiation(super_type_arguments);
2649        }
2650        visitor.visit_ts_class_implements_list(&mut it.implements);
2651        visitor.visit_class_body(&mut it.body);
2652        visitor.leave_scope();
2653        visitor.leave_node(kind);
2654    }
2655
2656    #[inline]
2657    pub fn walk_class_body<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ClassBody<'a>) {
2658        let kind = AstType::ClassBody;
2659        visitor.enter_node(kind);
2660        visitor.visit_span(&mut it.span);
2661        visitor.visit_class_elements(&mut it.body);
2662        visitor.leave_node(kind);
2663    }
2664
2665    #[inline]
2666    pub fn walk_class_element<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut ClassElement<'a>) {
2667        // No `AstType` for this type
2668        match it {
2669            ClassElement::StaticBlock(it) => visitor.visit_static_block(it),
2670            ClassElement::MethodDefinition(it) => visitor.visit_method_definition(it),
2671            ClassElement::PropertyDefinition(it) => visitor.visit_property_definition(it),
2672            ClassElement::AccessorProperty(it) => visitor.visit_accessor_property(it),
2673            ClassElement::TSIndexSignature(it) => visitor.visit_ts_index_signature(it),
2674        }
2675    }
2676
2677    #[inline]
2678    pub fn walk_method_definition<'a, V: VisitMut<'a>>(
2679        visitor: &mut V,
2680        it: &mut MethodDefinition<'a>,
2681    ) {
2682        let kind = AstType::MethodDefinition;
2683        visitor.enter_node(kind);
2684        visitor.visit_span(&mut it.span);
2685        visitor.visit_decorators(&mut it.decorators);
2686        visitor.visit_property_key(&mut it.key);
2687        {
2688            let flags = match it.kind {
2689                MethodDefinitionKind::Get => ScopeFlags::Function | ScopeFlags::GetAccessor,
2690                MethodDefinitionKind::Set => ScopeFlags::Function | ScopeFlags::SetAccessor,
2691                MethodDefinitionKind::Constructor => ScopeFlags::Function | ScopeFlags::Constructor,
2692                MethodDefinitionKind::Method => ScopeFlags::Function,
2693            };
2694            visitor.visit_function(&mut it.value, flags);
2695        }
2696        visitor.leave_node(kind);
2697    }
2698
2699    #[inline]
2700    pub fn walk_property_definition<'a, V: VisitMut<'a>>(
2701        visitor: &mut V,
2702        it: &mut PropertyDefinition<'a>,
2703    ) {
2704        let kind = AstType::PropertyDefinition;
2705        visitor.enter_node(kind);
2706        visitor.visit_span(&mut it.span);
2707        visitor.visit_decorators(&mut it.decorators);
2708        visitor.visit_property_key(&mut it.key);
2709        if let Some(type_annotation) = &mut it.type_annotation {
2710            visitor.visit_ts_type_annotation(type_annotation);
2711        }
2712        if let Some(value) = &mut it.value {
2713            visitor.visit_expression(value);
2714        }
2715        visitor.leave_node(kind);
2716    }
2717
2718    #[inline]
2719    pub fn walk_private_identifier<'a, V: VisitMut<'a>>(
2720        visitor: &mut V,
2721        it: &mut PrivateIdentifier<'a>,
2722    ) {
2723        let kind = AstType::PrivateIdentifier;
2724        visitor.enter_node(kind);
2725        visitor.visit_span(&mut it.span);
2726        visitor.leave_node(kind);
2727    }
2728
2729    #[inline]
2730    pub fn walk_static_block<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut StaticBlock<'a>) {
2731        let kind = AstType::StaticBlock;
2732        visitor.enter_node(kind);
2733        visitor.enter_scope(ScopeFlags::ClassStaticBlock, &it.scope_id);
2734        visitor.visit_span(&mut it.span);
2735        visitor.visit_statements(&mut it.body);
2736        visitor.leave_scope();
2737        visitor.leave_node(kind);
2738    }
2739
2740    pub fn walk_module_declaration<'a, V: VisitMut<'a>>(
2741        visitor: &mut V,
2742        it: &mut ModuleDeclaration<'a>,
2743    ) {
2744        // No `AstType` for this type
2745        match it {
2746            ModuleDeclaration::ImportDeclaration(it) => visitor.visit_import_declaration(it),
2747            ModuleDeclaration::ExportAllDeclaration(it) => visitor.visit_export_all_declaration(it),
2748            ModuleDeclaration::ExportDefaultDeclaration(it) => {
2749                visitor.visit_export_default_declaration(it)
2750            }
2751            ModuleDeclaration::ExportNamedDeclaration(it) => {
2752                visitor.visit_export_named_declaration(it)
2753            }
2754            ModuleDeclaration::TSExportAssignment(it) => visitor.visit_ts_export_assignment(it),
2755            ModuleDeclaration::TSNamespaceExportDeclaration(it) => {
2756                visitor.visit_ts_namespace_export_declaration(it)
2757            }
2758        }
2759    }
2760
2761    #[inline]
2762    pub fn walk_accessor_property<'a, V: VisitMut<'a>>(
2763        visitor: &mut V,
2764        it: &mut AccessorProperty<'a>,
2765    ) {
2766        let kind = AstType::AccessorProperty;
2767        visitor.enter_node(kind);
2768        visitor.visit_span(&mut it.span);
2769        visitor.visit_decorators(&mut it.decorators);
2770        visitor.visit_property_key(&mut it.key);
2771        if let Some(type_annotation) = &mut it.type_annotation {
2772            visitor.visit_ts_type_annotation(type_annotation);
2773        }
2774        if let Some(value) = &mut it.value {
2775            visitor.visit_expression(value);
2776        }
2777        visitor.leave_node(kind);
2778    }
2779
2780    #[inline]
2781    pub fn walk_import_expression<'a, V: VisitMut<'a>>(
2782        visitor: &mut V,
2783        it: &mut ImportExpression<'a>,
2784    ) {
2785        let kind = AstType::ImportExpression;
2786        visitor.enter_node(kind);
2787        visitor.visit_span(&mut it.span);
2788        visitor.visit_expression(&mut it.source);
2789        if let Some(options) = &mut it.options {
2790            visitor.visit_expression(options);
2791        }
2792        visitor.leave_node(kind);
2793    }
2794
2795    #[inline]
2796    pub fn walk_import_declaration<'a, V: VisitMut<'a>>(
2797        visitor: &mut V,
2798        it: &mut ImportDeclaration<'a>,
2799    ) {
2800        let kind = AstType::ImportDeclaration;
2801        visitor.enter_node(kind);
2802        visitor.visit_span(&mut it.span);
2803        if let Some(specifiers) = &mut it.specifiers {
2804            visitor.visit_import_declaration_specifiers(specifiers);
2805        }
2806        visitor.visit_string_literal(&mut it.source);
2807        if let Some(with_clause) = &mut it.with_clause {
2808            visitor.visit_with_clause(with_clause);
2809        }
2810        visitor.leave_node(kind);
2811    }
2812
2813    #[inline]
2814    pub fn walk_import_declaration_specifier<'a, V: VisitMut<'a>>(
2815        visitor: &mut V,
2816        it: &mut ImportDeclarationSpecifier<'a>,
2817    ) {
2818        // No `AstType` for this type
2819        match it {
2820            ImportDeclarationSpecifier::ImportSpecifier(it) => visitor.visit_import_specifier(it),
2821            ImportDeclarationSpecifier::ImportDefaultSpecifier(it) => {
2822                visitor.visit_import_default_specifier(it)
2823            }
2824            ImportDeclarationSpecifier::ImportNamespaceSpecifier(it) => {
2825                visitor.visit_import_namespace_specifier(it)
2826            }
2827        }
2828    }
2829
2830    #[inline]
2831    pub fn walk_import_specifier<'a, V: VisitMut<'a>>(
2832        visitor: &mut V,
2833        it: &mut ImportSpecifier<'a>,
2834    ) {
2835        let kind = AstType::ImportSpecifier;
2836        visitor.enter_node(kind);
2837        visitor.visit_span(&mut it.span);
2838        visitor.visit_module_export_name(&mut it.imported);
2839        visitor.visit_binding_identifier(&mut it.local);
2840        visitor.leave_node(kind);
2841    }
2842
2843    #[inline]
2844    pub fn walk_import_default_specifier<'a, V: VisitMut<'a>>(
2845        visitor: &mut V,
2846        it: &mut ImportDefaultSpecifier<'a>,
2847    ) {
2848        let kind = AstType::ImportDefaultSpecifier;
2849        visitor.enter_node(kind);
2850        visitor.visit_span(&mut it.span);
2851        visitor.visit_binding_identifier(&mut it.local);
2852        visitor.leave_node(kind);
2853    }
2854
2855    #[inline]
2856    pub fn walk_import_namespace_specifier<'a, V: VisitMut<'a>>(
2857        visitor: &mut V,
2858        it: &mut ImportNamespaceSpecifier<'a>,
2859    ) {
2860        let kind = AstType::ImportNamespaceSpecifier;
2861        visitor.enter_node(kind);
2862        visitor.visit_span(&mut it.span);
2863        visitor.visit_binding_identifier(&mut it.local);
2864        visitor.leave_node(kind);
2865    }
2866
2867    #[inline]
2868    pub fn walk_with_clause<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut WithClause<'a>) {
2869        let kind = AstType::WithClause;
2870        visitor.enter_node(kind);
2871        visitor.visit_span(&mut it.span);
2872        visitor.visit_import_attributes(&mut it.with_entries);
2873        visitor.leave_node(kind);
2874    }
2875
2876    #[inline]
2877    pub fn walk_import_attribute<'a, V: VisitMut<'a>>(
2878        visitor: &mut V,
2879        it: &mut ImportAttribute<'a>,
2880    ) {
2881        let kind = AstType::ImportAttribute;
2882        visitor.enter_node(kind);
2883        visitor.visit_span(&mut it.span);
2884        visitor.visit_import_attribute_key(&mut it.key);
2885        visitor.visit_string_literal(&mut it.value);
2886        visitor.leave_node(kind);
2887    }
2888
2889    #[inline]
2890    pub fn walk_import_attribute_key<'a, V: VisitMut<'a>>(
2891        visitor: &mut V,
2892        it: &mut ImportAttributeKey<'a>,
2893    ) {
2894        // No `AstType` for this type
2895        match it {
2896            ImportAttributeKey::Identifier(it) => visitor.visit_identifier_name(it),
2897            ImportAttributeKey::StringLiteral(it) => visitor.visit_string_literal(it),
2898        }
2899    }
2900
2901    #[inline]
2902    pub fn walk_export_named_declaration<'a, V: VisitMut<'a>>(
2903        visitor: &mut V,
2904        it: &mut ExportNamedDeclaration<'a>,
2905    ) {
2906        let kind = AstType::ExportNamedDeclaration;
2907        visitor.enter_node(kind);
2908        visitor.visit_span(&mut it.span);
2909        if let Some(declaration) = &mut it.declaration {
2910            visitor.visit_declaration(declaration);
2911        }
2912        visitor.visit_export_specifiers(&mut it.specifiers);
2913        if let Some(source) = &mut it.source {
2914            visitor.visit_string_literal(source);
2915        }
2916        if let Some(with_clause) = &mut it.with_clause {
2917            visitor.visit_with_clause(with_clause);
2918        }
2919        visitor.leave_node(kind);
2920    }
2921
2922    #[inline]
2923    pub fn walk_export_default_declaration<'a, V: VisitMut<'a>>(
2924        visitor: &mut V,
2925        it: &mut ExportDefaultDeclaration<'a>,
2926    ) {
2927        let kind = AstType::ExportDefaultDeclaration;
2928        visitor.enter_node(kind);
2929        visitor.visit_span(&mut it.span);
2930        visitor.visit_export_default_declaration_kind(&mut it.declaration);
2931        visitor.leave_node(kind);
2932    }
2933
2934    #[inline]
2935    pub fn walk_export_all_declaration<'a, V: VisitMut<'a>>(
2936        visitor: &mut V,
2937        it: &mut ExportAllDeclaration<'a>,
2938    ) {
2939        let kind = AstType::ExportAllDeclaration;
2940        visitor.enter_node(kind);
2941        visitor.visit_span(&mut it.span);
2942        if let Some(exported) = &mut it.exported {
2943            visitor.visit_module_export_name(exported);
2944        }
2945        visitor.visit_string_literal(&mut it.source);
2946        if let Some(with_clause) = &mut it.with_clause {
2947            visitor.visit_with_clause(with_clause);
2948        }
2949        visitor.leave_node(kind);
2950    }
2951
2952    #[inline]
2953    pub fn walk_export_specifier<'a, V: VisitMut<'a>>(
2954        visitor: &mut V,
2955        it: &mut ExportSpecifier<'a>,
2956    ) {
2957        let kind = AstType::ExportSpecifier;
2958        visitor.enter_node(kind);
2959        visitor.visit_span(&mut it.span);
2960        visitor.visit_module_export_name(&mut it.local);
2961        visitor.visit_module_export_name(&mut it.exported);
2962        visitor.leave_node(kind);
2963    }
2964
2965    #[inline]
2966    pub fn walk_export_default_declaration_kind<'a, V: VisitMut<'a>>(
2967        visitor: &mut V,
2968        it: &mut ExportDefaultDeclarationKind<'a>,
2969    ) {
2970        // No `AstType` for this type
2971        match it {
2972            ExportDefaultDeclarationKind::FunctionDeclaration(it) => {
2973                let flags = ScopeFlags::Function;
2974                visitor.visit_function(it, flags)
2975            }
2976            ExportDefaultDeclarationKind::ClassDeclaration(it) => visitor.visit_class(it),
2977            ExportDefaultDeclarationKind::TSInterfaceDeclaration(it) => {
2978                visitor.visit_ts_interface_declaration(it)
2979            }
2980            match_expression!(ExportDefaultDeclarationKind) => {
2981                visitor.visit_expression(it.to_expression_mut())
2982            }
2983        }
2984    }
2985
2986    #[inline]
2987    pub fn walk_module_export_name<'a, V: VisitMut<'a>>(
2988        visitor: &mut V,
2989        it: &mut ModuleExportName<'a>,
2990    ) {
2991        // No `AstType` for this type
2992        match it {
2993            ModuleExportName::IdentifierName(it) => visitor.visit_identifier_name(it),
2994            ModuleExportName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
2995            ModuleExportName::StringLiteral(it) => visitor.visit_string_literal(it),
2996        }
2997    }
2998
2999    #[inline]
3000    pub fn walk_v_8_intrinsic_expression<'a, V: VisitMut<'a>>(
3001        visitor: &mut V,
3002        it: &mut V8IntrinsicExpression<'a>,
3003    ) {
3004        let kind = AstType::V8IntrinsicExpression;
3005        visitor.enter_node(kind);
3006        visitor.visit_span(&mut it.span);
3007        visitor.visit_identifier_name(&mut it.name);
3008        visitor.visit_arguments(&mut it.arguments);
3009        visitor.leave_node(kind);
3010    }
3011
3012    #[inline]
3013    pub fn walk_boolean_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut BooleanLiteral) {
3014        let kind = AstType::BooleanLiteral;
3015        visitor.enter_node(kind);
3016        visitor.visit_span(&mut it.span);
3017        visitor.leave_node(kind);
3018    }
3019
3020    #[inline]
3021    pub fn walk_null_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut NullLiteral) {
3022        let kind = AstType::NullLiteral;
3023        visitor.enter_node(kind);
3024        visitor.visit_span(&mut it.span);
3025        visitor.leave_node(kind);
3026    }
3027
3028    #[inline]
3029    pub fn walk_numeric_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut NumericLiteral<'a>) {
3030        let kind = AstType::NumericLiteral;
3031        visitor.enter_node(kind);
3032        visitor.visit_span(&mut it.span);
3033        visitor.leave_node(kind);
3034    }
3035
3036    #[inline]
3037    pub fn walk_string_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut StringLiteral<'a>) {
3038        let kind = AstType::StringLiteral;
3039        visitor.enter_node(kind);
3040        visitor.visit_span(&mut it.span);
3041        visitor.leave_node(kind);
3042    }
3043
3044    #[inline]
3045    pub fn walk_big_int_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut BigIntLiteral<'a>) {
3046        let kind = AstType::BigIntLiteral;
3047        visitor.enter_node(kind);
3048        visitor.visit_span(&mut it.span);
3049        visitor.leave_node(kind);
3050    }
3051
3052    #[inline]
3053    pub fn walk_reg_exp_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut RegExpLiteral<'a>) {
3054        let kind = AstType::RegExpLiteral;
3055        visitor.enter_node(kind);
3056        visitor.visit_span(&mut it.span);
3057        visitor.leave_node(kind);
3058    }
3059
3060    #[inline]
3061    pub fn walk_jsx_element<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXElement<'a>) {
3062        let kind = AstType::JSXElement;
3063        visitor.enter_node(kind);
3064        visitor.visit_span(&mut it.span);
3065        visitor.visit_jsx_opening_element(&mut it.opening_element);
3066        visitor.visit_jsx_children(&mut it.children);
3067        if let Some(closing_element) = &mut it.closing_element {
3068            visitor.visit_jsx_closing_element(closing_element);
3069        }
3070        visitor.leave_node(kind);
3071    }
3072
3073    #[inline]
3074    pub fn walk_jsx_opening_element<'a, V: VisitMut<'a>>(
3075        visitor: &mut V,
3076        it: &mut JSXOpeningElement<'a>,
3077    ) {
3078        let kind = AstType::JSXOpeningElement;
3079        visitor.enter_node(kind);
3080        visitor.visit_span(&mut it.span);
3081        visitor.visit_jsx_element_name(&mut it.name);
3082        if let Some(type_arguments) = &mut it.type_arguments {
3083            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3084        }
3085        visitor.visit_jsx_attribute_items(&mut it.attributes);
3086        visitor.leave_node(kind);
3087    }
3088
3089    #[inline]
3090    pub fn walk_jsx_closing_element<'a, V: VisitMut<'a>>(
3091        visitor: &mut V,
3092        it: &mut JSXClosingElement<'a>,
3093    ) {
3094        let kind = AstType::JSXClosingElement;
3095        visitor.enter_node(kind);
3096        visitor.visit_span(&mut it.span);
3097        visitor.visit_jsx_element_name(&mut it.name);
3098        visitor.leave_node(kind);
3099    }
3100
3101    #[inline]
3102    pub fn walk_jsx_fragment<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXFragment<'a>) {
3103        let kind = AstType::JSXFragment;
3104        visitor.enter_node(kind);
3105        visitor.visit_span(&mut it.span);
3106        visitor.visit_jsx_opening_fragment(&mut it.opening_fragment);
3107        visitor.visit_jsx_children(&mut it.children);
3108        visitor.visit_jsx_closing_fragment(&mut it.closing_fragment);
3109        visitor.leave_node(kind);
3110    }
3111
3112    #[inline]
3113    pub fn walk_jsx_opening_fragment<'a, V: VisitMut<'a>>(
3114        visitor: &mut V,
3115        it: &mut JSXOpeningFragment,
3116    ) {
3117        let kind = AstType::JSXOpeningFragment;
3118        visitor.enter_node(kind);
3119        visitor.visit_span(&mut it.span);
3120        visitor.leave_node(kind);
3121    }
3122
3123    #[inline]
3124    pub fn walk_jsx_closing_fragment<'a, V: VisitMut<'a>>(
3125        visitor: &mut V,
3126        it: &mut JSXClosingFragment,
3127    ) {
3128        let kind = AstType::JSXClosingFragment;
3129        visitor.enter_node(kind);
3130        visitor.visit_span(&mut it.span);
3131        visitor.leave_node(kind);
3132    }
3133
3134    #[inline]
3135    pub fn walk_jsx_element_name<'a, V: VisitMut<'a>>(
3136        visitor: &mut V,
3137        it: &mut JSXElementName<'a>,
3138    ) {
3139        // No `AstType` for this type
3140        match it {
3141            JSXElementName::Identifier(it) => visitor.visit_jsx_identifier(it),
3142            JSXElementName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
3143            JSXElementName::NamespacedName(it) => visitor.visit_jsx_namespaced_name(it),
3144            JSXElementName::MemberExpression(it) => visitor.visit_jsx_member_expression(it),
3145            JSXElementName::ThisExpression(it) => visitor.visit_this_expression(it),
3146        }
3147    }
3148
3149    #[inline]
3150    pub fn walk_jsx_namespaced_name<'a, V: VisitMut<'a>>(
3151        visitor: &mut V,
3152        it: &mut JSXNamespacedName<'a>,
3153    ) {
3154        let kind = AstType::JSXNamespacedName;
3155        visitor.enter_node(kind);
3156        visitor.visit_span(&mut it.span);
3157        visitor.visit_jsx_identifier(&mut it.namespace);
3158        visitor.visit_jsx_identifier(&mut it.name);
3159        visitor.leave_node(kind);
3160    }
3161
3162    #[inline]
3163    pub fn walk_jsx_member_expression<'a, V: VisitMut<'a>>(
3164        visitor: &mut V,
3165        it: &mut JSXMemberExpression<'a>,
3166    ) {
3167        let kind = AstType::JSXMemberExpression;
3168        visitor.enter_node(kind);
3169        visitor.visit_span(&mut it.span);
3170        visitor.visit_jsx_member_expression_object(&mut it.object);
3171        visitor.visit_jsx_identifier(&mut it.property);
3172        visitor.leave_node(kind);
3173    }
3174
3175    #[inline]
3176    pub fn walk_jsx_member_expression_object<'a, V: VisitMut<'a>>(
3177        visitor: &mut V,
3178        it: &mut JSXMemberExpressionObject<'a>,
3179    ) {
3180        // No `AstType` for this type
3181        match it {
3182            JSXMemberExpressionObject::IdentifierReference(it) => {
3183                visitor.visit_identifier_reference(it)
3184            }
3185            JSXMemberExpressionObject::MemberExpression(it) => {
3186                visitor.visit_jsx_member_expression(it)
3187            }
3188            JSXMemberExpressionObject::ThisExpression(it) => visitor.visit_this_expression(it),
3189        }
3190    }
3191
3192    #[inline]
3193    pub fn walk_jsx_expression_container<'a, V: VisitMut<'a>>(
3194        visitor: &mut V,
3195        it: &mut JSXExpressionContainer<'a>,
3196    ) {
3197        let kind = AstType::JSXExpressionContainer;
3198        visitor.enter_node(kind);
3199        visitor.visit_span(&mut it.span);
3200        visitor.visit_jsx_expression(&mut it.expression);
3201        visitor.leave_node(kind);
3202    }
3203
3204    #[inline]
3205    pub fn walk_jsx_expression<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXExpression<'a>) {
3206        // No `AstType` for this type
3207        match it {
3208            JSXExpression::EmptyExpression(it) => visitor.visit_jsx_empty_expression(it),
3209            match_expression!(JSXExpression) => visitor.visit_expression(it.to_expression_mut()),
3210        }
3211    }
3212
3213    #[inline]
3214    pub fn walk_jsx_empty_expression<'a, V: VisitMut<'a>>(
3215        visitor: &mut V,
3216        it: &mut JSXEmptyExpression,
3217    ) {
3218        let kind = AstType::JSXEmptyExpression;
3219        visitor.enter_node(kind);
3220        visitor.visit_span(&mut it.span);
3221        visitor.leave_node(kind);
3222    }
3223
3224    #[inline]
3225    pub fn walk_jsx_attribute_item<'a, V: VisitMut<'a>>(
3226        visitor: &mut V,
3227        it: &mut JSXAttributeItem<'a>,
3228    ) {
3229        // No `AstType` for this type
3230        match it {
3231            JSXAttributeItem::Attribute(it) => visitor.visit_jsx_attribute(it),
3232            JSXAttributeItem::SpreadAttribute(it) => visitor.visit_jsx_spread_attribute(it),
3233        }
3234    }
3235
3236    #[inline]
3237    pub fn walk_jsx_attribute<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXAttribute<'a>) {
3238        let kind = AstType::JSXAttribute;
3239        visitor.enter_node(kind);
3240        visitor.visit_span(&mut it.span);
3241        visitor.visit_jsx_attribute_name(&mut it.name);
3242        if let Some(value) = &mut it.value {
3243            visitor.visit_jsx_attribute_value(value);
3244        }
3245        visitor.leave_node(kind);
3246    }
3247
3248    #[inline]
3249    pub fn walk_jsx_spread_attribute<'a, V: VisitMut<'a>>(
3250        visitor: &mut V,
3251        it: &mut JSXSpreadAttribute<'a>,
3252    ) {
3253        let kind = AstType::JSXSpreadAttribute;
3254        visitor.enter_node(kind);
3255        visitor.visit_span(&mut it.span);
3256        visitor.visit_expression(&mut it.argument);
3257        visitor.leave_node(kind);
3258    }
3259
3260    #[inline]
3261    pub fn walk_jsx_attribute_name<'a, V: VisitMut<'a>>(
3262        visitor: &mut V,
3263        it: &mut JSXAttributeName<'a>,
3264    ) {
3265        // No `AstType` for this type
3266        match it {
3267            JSXAttributeName::Identifier(it) => visitor.visit_jsx_identifier(it),
3268            JSXAttributeName::NamespacedName(it) => visitor.visit_jsx_namespaced_name(it),
3269        }
3270    }
3271
3272    #[inline]
3273    pub fn walk_jsx_attribute_value<'a, V: VisitMut<'a>>(
3274        visitor: &mut V,
3275        it: &mut JSXAttributeValue<'a>,
3276    ) {
3277        // No `AstType` for this type
3278        match it {
3279            JSXAttributeValue::StringLiteral(it) => visitor.visit_string_literal(it),
3280            JSXAttributeValue::ExpressionContainer(it) => {
3281                visitor.visit_jsx_expression_container(it)
3282            }
3283            JSXAttributeValue::Element(it) => visitor.visit_jsx_element(it),
3284            JSXAttributeValue::Fragment(it) => visitor.visit_jsx_fragment(it),
3285        }
3286    }
3287
3288    #[inline]
3289    pub fn walk_jsx_identifier<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXIdentifier<'a>) {
3290        let kind = AstType::JSXIdentifier;
3291        visitor.enter_node(kind);
3292        visitor.visit_span(&mut it.span);
3293        visitor.leave_node(kind);
3294    }
3295
3296    #[inline]
3297    pub fn walk_jsx_child<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXChild<'a>) {
3298        // No `AstType` for this type
3299        match it {
3300            JSXChild::Text(it) => visitor.visit_jsx_text(it),
3301            JSXChild::Element(it) => visitor.visit_jsx_element(it),
3302            JSXChild::Fragment(it) => visitor.visit_jsx_fragment(it),
3303            JSXChild::ExpressionContainer(it) => visitor.visit_jsx_expression_container(it),
3304            JSXChild::Spread(it) => visitor.visit_jsx_spread_child(it),
3305        }
3306    }
3307
3308    #[inline]
3309    pub fn walk_jsx_spread_child<'a, V: VisitMut<'a>>(
3310        visitor: &mut V,
3311        it: &mut JSXSpreadChild<'a>,
3312    ) {
3313        let kind = AstType::JSXSpreadChild;
3314        visitor.enter_node(kind);
3315        visitor.visit_span(&mut it.span);
3316        visitor.visit_expression(&mut it.expression);
3317        visitor.leave_node(kind);
3318    }
3319
3320    #[inline]
3321    pub fn walk_jsx_text<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut JSXText<'a>) {
3322        let kind = AstType::JSXText;
3323        visitor.enter_node(kind);
3324        visitor.visit_span(&mut it.span);
3325        visitor.leave_node(kind);
3326    }
3327
3328    #[inline]
3329    pub fn walk_ts_this_parameter<'a, V: VisitMut<'a>>(
3330        visitor: &mut V,
3331        it: &mut TSThisParameter<'a>,
3332    ) {
3333        let kind = AstType::TSThisParameter;
3334        visitor.enter_node(kind);
3335        visitor.visit_span(&mut it.span);
3336        visitor.visit_span(&mut it.this_span);
3337        if let Some(type_annotation) = &mut it.type_annotation {
3338            visitor.visit_ts_type_annotation(type_annotation);
3339        }
3340        visitor.leave_node(kind);
3341    }
3342
3343    #[inline]
3344    pub fn walk_ts_enum_declaration<'a, V: VisitMut<'a>>(
3345        visitor: &mut V,
3346        it: &mut TSEnumDeclaration<'a>,
3347    ) {
3348        let kind = AstType::TSEnumDeclaration;
3349        visitor.enter_node(kind);
3350        visitor.visit_span(&mut it.span);
3351        visitor.visit_binding_identifier(&mut it.id);
3352        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3353        visitor.visit_ts_enum_body(&mut it.body);
3354        visitor.leave_scope();
3355        visitor.leave_node(kind);
3356    }
3357
3358    #[inline]
3359    pub fn walk_ts_enum_body<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSEnumBody<'a>) {
3360        let kind = AstType::TSEnumBody;
3361        visitor.enter_node(kind);
3362        visitor.visit_span(&mut it.span);
3363        visitor.visit_ts_enum_members(&mut it.members);
3364        visitor.leave_node(kind);
3365    }
3366
3367    #[inline]
3368    pub fn walk_ts_enum_member<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSEnumMember<'a>) {
3369        let kind = AstType::TSEnumMember;
3370        visitor.enter_node(kind);
3371        visitor.visit_span(&mut it.span);
3372        visitor.visit_ts_enum_member_name(&mut it.id);
3373        if let Some(initializer) = &mut it.initializer {
3374            visitor.visit_expression(initializer);
3375        }
3376        visitor.leave_node(kind);
3377    }
3378
3379    #[inline]
3380    pub fn walk_ts_enum_member_name<'a, V: VisitMut<'a>>(
3381        visitor: &mut V,
3382        it: &mut TSEnumMemberName<'a>,
3383    ) {
3384        // No `AstType` for this type
3385        match it {
3386            TSEnumMemberName::Identifier(it) => visitor.visit_identifier_name(it),
3387            TSEnumMemberName::String(it) => visitor.visit_string_literal(it),
3388            TSEnumMemberName::ComputedString(it) => visitor.visit_string_literal(it),
3389            TSEnumMemberName::ComputedTemplateString(it) => visitor.visit_template_literal(it),
3390        }
3391    }
3392
3393    #[inline]
3394    pub fn walk_ts_type_annotation<'a, V: VisitMut<'a>>(
3395        visitor: &mut V,
3396        it: &mut TSTypeAnnotation<'a>,
3397    ) {
3398        let kind = AstType::TSTypeAnnotation;
3399        visitor.enter_node(kind);
3400        visitor.visit_span(&mut it.span);
3401        visitor.visit_ts_type(&mut it.type_annotation);
3402        visitor.leave_node(kind);
3403    }
3404
3405    #[inline]
3406    pub fn walk_ts_literal_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSLiteralType<'a>) {
3407        let kind = AstType::TSLiteralType;
3408        visitor.enter_node(kind);
3409        visitor.visit_span(&mut it.span);
3410        visitor.visit_ts_literal(&mut it.literal);
3411        visitor.leave_node(kind);
3412    }
3413
3414    pub fn walk_ts_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSLiteral<'a>) {
3415        // No `AstType` for this type
3416        match it {
3417            TSLiteral::BooleanLiteral(it) => visitor.visit_boolean_literal(it),
3418            TSLiteral::NumericLiteral(it) => visitor.visit_numeric_literal(it),
3419            TSLiteral::BigIntLiteral(it) => visitor.visit_big_int_literal(it),
3420            TSLiteral::StringLiteral(it) => visitor.visit_string_literal(it),
3421            TSLiteral::TemplateLiteral(it) => visitor.visit_template_literal(it),
3422            TSLiteral::UnaryExpression(it) => visitor.visit_unary_expression(it),
3423        }
3424    }
3425
3426    pub fn walk_ts_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSType<'a>) {
3427        // No `AstType` for this type
3428        match it {
3429            TSType::TSAnyKeyword(it) => visitor.visit_ts_any_keyword(it),
3430            TSType::TSBigIntKeyword(it) => visitor.visit_ts_big_int_keyword(it),
3431            TSType::TSBooleanKeyword(it) => visitor.visit_ts_boolean_keyword(it),
3432            TSType::TSIntrinsicKeyword(it) => visitor.visit_ts_intrinsic_keyword(it),
3433            TSType::TSNeverKeyword(it) => visitor.visit_ts_never_keyword(it),
3434            TSType::TSNullKeyword(it) => visitor.visit_ts_null_keyword(it),
3435            TSType::TSNumberKeyword(it) => visitor.visit_ts_number_keyword(it),
3436            TSType::TSObjectKeyword(it) => visitor.visit_ts_object_keyword(it),
3437            TSType::TSStringKeyword(it) => visitor.visit_ts_string_keyword(it),
3438            TSType::TSSymbolKeyword(it) => visitor.visit_ts_symbol_keyword(it),
3439            TSType::TSUndefinedKeyword(it) => visitor.visit_ts_undefined_keyword(it),
3440            TSType::TSUnknownKeyword(it) => visitor.visit_ts_unknown_keyword(it),
3441            TSType::TSVoidKeyword(it) => visitor.visit_ts_void_keyword(it),
3442            TSType::TSArrayType(it) => visitor.visit_ts_array_type(it),
3443            TSType::TSConditionalType(it) => visitor.visit_ts_conditional_type(it),
3444            TSType::TSConstructorType(it) => visitor.visit_ts_constructor_type(it),
3445            TSType::TSFunctionType(it) => visitor.visit_ts_function_type(it),
3446            TSType::TSImportType(it) => visitor.visit_ts_import_type(it),
3447            TSType::TSIndexedAccessType(it) => visitor.visit_ts_indexed_access_type(it),
3448            TSType::TSInferType(it) => visitor.visit_ts_infer_type(it),
3449            TSType::TSIntersectionType(it) => visitor.visit_ts_intersection_type(it),
3450            TSType::TSLiteralType(it) => visitor.visit_ts_literal_type(it),
3451            TSType::TSMappedType(it) => visitor.visit_ts_mapped_type(it),
3452            TSType::TSNamedTupleMember(it) => visitor.visit_ts_named_tuple_member(it),
3453            TSType::TSTemplateLiteralType(it) => visitor.visit_ts_template_literal_type(it),
3454            TSType::TSThisType(it) => visitor.visit_ts_this_type(it),
3455            TSType::TSTupleType(it) => visitor.visit_ts_tuple_type(it),
3456            TSType::TSTypeLiteral(it) => visitor.visit_ts_type_literal(it),
3457            TSType::TSTypeOperatorType(it) => visitor.visit_ts_type_operator(it),
3458            TSType::TSTypePredicate(it) => visitor.visit_ts_type_predicate(it),
3459            TSType::TSTypeQuery(it) => visitor.visit_ts_type_query(it),
3460            TSType::TSTypeReference(it) => visitor.visit_ts_type_reference(it),
3461            TSType::TSUnionType(it) => visitor.visit_ts_union_type(it),
3462            TSType::TSParenthesizedType(it) => visitor.visit_ts_parenthesized_type(it),
3463            TSType::JSDocNullableType(it) => visitor.visit_js_doc_nullable_type(it),
3464            TSType::JSDocNonNullableType(it) => visitor.visit_js_doc_non_nullable_type(it),
3465            TSType::JSDocUnknownType(it) => visitor.visit_js_doc_unknown_type(it),
3466        }
3467    }
3468
3469    #[inline]
3470    pub fn walk_ts_conditional_type<'a, V: VisitMut<'a>>(
3471        visitor: &mut V,
3472        it: &mut TSConditionalType<'a>,
3473    ) {
3474        let kind = AstType::TSConditionalType;
3475        visitor.enter_node(kind);
3476        visitor.visit_span(&mut it.span);
3477        visitor.visit_ts_type(&mut it.check_type);
3478        visitor.enter_scope(ScopeFlags::TsConditional, &it.scope_id);
3479        visitor.visit_ts_type(&mut it.extends_type);
3480        visitor.visit_ts_type(&mut it.true_type);
3481        visitor.leave_scope();
3482        visitor.visit_ts_type(&mut it.false_type);
3483        visitor.leave_node(kind);
3484    }
3485
3486    #[inline]
3487    pub fn walk_ts_union_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSUnionType<'a>) {
3488        let kind = AstType::TSUnionType;
3489        visitor.enter_node(kind);
3490        visitor.visit_span(&mut it.span);
3491        visitor.visit_ts_types(&mut it.types);
3492        visitor.leave_node(kind);
3493    }
3494
3495    #[inline]
3496    pub fn walk_ts_intersection_type<'a, V: VisitMut<'a>>(
3497        visitor: &mut V,
3498        it: &mut TSIntersectionType<'a>,
3499    ) {
3500        let kind = AstType::TSIntersectionType;
3501        visitor.enter_node(kind);
3502        visitor.visit_span(&mut it.span);
3503        visitor.visit_ts_types(&mut it.types);
3504        visitor.leave_node(kind);
3505    }
3506
3507    #[inline]
3508    pub fn walk_ts_parenthesized_type<'a, V: VisitMut<'a>>(
3509        visitor: &mut V,
3510        it: &mut TSParenthesizedType<'a>,
3511    ) {
3512        let kind = AstType::TSParenthesizedType;
3513        visitor.enter_node(kind);
3514        visitor.visit_span(&mut it.span);
3515        visitor.visit_ts_type(&mut it.type_annotation);
3516        visitor.leave_node(kind);
3517    }
3518
3519    #[inline]
3520    pub fn walk_ts_type_operator<'a, V: VisitMut<'a>>(
3521        visitor: &mut V,
3522        it: &mut TSTypeOperator<'a>,
3523    ) {
3524        let kind = AstType::TSTypeOperator;
3525        visitor.enter_node(kind);
3526        visitor.visit_span(&mut it.span);
3527        visitor.visit_ts_type(&mut it.type_annotation);
3528        visitor.leave_node(kind);
3529    }
3530
3531    #[inline]
3532    pub fn walk_ts_array_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSArrayType<'a>) {
3533        let kind = AstType::TSArrayType;
3534        visitor.enter_node(kind);
3535        visitor.visit_span(&mut it.span);
3536        visitor.visit_ts_type(&mut it.element_type);
3537        visitor.leave_node(kind);
3538    }
3539
3540    #[inline]
3541    pub fn walk_ts_indexed_access_type<'a, V: VisitMut<'a>>(
3542        visitor: &mut V,
3543        it: &mut TSIndexedAccessType<'a>,
3544    ) {
3545        let kind = AstType::TSIndexedAccessType;
3546        visitor.enter_node(kind);
3547        visitor.visit_span(&mut it.span);
3548        visitor.visit_ts_type(&mut it.object_type);
3549        visitor.visit_ts_type(&mut it.index_type);
3550        visitor.leave_node(kind);
3551    }
3552
3553    #[inline]
3554    pub fn walk_ts_tuple_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSTupleType<'a>) {
3555        let kind = AstType::TSTupleType;
3556        visitor.enter_node(kind);
3557        visitor.visit_span(&mut it.span);
3558        visitor.visit_ts_tuple_elements(&mut it.element_types);
3559        visitor.leave_node(kind);
3560    }
3561
3562    #[inline]
3563    pub fn walk_ts_named_tuple_member<'a, V: VisitMut<'a>>(
3564        visitor: &mut V,
3565        it: &mut TSNamedTupleMember<'a>,
3566    ) {
3567        let kind = AstType::TSNamedTupleMember;
3568        visitor.enter_node(kind);
3569        visitor.visit_span(&mut it.span);
3570        visitor.visit_identifier_name(&mut it.label);
3571        visitor.visit_ts_tuple_element(&mut it.element_type);
3572        visitor.leave_node(kind);
3573    }
3574
3575    #[inline]
3576    pub fn walk_ts_optional_type<'a, V: VisitMut<'a>>(
3577        visitor: &mut V,
3578        it: &mut TSOptionalType<'a>,
3579    ) {
3580        let kind = AstType::TSOptionalType;
3581        visitor.enter_node(kind);
3582        visitor.visit_span(&mut it.span);
3583        visitor.visit_ts_type(&mut it.type_annotation);
3584        visitor.leave_node(kind);
3585    }
3586
3587    #[inline]
3588    pub fn walk_ts_rest_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSRestType<'a>) {
3589        let kind = AstType::TSRestType;
3590        visitor.enter_node(kind);
3591        visitor.visit_span(&mut it.span);
3592        visitor.visit_ts_type(&mut it.type_annotation);
3593        visitor.leave_node(kind);
3594    }
3595
3596    #[inline]
3597    pub fn walk_ts_tuple_element<'a, V: VisitMut<'a>>(
3598        visitor: &mut V,
3599        it: &mut TSTupleElement<'a>,
3600    ) {
3601        // No `AstType` for this type
3602        match it {
3603            TSTupleElement::TSOptionalType(it) => visitor.visit_ts_optional_type(it),
3604            TSTupleElement::TSRestType(it) => visitor.visit_ts_rest_type(it),
3605            match_ts_type!(TSTupleElement) => visitor.visit_ts_type(it.to_ts_type_mut()),
3606        }
3607    }
3608
3609    #[inline]
3610    pub fn walk_ts_any_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSAnyKeyword) {
3611        let kind = AstType::TSAnyKeyword;
3612        visitor.enter_node(kind);
3613        visitor.visit_span(&mut it.span);
3614        visitor.leave_node(kind);
3615    }
3616
3617    #[inline]
3618    pub fn walk_ts_string_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSStringKeyword) {
3619        let kind = AstType::TSStringKeyword;
3620        visitor.enter_node(kind);
3621        visitor.visit_span(&mut it.span);
3622        visitor.leave_node(kind);
3623    }
3624
3625    #[inline]
3626    pub fn walk_ts_boolean_keyword<'a, V: VisitMut<'a>>(
3627        visitor: &mut V,
3628        it: &mut TSBooleanKeyword,
3629    ) {
3630        let kind = AstType::TSBooleanKeyword;
3631        visitor.enter_node(kind);
3632        visitor.visit_span(&mut it.span);
3633        visitor.leave_node(kind);
3634    }
3635
3636    #[inline]
3637    pub fn walk_ts_number_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSNumberKeyword) {
3638        let kind = AstType::TSNumberKeyword;
3639        visitor.enter_node(kind);
3640        visitor.visit_span(&mut it.span);
3641        visitor.leave_node(kind);
3642    }
3643
3644    #[inline]
3645    pub fn walk_ts_never_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSNeverKeyword) {
3646        let kind = AstType::TSNeverKeyword;
3647        visitor.enter_node(kind);
3648        visitor.visit_span(&mut it.span);
3649        visitor.leave_node(kind);
3650    }
3651
3652    #[inline]
3653    pub fn walk_ts_intrinsic_keyword<'a, V: VisitMut<'a>>(
3654        visitor: &mut V,
3655        it: &mut TSIntrinsicKeyword,
3656    ) {
3657        let kind = AstType::TSIntrinsicKeyword;
3658        visitor.enter_node(kind);
3659        visitor.visit_span(&mut it.span);
3660        visitor.leave_node(kind);
3661    }
3662
3663    #[inline]
3664    pub fn walk_ts_unknown_keyword<'a, V: VisitMut<'a>>(
3665        visitor: &mut V,
3666        it: &mut TSUnknownKeyword,
3667    ) {
3668        let kind = AstType::TSUnknownKeyword;
3669        visitor.enter_node(kind);
3670        visitor.visit_span(&mut it.span);
3671        visitor.leave_node(kind);
3672    }
3673
3674    #[inline]
3675    pub fn walk_ts_null_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSNullKeyword) {
3676        let kind = AstType::TSNullKeyword;
3677        visitor.enter_node(kind);
3678        visitor.visit_span(&mut it.span);
3679        visitor.leave_node(kind);
3680    }
3681
3682    #[inline]
3683    pub fn walk_ts_undefined_keyword<'a, V: VisitMut<'a>>(
3684        visitor: &mut V,
3685        it: &mut TSUndefinedKeyword,
3686    ) {
3687        let kind = AstType::TSUndefinedKeyword;
3688        visitor.enter_node(kind);
3689        visitor.visit_span(&mut it.span);
3690        visitor.leave_node(kind);
3691    }
3692
3693    #[inline]
3694    pub fn walk_ts_void_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSVoidKeyword) {
3695        let kind = AstType::TSVoidKeyword;
3696        visitor.enter_node(kind);
3697        visitor.visit_span(&mut it.span);
3698        visitor.leave_node(kind);
3699    }
3700
3701    #[inline]
3702    pub fn walk_ts_symbol_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSSymbolKeyword) {
3703        let kind = AstType::TSSymbolKeyword;
3704        visitor.enter_node(kind);
3705        visitor.visit_span(&mut it.span);
3706        visitor.leave_node(kind);
3707    }
3708
3709    #[inline]
3710    pub fn walk_ts_this_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSThisType) {
3711        let kind = AstType::TSThisType;
3712        visitor.enter_node(kind);
3713        visitor.visit_span(&mut it.span);
3714        visitor.leave_node(kind);
3715    }
3716
3717    #[inline]
3718    pub fn walk_ts_object_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSObjectKeyword) {
3719        let kind = AstType::TSObjectKeyword;
3720        visitor.enter_node(kind);
3721        visitor.visit_span(&mut it.span);
3722        visitor.leave_node(kind);
3723    }
3724
3725    #[inline]
3726    pub fn walk_ts_big_int_keyword<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSBigIntKeyword) {
3727        let kind = AstType::TSBigIntKeyword;
3728        visitor.enter_node(kind);
3729        visitor.visit_span(&mut it.span);
3730        visitor.leave_node(kind);
3731    }
3732
3733    #[inline]
3734    pub fn walk_ts_type_reference<'a, V: VisitMut<'a>>(
3735        visitor: &mut V,
3736        it: &mut TSTypeReference<'a>,
3737    ) {
3738        let kind = AstType::TSTypeReference;
3739        visitor.enter_node(kind);
3740        visitor.visit_span(&mut it.span);
3741        visitor.visit_ts_type_name(&mut it.type_name);
3742        if let Some(type_arguments) = &mut it.type_arguments {
3743            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3744        }
3745        visitor.leave_node(kind);
3746    }
3747
3748    #[inline]
3749    pub fn walk_ts_type_name<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSTypeName<'a>) {
3750        // No `AstType` for this type
3751        match it {
3752            TSTypeName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
3753            TSTypeName::QualifiedName(it) => visitor.visit_ts_qualified_name(it),
3754            TSTypeName::ThisExpression(it) => visitor.visit_this_expression(it),
3755        }
3756    }
3757
3758    #[inline]
3759    pub fn walk_ts_qualified_name<'a, V: VisitMut<'a>>(
3760        visitor: &mut V,
3761        it: &mut TSQualifiedName<'a>,
3762    ) {
3763        let kind = AstType::TSQualifiedName;
3764        visitor.enter_node(kind);
3765        visitor.visit_span(&mut it.span);
3766        visitor.visit_ts_type_name(&mut it.left);
3767        visitor.visit_identifier_name(&mut it.right);
3768        visitor.leave_node(kind);
3769    }
3770
3771    #[inline]
3772    pub fn walk_ts_type_parameter_instantiation<'a, V: VisitMut<'a>>(
3773        visitor: &mut V,
3774        it: &mut TSTypeParameterInstantiation<'a>,
3775    ) {
3776        let kind = AstType::TSTypeParameterInstantiation;
3777        visitor.enter_node(kind);
3778        visitor.visit_span(&mut it.span);
3779        visitor.visit_ts_types(&mut it.params);
3780        visitor.leave_node(kind);
3781    }
3782
3783    #[inline]
3784    pub fn walk_ts_type_parameter<'a, V: VisitMut<'a>>(
3785        visitor: &mut V,
3786        it: &mut TSTypeParameter<'a>,
3787    ) {
3788        let kind = AstType::TSTypeParameter;
3789        visitor.enter_node(kind);
3790        visitor.visit_span(&mut it.span);
3791        visitor.visit_binding_identifier(&mut it.name);
3792        if let Some(constraint) = &mut it.constraint {
3793            visitor.visit_ts_type(constraint);
3794        }
3795        if let Some(default) = &mut it.default {
3796            visitor.visit_ts_type(default);
3797        }
3798        visitor.leave_node(kind);
3799    }
3800
3801    #[inline]
3802    pub fn walk_ts_type_parameter_declaration<'a, V: VisitMut<'a>>(
3803        visitor: &mut V,
3804        it: &mut TSTypeParameterDeclaration<'a>,
3805    ) {
3806        let kind = AstType::TSTypeParameterDeclaration;
3807        visitor.enter_node(kind);
3808        visitor.visit_span(&mut it.span);
3809        visitor.visit_ts_type_parameters(&mut it.params);
3810        visitor.leave_node(kind);
3811    }
3812
3813    #[inline]
3814    pub fn walk_ts_type_alias_declaration<'a, V: VisitMut<'a>>(
3815        visitor: &mut V,
3816        it: &mut TSTypeAliasDeclaration<'a>,
3817    ) {
3818        let kind = AstType::TSTypeAliasDeclaration;
3819        visitor.enter_node(kind);
3820        visitor.visit_span(&mut it.span);
3821        visitor.visit_binding_identifier(&mut it.id);
3822        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3823        if let Some(type_parameters) = &mut it.type_parameters {
3824            visitor.visit_ts_type_parameter_declaration(type_parameters);
3825        }
3826        visitor.visit_ts_type(&mut it.type_annotation);
3827        visitor.leave_scope();
3828        visitor.leave_node(kind);
3829    }
3830
3831    #[inline]
3832    pub fn walk_ts_class_implements<'a, V: VisitMut<'a>>(
3833        visitor: &mut V,
3834        it: &mut TSClassImplements<'a>,
3835    ) {
3836        let kind = AstType::TSClassImplements;
3837        visitor.enter_node(kind);
3838        visitor.visit_span(&mut it.span);
3839        visitor.visit_ts_type_name(&mut it.expression);
3840        if let Some(type_arguments) = &mut it.type_arguments {
3841            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3842        }
3843        visitor.leave_node(kind);
3844    }
3845
3846    #[inline]
3847    pub fn walk_ts_interface_declaration<'a, V: VisitMut<'a>>(
3848        visitor: &mut V,
3849        it: &mut TSInterfaceDeclaration<'a>,
3850    ) {
3851        let kind = AstType::TSInterfaceDeclaration;
3852        visitor.enter_node(kind);
3853        visitor.visit_span(&mut it.span);
3854        visitor.visit_binding_identifier(&mut it.id);
3855        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3856        if let Some(type_parameters) = &mut it.type_parameters {
3857            visitor.visit_ts_type_parameter_declaration(type_parameters);
3858        }
3859        visitor.visit_ts_interface_heritages(&mut it.extends);
3860        visitor.visit_ts_interface_body(&mut it.body);
3861        visitor.leave_scope();
3862        visitor.leave_node(kind);
3863    }
3864
3865    #[inline]
3866    pub fn walk_ts_interface_body<'a, V: VisitMut<'a>>(
3867        visitor: &mut V,
3868        it: &mut TSInterfaceBody<'a>,
3869    ) {
3870        let kind = AstType::TSInterfaceBody;
3871        visitor.enter_node(kind);
3872        visitor.visit_span(&mut it.span);
3873        visitor.visit_ts_signatures(&mut it.body);
3874        visitor.leave_node(kind);
3875    }
3876
3877    #[inline]
3878    pub fn walk_ts_property_signature<'a, V: VisitMut<'a>>(
3879        visitor: &mut V,
3880        it: &mut TSPropertySignature<'a>,
3881    ) {
3882        let kind = AstType::TSPropertySignature;
3883        visitor.enter_node(kind);
3884        visitor.visit_span(&mut it.span);
3885        visitor.visit_property_key(&mut it.key);
3886        if let Some(type_annotation) = &mut it.type_annotation {
3887            visitor.visit_ts_type_annotation(type_annotation);
3888        }
3889        visitor.leave_node(kind);
3890    }
3891
3892    #[inline]
3893    pub fn walk_ts_signature<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSSignature<'a>) {
3894        // No `AstType` for this type
3895        match it {
3896            TSSignature::TSIndexSignature(it) => visitor.visit_ts_index_signature(it),
3897            TSSignature::TSPropertySignature(it) => visitor.visit_ts_property_signature(it),
3898            TSSignature::TSCallSignatureDeclaration(it) => {
3899                visitor.visit_ts_call_signature_declaration(it)
3900            }
3901            TSSignature::TSConstructSignatureDeclaration(it) => {
3902                visitor.visit_ts_construct_signature_declaration(it)
3903            }
3904            TSSignature::TSMethodSignature(it) => visitor.visit_ts_method_signature(it),
3905        }
3906    }
3907
3908    #[inline]
3909    pub fn walk_ts_index_signature<'a, V: VisitMut<'a>>(
3910        visitor: &mut V,
3911        it: &mut TSIndexSignature<'a>,
3912    ) {
3913        let kind = AstType::TSIndexSignature;
3914        visitor.enter_node(kind);
3915        visitor.visit_span(&mut it.span);
3916        visitor.visit_ts_index_signature_names(&mut it.parameters);
3917        visitor.visit_ts_type_annotation(&mut it.type_annotation);
3918        visitor.leave_node(kind);
3919    }
3920
3921    #[inline]
3922    pub fn walk_ts_call_signature_declaration<'a, V: VisitMut<'a>>(
3923        visitor: &mut V,
3924        it: &mut TSCallSignatureDeclaration<'a>,
3925    ) {
3926        let kind = AstType::TSCallSignatureDeclaration;
3927        visitor.enter_node(kind);
3928        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3929        visitor.visit_span(&mut it.span);
3930        if let Some(type_parameters) = &mut it.type_parameters {
3931            visitor.visit_ts_type_parameter_declaration(type_parameters);
3932        }
3933        if let Some(this_param) = &mut it.this_param {
3934            visitor.visit_ts_this_parameter(this_param);
3935        }
3936        visitor.visit_formal_parameters(&mut it.params);
3937        if let Some(return_type) = &mut it.return_type {
3938            visitor.visit_ts_type_annotation(return_type);
3939        }
3940        visitor.leave_scope();
3941        visitor.leave_node(kind);
3942    }
3943
3944    pub fn walk_ts_method_signature<'a, V: VisitMut<'a>>(
3945        visitor: &mut V,
3946        it: &mut TSMethodSignature<'a>,
3947    ) {
3948        let kind = AstType::TSMethodSignature;
3949        visitor.enter_node(kind);
3950        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3951        visitor.visit_span(&mut it.span);
3952        visitor.visit_property_key(&mut it.key);
3953        if let Some(type_parameters) = &mut it.type_parameters {
3954            visitor.visit_ts_type_parameter_declaration(type_parameters);
3955        }
3956        if let Some(this_param) = &mut it.this_param {
3957            visitor.visit_ts_this_parameter(this_param);
3958        }
3959        visitor.visit_formal_parameters(&mut it.params);
3960        if let Some(return_type) = &mut it.return_type {
3961            visitor.visit_ts_type_annotation(return_type);
3962        }
3963        visitor.leave_scope();
3964        visitor.leave_node(kind);
3965    }
3966
3967    #[inline]
3968    pub fn walk_ts_construct_signature_declaration<'a, V: VisitMut<'a>>(
3969        visitor: &mut V,
3970        it: &mut TSConstructSignatureDeclaration<'a>,
3971    ) {
3972        let kind = AstType::TSConstructSignatureDeclaration;
3973        visitor.enter_node(kind);
3974        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3975        visitor.visit_span(&mut it.span);
3976        if let Some(type_parameters) = &mut it.type_parameters {
3977            visitor.visit_ts_type_parameter_declaration(type_parameters);
3978        }
3979        visitor.visit_formal_parameters(&mut it.params);
3980        if let Some(return_type) = &mut it.return_type {
3981            visitor.visit_ts_type_annotation(return_type);
3982        }
3983        visitor.leave_scope();
3984        visitor.leave_node(kind);
3985    }
3986
3987    #[inline]
3988    pub fn walk_ts_index_signature_name<'a, V: VisitMut<'a>>(
3989        visitor: &mut V,
3990        it: &mut TSIndexSignatureName<'a>,
3991    ) {
3992        let kind = AstType::TSIndexSignatureName;
3993        visitor.enter_node(kind);
3994        visitor.visit_span(&mut it.span);
3995        visitor.visit_ts_type_annotation(&mut it.type_annotation);
3996        visitor.leave_node(kind);
3997    }
3998
3999    #[inline]
4000    pub fn walk_ts_interface_heritage<'a, V: VisitMut<'a>>(
4001        visitor: &mut V,
4002        it: &mut TSInterfaceHeritage<'a>,
4003    ) {
4004        let kind = AstType::TSInterfaceHeritage;
4005        visitor.enter_node(kind);
4006        visitor.visit_span(&mut it.span);
4007        visitor.visit_expression(&mut it.expression);
4008        if let Some(type_arguments) = &mut it.type_arguments {
4009            visitor.visit_ts_type_parameter_instantiation(type_arguments);
4010        }
4011        visitor.leave_node(kind);
4012    }
4013
4014    #[inline]
4015    pub fn walk_ts_type_predicate<'a, V: VisitMut<'a>>(
4016        visitor: &mut V,
4017        it: &mut TSTypePredicate<'a>,
4018    ) {
4019        let kind = AstType::TSTypePredicate;
4020        visitor.enter_node(kind);
4021        visitor.visit_span(&mut it.span);
4022        visitor.visit_ts_type_predicate_name(&mut it.parameter_name);
4023        if let Some(type_annotation) = &mut it.type_annotation {
4024            visitor.visit_ts_type_annotation(type_annotation);
4025        }
4026        visitor.leave_node(kind);
4027    }
4028
4029    #[inline]
4030    pub fn walk_ts_type_predicate_name<'a, V: VisitMut<'a>>(
4031        visitor: &mut V,
4032        it: &mut TSTypePredicateName<'a>,
4033    ) {
4034        // No `AstType` for this type
4035        match it {
4036            TSTypePredicateName::Identifier(it) => visitor.visit_identifier_name(it),
4037            TSTypePredicateName::This(it) => visitor.visit_ts_this_type(it),
4038        }
4039    }
4040
4041    #[inline]
4042    pub fn walk_ts_module_declaration<'a, V: VisitMut<'a>>(
4043        visitor: &mut V,
4044        it: &mut TSModuleDeclaration<'a>,
4045    ) {
4046        let kind = AstType::TSModuleDeclaration;
4047        visitor.enter_node(kind);
4048        visitor.visit_span(&mut it.span);
4049        visitor.visit_ts_module_declaration_name(&mut it.id);
4050        visitor.enter_scope(
4051            {
4052                let mut flags = ScopeFlags::TsModuleBlock;
4053                if it.body.as_ref().is_some_and(TSModuleDeclarationBody::has_use_strict_directive) {
4054                    flags |= ScopeFlags::StrictMode;
4055                }
4056                flags
4057            },
4058            &it.scope_id,
4059        );
4060        if let Some(body) = &mut it.body {
4061            visitor.visit_ts_module_declaration_body(body);
4062        }
4063        visitor.leave_scope();
4064        visitor.leave_node(kind);
4065    }
4066
4067    #[inline]
4068    pub fn walk_ts_module_declaration_name<'a, V: VisitMut<'a>>(
4069        visitor: &mut V,
4070        it: &mut TSModuleDeclarationName<'a>,
4071    ) {
4072        // No `AstType` for this type
4073        match it {
4074            TSModuleDeclarationName::Identifier(it) => visitor.visit_binding_identifier(it),
4075            TSModuleDeclarationName::StringLiteral(it) => visitor.visit_string_literal(it),
4076        }
4077    }
4078
4079    #[inline]
4080    pub fn walk_ts_module_declaration_body<'a, V: VisitMut<'a>>(
4081        visitor: &mut V,
4082        it: &mut TSModuleDeclarationBody<'a>,
4083    ) {
4084        // No `AstType` for this type
4085        match it {
4086            TSModuleDeclarationBody::TSModuleDeclaration(it) => {
4087                visitor.visit_ts_module_declaration(it)
4088            }
4089            TSModuleDeclarationBody::TSModuleBlock(it) => visitor.visit_ts_module_block(it),
4090        }
4091    }
4092
4093    #[inline]
4094    pub fn walk_ts_global_declaration<'a, V: VisitMut<'a>>(
4095        visitor: &mut V,
4096        it: &mut TSGlobalDeclaration<'a>,
4097    ) {
4098        let kind = AstType::TSGlobalDeclaration;
4099        visitor.enter_node(kind);
4100        visitor.enter_scope(ScopeFlags::TsModuleBlock, &it.scope_id);
4101        visitor.visit_span(&mut it.span);
4102        visitor.visit_span(&mut it.global_span);
4103        visitor.visit_ts_module_block(&mut it.body);
4104        visitor.leave_scope();
4105        visitor.leave_node(kind);
4106    }
4107
4108    #[inline]
4109    pub fn walk_ts_module_block<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSModuleBlock<'a>) {
4110        let kind = AstType::TSModuleBlock;
4111        visitor.enter_node(kind);
4112        visitor.visit_span(&mut it.span);
4113        visitor.visit_directives(&mut it.directives);
4114        visitor.visit_statements(&mut it.body);
4115        visitor.leave_node(kind);
4116    }
4117
4118    #[inline]
4119    pub fn walk_ts_type_literal<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSTypeLiteral<'a>) {
4120        let kind = AstType::TSTypeLiteral;
4121        visitor.enter_node(kind);
4122        visitor.visit_span(&mut it.span);
4123        visitor.visit_ts_signatures(&mut it.members);
4124        visitor.leave_node(kind);
4125    }
4126
4127    #[inline]
4128    pub fn walk_ts_infer_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSInferType<'a>) {
4129        let kind = AstType::TSInferType;
4130        visitor.enter_node(kind);
4131        visitor.visit_span(&mut it.span);
4132        visitor.visit_ts_type_parameter(&mut it.type_parameter);
4133        visitor.leave_node(kind);
4134    }
4135
4136    #[inline]
4137    pub fn walk_ts_type_query<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSTypeQuery<'a>) {
4138        let kind = AstType::TSTypeQuery;
4139        visitor.enter_node(kind);
4140        visitor.visit_span(&mut it.span);
4141        visitor.visit_ts_type_query_expr_name(&mut it.expr_name);
4142        if let Some(type_arguments) = &mut it.type_arguments {
4143            visitor.visit_ts_type_parameter_instantiation(type_arguments);
4144        }
4145        visitor.leave_node(kind);
4146    }
4147
4148    #[inline]
4149    pub fn walk_ts_type_query_expr_name<'a, V: VisitMut<'a>>(
4150        visitor: &mut V,
4151        it: &mut TSTypeQueryExprName<'a>,
4152    ) {
4153        // No `AstType` for this type
4154        match it {
4155            TSTypeQueryExprName::TSImportType(it) => visitor.visit_ts_import_type(it),
4156            match_ts_type_name!(TSTypeQueryExprName) => {
4157                visitor.visit_ts_type_name(it.to_ts_type_name_mut())
4158            }
4159        }
4160    }
4161
4162    #[inline]
4163    pub fn walk_ts_import_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSImportType<'a>) {
4164        let kind = AstType::TSImportType;
4165        visitor.enter_node(kind);
4166        visitor.visit_span(&mut it.span);
4167        visitor.visit_string_literal(&mut it.source);
4168        if let Some(options) = &mut it.options {
4169            visitor.visit_object_expression(options);
4170        }
4171        if let Some(qualifier) = &mut it.qualifier {
4172            visitor.visit_ts_import_type_qualifier(qualifier);
4173        }
4174        if let Some(type_arguments) = &mut it.type_arguments {
4175            visitor.visit_ts_type_parameter_instantiation(type_arguments);
4176        }
4177        visitor.leave_node(kind);
4178    }
4179
4180    #[inline]
4181    pub fn walk_ts_import_type_qualifier<'a, V: VisitMut<'a>>(
4182        visitor: &mut V,
4183        it: &mut TSImportTypeQualifier<'a>,
4184    ) {
4185        // No `AstType` for this type
4186        match it {
4187            TSImportTypeQualifier::Identifier(it) => visitor.visit_identifier_name(it),
4188            TSImportTypeQualifier::QualifiedName(it) => {
4189                visitor.visit_ts_import_type_qualified_name(it)
4190            }
4191        }
4192    }
4193
4194    #[inline]
4195    pub fn walk_ts_import_type_qualified_name<'a, V: VisitMut<'a>>(
4196        visitor: &mut V,
4197        it: &mut TSImportTypeQualifiedName<'a>,
4198    ) {
4199        let kind = AstType::TSImportTypeQualifiedName;
4200        visitor.enter_node(kind);
4201        visitor.visit_span(&mut it.span);
4202        visitor.visit_ts_import_type_qualifier(&mut it.left);
4203        visitor.visit_identifier_name(&mut it.right);
4204        visitor.leave_node(kind);
4205    }
4206
4207    #[inline]
4208    pub fn walk_ts_function_type<'a, V: VisitMut<'a>>(
4209        visitor: &mut V,
4210        it: &mut TSFunctionType<'a>,
4211    ) {
4212        let kind = AstType::TSFunctionType;
4213        visitor.enter_node(kind);
4214        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
4215        visitor.visit_span(&mut it.span);
4216        if let Some(type_parameters) = &mut it.type_parameters {
4217            visitor.visit_ts_type_parameter_declaration(type_parameters);
4218        }
4219        if let Some(this_param) = &mut it.this_param {
4220            visitor.visit_ts_this_parameter(this_param);
4221        }
4222        visitor.visit_formal_parameters(&mut it.params);
4223        visitor.visit_ts_type_annotation(&mut it.return_type);
4224        visitor.leave_scope();
4225        visitor.leave_node(kind);
4226    }
4227
4228    #[inline]
4229    pub fn walk_ts_constructor_type<'a, V: VisitMut<'a>>(
4230        visitor: &mut V,
4231        it: &mut TSConstructorType<'a>,
4232    ) {
4233        let kind = AstType::TSConstructorType;
4234        visitor.enter_node(kind);
4235        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
4236        visitor.visit_span(&mut it.span);
4237        if let Some(type_parameters) = &mut it.type_parameters {
4238            visitor.visit_ts_type_parameter_declaration(type_parameters);
4239        }
4240        visitor.visit_formal_parameters(&mut it.params);
4241        visitor.visit_ts_type_annotation(&mut it.return_type);
4242        visitor.leave_scope();
4243        visitor.leave_node(kind);
4244    }
4245
4246    #[inline]
4247    pub fn walk_ts_mapped_type<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut TSMappedType<'a>) {
4248        let kind = AstType::TSMappedType;
4249        visitor.enter_node(kind);
4250        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
4251        visitor.visit_span(&mut it.span);
4252        visitor.visit_ts_type_parameter(&mut it.type_parameter);
4253        if let Some(name_type) = &mut it.name_type {
4254            visitor.visit_ts_type(name_type);
4255        }
4256        if let Some(type_annotation) = &mut it.type_annotation {
4257            visitor.visit_ts_type(type_annotation);
4258        }
4259        visitor.leave_scope();
4260        visitor.leave_node(kind);
4261    }
4262
4263    #[inline]
4264    pub fn walk_ts_template_literal_type<'a, V: VisitMut<'a>>(
4265        visitor: &mut V,
4266        it: &mut TSTemplateLiteralType<'a>,
4267    ) {
4268        let kind = AstType::TSTemplateLiteralType;
4269        visitor.enter_node(kind);
4270        visitor.visit_span(&mut it.span);
4271        visitor.visit_template_elements(&mut it.quasis);
4272        visitor.visit_ts_types(&mut it.types);
4273        visitor.leave_node(kind);
4274    }
4275
4276    #[inline]
4277    pub fn walk_ts_as_expression<'a, V: VisitMut<'a>>(
4278        visitor: &mut V,
4279        it: &mut TSAsExpression<'a>,
4280    ) {
4281        let kind = AstType::TSAsExpression;
4282        visitor.enter_node(kind);
4283        visitor.visit_span(&mut it.span);
4284        visitor.visit_expression(&mut it.expression);
4285        visitor.visit_ts_type(&mut it.type_annotation);
4286        visitor.leave_node(kind);
4287    }
4288
4289    #[inline]
4290    pub fn walk_ts_satisfies_expression<'a, V: VisitMut<'a>>(
4291        visitor: &mut V,
4292        it: &mut TSSatisfiesExpression<'a>,
4293    ) {
4294        let kind = AstType::TSSatisfiesExpression;
4295        visitor.enter_node(kind);
4296        visitor.visit_span(&mut it.span);
4297        visitor.visit_expression(&mut it.expression);
4298        visitor.visit_ts_type(&mut it.type_annotation);
4299        visitor.leave_node(kind);
4300    }
4301
4302    #[inline]
4303    pub fn walk_ts_type_assertion<'a, V: VisitMut<'a>>(
4304        visitor: &mut V,
4305        it: &mut TSTypeAssertion<'a>,
4306    ) {
4307        let kind = AstType::TSTypeAssertion;
4308        visitor.enter_node(kind);
4309        visitor.visit_span(&mut it.span);
4310        visitor.visit_ts_type(&mut it.type_annotation);
4311        visitor.visit_expression(&mut it.expression);
4312        visitor.leave_node(kind);
4313    }
4314
4315    #[inline]
4316    pub fn walk_ts_import_equals_declaration<'a, V: VisitMut<'a>>(
4317        visitor: &mut V,
4318        it: &mut TSImportEqualsDeclaration<'a>,
4319    ) {
4320        let kind = AstType::TSImportEqualsDeclaration;
4321        visitor.enter_node(kind);
4322        visitor.visit_span(&mut it.span);
4323        visitor.visit_binding_identifier(&mut it.id);
4324        visitor.visit_ts_module_reference(&mut it.module_reference);
4325        visitor.leave_node(kind);
4326    }
4327
4328    #[inline]
4329    pub fn walk_ts_module_reference<'a, V: VisitMut<'a>>(
4330        visitor: &mut V,
4331        it: &mut TSModuleReference<'a>,
4332    ) {
4333        // No `AstType` for this type
4334        match it {
4335            TSModuleReference::ExternalModuleReference(it) => {
4336                visitor.visit_ts_external_module_reference(it)
4337            }
4338            match_ts_type_name!(TSModuleReference) => {
4339                visitor.visit_ts_type_name(it.to_ts_type_name_mut())
4340            }
4341        }
4342    }
4343
4344    #[inline]
4345    pub fn walk_ts_external_module_reference<'a, V: VisitMut<'a>>(
4346        visitor: &mut V,
4347        it: &mut TSExternalModuleReference<'a>,
4348    ) {
4349        let kind = AstType::TSExternalModuleReference;
4350        visitor.enter_node(kind);
4351        visitor.visit_span(&mut it.span);
4352        visitor.visit_string_literal(&mut it.expression);
4353        visitor.leave_node(kind);
4354    }
4355
4356    #[inline]
4357    pub fn walk_ts_non_null_expression<'a, V: VisitMut<'a>>(
4358        visitor: &mut V,
4359        it: &mut TSNonNullExpression<'a>,
4360    ) {
4361        let kind = AstType::TSNonNullExpression;
4362        visitor.enter_node(kind);
4363        visitor.visit_span(&mut it.span);
4364        visitor.visit_expression(&mut it.expression);
4365        visitor.leave_node(kind);
4366    }
4367
4368    #[inline]
4369    pub fn walk_decorator<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Decorator<'a>) {
4370        let kind = AstType::Decorator;
4371        visitor.enter_node(kind);
4372        visitor.visit_span(&mut it.span);
4373        visitor.visit_expression(&mut it.expression);
4374        visitor.leave_node(kind);
4375    }
4376
4377    #[inline]
4378    pub fn walk_ts_export_assignment<'a, V: VisitMut<'a>>(
4379        visitor: &mut V,
4380        it: &mut TSExportAssignment<'a>,
4381    ) {
4382        let kind = AstType::TSExportAssignment;
4383        visitor.enter_node(kind);
4384        visitor.visit_span(&mut it.span);
4385        visitor.visit_expression(&mut it.expression);
4386        visitor.leave_node(kind);
4387    }
4388
4389    #[inline]
4390    pub fn walk_ts_namespace_export_declaration<'a, V: VisitMut<'a>>(
4391        visitor: &mut V,
4392        it: &mut TSNamespaceExportDeclaration<'a>,
4393    ) {
4394        let kind = AstType::TSNamespaceExportDeclaration;
4395        visitor.enter_node(kind);
4396        visitor.visit_span(&mut it.span);
4397        visitor.visit_identifier_name(&mut it.id);
4398        visitor.leave_node(kind);
4399    }
4400
4401    #[inline]
4402    pub fn walk_ts_instantiation_expression<'a, V: VisitMut<'a>>(
4403        visitor: &mut V,
4404        it: &mut TSInstantiationExpression<'a>,
4405    ) {
4406        let kind = AstType::TSInstantiationExpression;
4407        visitor.enter_node(kind);
4408        visitor.visit_span(&mut it.span);
4409        visitor.visit_expression(&mut it.expression);
4410        visitor.visit_ts_type_parameter_instantiation(&mut it.type_arguments);
4411        visitor.leave_node(kind);
4412    }
4413
4414    #[inline]
4415    pub fn walk_js_doc_nullable_type<'a, V: VisitMut<'a>>(
4416        visitor: &mut V,
4417        it: &mut JSDocNullableType<'a>,
4418    ) {
4419        let kind = AstType::JSDocNullableType;
4420        visitor.enter_node(kind);
4421        visitor.visit_span(&mut it.span);
4422        visitor.visit_ts_type(&mut it.type_annotation);
4423        visitor.leave_node(kind);
4424    }
4425
4426    #[inline]
4427    pub fn walk_js_doc_non_nullable_type<'a, V: VisitMut<'a>>(
4428        visitor: &mut V,
4429        it: &mut JSDocNonNullableType<'a>,
4430    ) {
4431        let kind = AstType::JSDocNonNullableType;
4432        visitor.enter_node(kind);
4433        visitor.visit_span(&mut it.span);
4434        visitor.visit_ts_type(&mut it.type_annotation);
4435        visitor.leave_node(kind);
4436    }
4437
4438    #[inline]
4439    pub fn walk_js_doc_unknown_type<'a, V: VisitMut<'a>>(
4440        visitor: &mut V,
4441        it: &mut JSDocUnknownType,
4442    ) {
4443        let kind = AstType::JSDocUnknownType;
4444        visitor.enter_node(kind);
4445        visitor.visit_span(&mut it.span);
4446        visitor.leave_node(kind);
4447    }
4448
4449    #[inline]
4450    pub fn walk_span<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Span) {
4451        // No `AstType` for this type
4452    }
4453
4454    #[inline]
4455    pub fn walk_directives<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, Directive<'a>>) {
4456        for el in it {
4457            visitor.visit_directive(el);
4458        }
4459    }
4460
4461    #[inline]
4462    pub fn walk_statements<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, Statement<'a>>) {
4463        for el in it {
4464            visitor.visit_statement(el);
4465        }
4466    }
4467
4468    #[inline]
4469    pub fn walk_array_expression_elements<'a, V: VisitMut<'a>>(
4470        visitor: &mut V,
4471        it: &mut Vec<'a, ArrayExpressionElement<'a>>,
4472    ) {
4473        for el in it {
4474            visitor.visit_array_expression_element(el);
4475        }
4476    }
4477
4478    #[inline]
4479    pub fn walk_object_property_kinds<'a, V: VisitMut<'a>>(
4480        visitor: &mut V,
4481        it: &mut Vec<'a, ObjectPropertyKind<'a>>,
4482    ) {
4483        for el in it {
4484            visitor.visit_object_property_kind(el);
4485        }
4486    }
4487
4488    #[inline]
4489    pub fn walk_template_elements<'a, V: VisitMut<'a>>(
4490        visitor: &mut V,
4491        it: &mut Vec<'a, TemplateElement<'a>>,
4492    ) {
4493        for el in it {
4494            visitor.visit_template_element(el);
4495        }
4496    }
4497
4498    #[inline]
4499    pub fn walk_expressions<'a, V: VisitMut<'a>>(
4500        visitor: &mut V,
4501        it: &mut Vec<'a, Expression<'a>>,
4502    ) {
4503        for el in it {
4504            visitor.visit_expression(el);
4505        }
4506    }
4507
4508    #[inline]
4509    pub fn walk_arguments<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, Argument<'a>>) {
4510        for el in it {
4511            match el {
4512                oxc_ast::ast::Argument::SpreadElement(spread) => {
4513                    visitor.visit_spread_element(spread);
4514                }
4515                _ => {
4516                    visitor.visit_expression(el.to_expression_mut());
4517                }
4518            }
4519        }
4520    }
4521
4522    #[inline]
4523    pub fn walk_assignment_target_properties<'a, V: VisitMut<'a>>(
4524        visitor: &mut V,
4525        it: &mut Vec<'a, AssignmentTargetProperty<'a>>,
4526    ) {
4527        for el in it {
4528            visitor.visit_assignment_target_property(el);
4529        }
4530    }
4531
4532    #[inline]
4533    pub fn walk_variable_declarators<'a, V: VisitMut<'a>>(
4534        visitor: &mut V,
4535        it: &mut Vec<'a, VariableDeclarator<'a>>,
4536    ) {
4537        for el in it {
4538            visitor.visit_variable_declarator(el);
4539        }
4540    }
4541
4542    #[inline]
4543    pub fn walk_switch_cases<'a, V: VisitMut<'a>>(
4544        visitor: &mut V,
4545        it: &mut Vec<'a, SwitchCase<'a>>,
4546    ) {
4547        for el in it {
4548            visitor.visit_switch_case(el);
4549        }
4550    }
4551
4552    #[inline]
4553    pub fn walk_binding_properties<'a, V: VisitMut<'a>>(
4554        visitor: &mut V,
4555        it: &mut Vec<'a, BindingProperty<'a>>,
4556    ) {
4557        for el in it {
4558            visitor.visit_binding_property(el);
4559        }
4560    }
4561
4562    #[inline]
4563    pub fn walk_formal_parameter_list<'a, V: VisitMut<'a>>(
4564        visitor: &mut V,
4565        it: &mut Vec<'a, FormalParameter<'a>>,
4566    ) {
4567        for el in it {
4568            visitor.visit_formal_parameter(el);
4569        }
4570    }
4571
4572    #[inline]
4573    pub fn walk_decorators<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, Decorator<'a>>) {
4574        for el in it {
4575            visitor.visit_decorator(el);
4576        }
4577    }
4578
4579    #[inline]
4580    pub fn walk_ts_class_implements_list<'a, V: VisitMut<'a>>(
4581        visitor: &mut V,
4582        it: &mut Vec<'a, TSClassImplements<'a>>,
4583    ) {
4584        for el in it {
4585            visitor.visit_ts_class_implements(el);
4586        }
4587    }
4588
4589    #[inline]
4590    pub fn walk_class_elements<'a, V: VisitMut<'a>>(
4591        visitor: &mut V,
4592        it: &mut Vec<'a, ClassElement<'a>>,
4593    ) {
4594        for el in it {
4595            visitor.visit_class_element(el);
4596        }
4597    }
4598
4599    #[inline]
4600    pub fn walk_import_declaration_specifiers<'a, V: VisitMut<'a>>(
4601        visitor: &mut V,
4602        it: &mut Vec<'a, ImportDeclarationSpecifier<'a>>,
4603    ) {
4604        for el in it {
4605            visitor.visit_import_declaration_specifier(el);
4606        }
4607    }
4608
4609    #[inline]
4610    pub fn walk_import_attributes<'a, V: VisitMut<'a>>(
4611        visitor: &mut V,
4612        it: &mut Vec<'a, ImportAttribute<'a>>,
4613    ) {
4614        for el in it {
4615            visitor.visit_import_attribute(el);
4616        }
4617    }
4618
4619    #[inline]
4620    pub fn walk_export_specifiers<'a, V: VisitMut<'a>>(
4621        visitor: &mut V,
4622        it: &mut Vec<'a, ExportSpecifier<'a>>,
4623    ) {
4624        for el in it {
4625            visitor.visit_export_specifier(el);
4626        }
4627    }
4628
4629    #[inline]
4630    pub fn walk_jsx_children<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, JSXChild<'a>>) {
4631        for el in it {
4632            visitor.visit_jsx_child(el);
4633        }
4634    }
4635
4636    #[inline]
4637    pub fn walk_jsx_attribute_items<'a, V: VisitMut<'a>>(
4638        visitor: &mut V,
4639        it: &mut Vec<'a, JSXAttributeItem<'a>>,
4640    ) {
4641        for el in it {
4642            visitor.visit_jsx_attribute_item(el);
4643        }
4644    }
4645
4646    #[inline]
4647    pub fn walk_ts_enum_members<'a, V: VisitMut<'a>>(
4648        visitor: &mut V,
4649        it: &mut Vec<'a, TSEnumMember<'a>>,
4650    ) {
4651        for el in it {
4652            visitor.visit_ts_enum_member(el);
4653        }
4654    }
4655
4656    #[inline]
4657    pub fn walk_ts_types<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, TSType<'a>>) {
4658        for el in it {
4659            visitor.visit_ts_type(el);
4660        }
4661    }
4662
4663    #[inline]
4664    pub fn walk_ts_tuple_elements<'a, V: VisitMut<'a>>(
4665        visitor: &mut V,
4666        it: &mut Vec<'a, TSTupleElement<'a>>,
4667    ) {
4668        for el in it {
4669            visitor.visit_ts_tuple_element(el);
4670        }
4671    }
4672
4673    #[inline]
4674    pub fn walk_ts_type_parameters<'a, V: VisitMut<'a>>(
4675        visitor: &mut V,
4676        it: &mut Vec<'a, TSTypeParameter<'a>>,
4677    ) {
4678        for el in it {
4679            visitor.visit_ts_type_parameter(el);
4680        }
4681    }
4682
4683    #[inline]
4684    pub fn walk_ts_interface_heritages<'a, V: VisitMut<'a>>(
4685        visitor: &mut V,
4686        it: &mut Vec<'a, TSInterfaceHeritage<'a>>,
4687    ) {
4688        for el in it {
4689            visitor.visit_ts_interface_heritage(el);
4690        }
4691    }
4692
4693    #[inline]
4694    pub fn walk_ts_signatures<'a, V: VisitMut<'a>>(
4695        visitor: &mut V,
4696        it: &mut Vec<'a, TSSignature<'a>>,
4697    ) {
4698        for el in it {
4699            visitor.visit_ts_signature(el);
4700        }
4701    }
4702
4703    #[inline]
4704    pub fn walk_ts_index_signature_names<'a, V: VisitMut<'a>>(
4705        visitor: &mut V,
4706        it: &mut Vec<'a, TSIndexSignatureName<'a>>,
4707    ) {
4708        for el in it {
4709            visitor.visit_ts_index_signature_name(el);
4710        }
4711    }
4712
4713    #[inline]
4714    pub fn walk_spans<'a, V: VisitMut<'a>>(visitor: &mut V, it: &mut Vec<'a, Span>) {
4715        for el in it {
4716            visitor.visit_span(el);
4717        }
4718    }
4719}