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