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_module_block(&mut self, it: &TSModuleBlock<'a>) {
1069        walk_ts_module_block(self, it);
1070    }
1071
1072    #[inline]
1073    fn visit_ts_type_literal(&mut self, it: &TSTypeLiteral<'a>) {
1074        walk_ts_type_literal(self, it);
1075    }
1076
1077    #[inline]
1078    fn visit_ts_infer_type(&mut self, it: &TSInferType<'a>) {
1079        walk_ts_infer_type(self, it);
1080    }
1081
1082    #[inline]
1083    fn visit_ts_type_query(&mut self, it: &TSTypeQuery<'a>) {
1084        walk_ts_type_query(self, it);
1085    }
1086
1087    #[inline]
1088    fn visit_ts_type_query_expr_name(&mut self, it: &TSTypeQueryExprName<'a>) {
1089        walk_ts_type_query_expr_name(self, it);
1090    }
1091
1092    #[inline]
1093    fn visit_ts_import_type(&mut self, it: &TSImportType<'a>) {
1094        walk_ts_import_type(self, it);
1095    }
1096
1097    #[inline]
1098    fn visit_ts_import_type_qualifier(&mut self, it: &TSImportTypeQualifier<'a>) {
1099        walk_ts_import_type_qualifier(self, it);
1100    }
1101
1102    #[inline]
1103    fn visit_ts_import_type_qualified_name(&mut self, it: &TSImportTypeQualifiedName<'a>) {
1104        walk_ts_import_type_qualified_name(self, it);
1105    }
1106
1107    #[inline]
1108    fn visit_ts_function_type(&mut self, it: &TSFunctionType<'a>) {
1109        walk_ts_function_type(self, it);
1110    }
1111
1112    #[inline]
1113    fn visit_ts_constructor_type(&mut self, it: &TSConstructorType<'a>) {
1114        walk_ts_constructor_type(self, it);
1115    }
1116
1117    #[inline]
1118    fn visit_ts_mapped_type(&mut self, it: &TSMappedType<'a>) {
1119        walk_ts_mapped_type(self, it);
1120    }
1121
1122    #[inline]
1123    fn visit_ts_template_literal_type(&mut self, it: &TSTemplateLiteralType<'a>) {
1124        walk_ts_template_literal_type(self, it);
1125    }
1126
1127    #[inline]
1128    fn visit_ts_as_expression(&mut self, it: &TSAsExpression<'a>) {
1129        walk_ts_as_expression(self, it);
1130    }
1131
1132    #[inline]
1133    fn visit_ts_satisfies_expression(&mut self, it: &TSSatisfiesExpression<'a>) {
1134        walk_ts_satisfies_expression(self, it);
1135    }
1136
1137    #[inline]
1138    fn visit_ts_type_assertion(&mut self, it: &TSTypeAssertion<'a>) {
1139        walk_ts_type_assertion(self, it);
1140    }
1141
1142    #[inline]
1143    fn visit_ts_import_equals_declaration(&mut self, it: &TSImportEqualsDeclaration<'a>) {
1144        walk_ts_import_equals_declaration(self, it);
1145    }
1146
1147    #[inline]
1148    fn visit_ts_module_reference(&mut self, it: &TSModuleReference<'a>) {
1149        walk_ts_module_reference(self, it);
1150    }
1151
1152    #[inline]
1153    fn visit_ts_external_module_reference(&mut self, it: &TSExternalModuleReference<'a>) {
1154        walk_ts_external_module_reference(self, it);
1155    }
1156
1157    #[inline]
1158    fn visit_ts_non_null_expression(&mut self, it: &TSNonNullExpression<'a>) {
1159        walk_ts_non_null_expression(self, it);
1160    }
1161
1162    #[inline]
1163    fn visit_decorator(&mut self, it: &Decorator<'a>) {
1164        walk_decorator(self, it);
1165    }
1166
1167    #[inline]
1168    fn visit_ts_export_assignment(&mut self, it: &TSExportAssignment<'a>) {
1169        walk_ts_export_assignment(self, it);
1170    }
1171
1172    #[inline]
1173    fn visit_ts_namespace_export_declaration(&mut self, it: &TSNamespaceExportDeclaration<'a>) {
1174        walk_ts_namespace_export_declaration(self, it);
1175    }
1176
1177    #[inline]
1178    fn visit_ts_instantiation_expression(&mut self, it: &TSInstantiationExpression<'a>) {
1179        walk_ts_instantiation_expression(self, it);
1180    }
1181
1182    #[inline]
1183    fn visit_js_doc_nullable_type(&mut self, it: &JSDocNullableType<'a>) {
1184        walk_js_doc_nullable_type(self, it);
1185    }
1186
1187    #[inline]
1188    fn visit_js_doc_non_nullable_type(&mut self, it: &JSDocNonNullableType<'a>) {
1189        walk_js_doc_non_nullable_type(self, it);
1190    }
1191
1192    #[inline]
1193    fn visit_js_doc_unknown_type(&mut self, it: &JSDocUnknownType) {
1194        walk_js_doc_unknown_type(self, it);
1195    }
1196
1197    #[inline]
1198    fn visit_span(&mut self, it: &Span) {
1199        walk_span(self, it);
1200    }
1201
1202    #[inline]
1203    fn visit_directives(&mut self, it: &Vec<'a, Directive<'a>>) {
1204        walk_directives(self, it);
1205    }
1206
1207    #[inline]
1208    fn visit_statements(&mut self, it: &Vec<'a, Statement<'a>>) {
1209        walk_statements(self, it);
1210    }
1211
1212    #[inline]
1213    fn visit_array_expression_elements(&mut self, it: &Vec<'a, ArrayExpressionElement<'a>>) {
1214        walk_array_expression_elements(self, it);
1215    }
1216
1217    #[inline]
1218    fn visit_object_property_kinds(&mut self, it: &Vec<'a, ObjectPropertyKind<'a>>) {
1219        walk_object_property_kinds(self, it);
1220    }
1221
1222    #[inline]
1223    fn visit_template_elements(&mut self, it: &Vec<'a, TemplateElement<'a>>) {
1224        walk_template_elements(self, it);
1225    }
1226
1227    #[inline]
1228    fn visit_expressions(&mut self, it: &Vec<'a, Expression<'a>>) {
1229        walk_expressions(self, it);
1230    }
1231
1232    #[inline]
1233    fn visit_arguments(&mut self, it: &Vec<'a, Argument<'a>>) {
1234        walk_arguments(self, it);
1235    }
1236
1237    #[inline]
1238    fn visit_assignment_target_properties(&mut self, it: &Vec<'a, AssignmentTargetProperty<'a>>) {
1239        walk_assignment_target_properties(self, it);
1240    }
1241
1242    #[inline]
1243    fn visit_variable_declarators(&mut self, it: &Vec<'a, VariableDeclarator<'a>>) {
1244        walk_variable_declarators(self, it);
1245    }
1246
1247    #[inline]
1248    fn visit_switch_cases(&mut self, it: &Vec<'a, SwitchCase<'a>>) {
1249        walk_switch_cases(self, it);
1250    }
1251
1252    #[inline]
1253    fn visit_binding_properties(&mut self, it: &Vec<'a, BindingProperty<'a>>) {
1254        walk_binding_properties(self, it);
1255    }
1256
1257    #[inline]
1258    fn visit_formal_parameter_list(&mut self, it: &Vec<'a, FormalParameter<'a>>) {
1259        walk_formal_parameter_list(self, it);
1260    }
1261
1262    #[inline]
1263    fn visit_decorators(&mut self, it: &Vec<'a, Decorator<'a>>) {
1264        walk_decorators(self, it);
1265    }
1266
1267    #[inline]
1268    fn visit_ts_class_implements_list(&mut self, it: &Vec<'a, TSClassImplements<'a>>) {
1269        walk_ts_class_implements_list(self, it);
1270    }
1271
1272    #[inline]
1273    fn visit_class_elements(&mut self, it: &Vec<'a, ClassElement<'a>>) {
1274        walk_class_elements(self, it);
1275    }
1276
1277    #[inline]
1278    fn visit_import_declaration_specifiers(
1279        &mut self,
1280        it: &Vec<'a, ImportDeclarationSpecifier<'a>>,
1281    ) {
1282        walk_import_declaration_specifiers(self, it);
1283    }
1284
1285    #[inline]
1286    fn visit_import_attributes(&mut self, it: &Vec<'a, ImportAttribute<'a>>) {
1287        walk_import_attributes(self, it);
1288    }
1289
1290    #[inline]
1291    fn visit_export_specifiers(&mut self, it: &Vec<'a, ExportSpecifier<'a>>) {
1292        walk_export_specifiers(self, it);
1293    }
1294
1295    #[inline]
1296    fn visit_jsx_children(&mut self, it: &Vec<'a, JSXChild<'a>>) {
1297        walk_jsx_children(self, it);
1298    }
1299
1300    #[inline]
1301    fn visit_jsx_attribute_items(&mut self, it: &Vec<'a, JSXAttributeItem<'a>>) {
1302        walk_jsx_attribute_items(self, it);
1303    }
1304
1305    #[inline]
1306    fn visit_ts_enum_members(&mut self, it: &Vec<'a, TSEnumMember<'a>>) {
1307        walk_ts_enum_members(self, it);
1308    }
1309
1310    #[inline]
1311    fn visit_ts_types(&mut self, it: &Vec<'a, TSType<'a>>) {
1312        walk_ts_types(self, it);
1313    }
1314
1315    #[inline]
1316    fn visit_ts_tuple_elements(&mut self, it: &Vec<'a, TSTupleElement<'a>>) {
1317        walk_ts_tuple_elements(self, it);
1318    }
1319
1320    #[inline]
1321    fn visit_ts_type_parameters(&mut self, it: &Vec<'a, TSTypeParameter<'a>>) {
1322        walk_ts_type_parameters(self, it);
1323    }
1324
1325    #[inline]
1326    fn visit_ts_interface_heritages(&mut self, it: &Vec<'a, TSInterfaceHeritage<'a>>) {
1327        walk_ts_interface_heritages(self, it);
1328    }
1329
1330    #[inline]
1331    fn visit_ts_signatures(&mut self, it: &Vec<'a, TSSignature<'a>>) {
1332        walk_ts_signatures(self, it);
1333    }
1334
1335    #[inline]
1336    fn visit_ts_index_signature_names(&mut self, it: &Vec<'a, TSIndexSignatureName<'a>>) {
1337        walk_ts_index_signature_names(self, it);
1338    }
1339
1340    #[inline]
1341    fn visit_spans(&mut self, it: &Vec<'a, Span>) {
1342        walk_spans(self, it);
1343    }
1344}
1345
1346pub mod walk {
1347    use super::*;
1348
1349    #[inline]
1350    pub fn walk_program<'a, V: Visit<'a>>(visitor: &mut V, it: &Program<'a>) {
1351        let kind = AstKind::Program(visitor.alloc(it));
1352        visitor.enter_node(kind);
1353        visitor.enter_scope(
1354            {
1355                let mut flags = ScopeFlags::Top;
1356                if it.source_type.is_strict() || it.has_use_strict_directive() {
1357                    flags |= ScopeFlags::StrictMode;
1358                }
1359                flags
1360            },
1361            &it.scope_id,
1362        );
1363        visitor.visit_span(&it.span);
1364        if let Some(hashbang) = &it.hashbang {
1365            visitor.visit_hashbang(hashbang);
1366        }
1367        visitor.visit_directives(&it.directives);
1368        visitor.visit_statements(&it.body);
1369        visitor.leave_scope();
1370        visitor.leave_node(kind);
1371    }
1372
1373    pub fn walk_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &Expression<'a>) {
1374        // No `AstKind` for this type
1375        match it {
1376            Expression::BooleanLiteral(it) => visitor.visit_boolean_literal(it),
1377            Expression::NullLiteral(it) => visitor.visit_null_literal(it),
1378            Expression::NumericLiteral(it) => visitor.visit_numeric_literal(it),
1379            Expression::BigIntLiteral(it) => visitor.visit_big_int_literal(it),
1380            Expression::RegExpLiteral(it) => visitor.visit_reg_exp_literal(it),
1381            Expression::StringLiteral(it) => visitor.visit_string_literal(it),
1382            Expression::TemplateLiteral(it) => visitor.visit_template_literal(it),
1383            Expression::Identifier(it) => visitor.visit_identifier_reference(it),
1384            Expression::MetaProperty(it) => visitor.visit_meta_property(it),
1385            Expression::Super(it) => visitor.visit_super(it),
1386            Expression::ArrayExpression(it) => visitor.visit_array_expression(it),
1387            Expression::ArrowFunctionExpression(it) => visitor.visit_arrow_function_expression(it),
1388            Expression::AssignmentExpression(it) => visitor.visit_assignment_expression(it),
1389            Expression::AwaitExpression(it) => visitor.visit_await_expression(it),
1390            Expression::BinaryExpression(it) => visitor.visit_binary_expression(it),
1391            Expression::CallExpression(it) => visitor.visit_call_expression(it),
1392            Expression::ChainExpression(it) => visitor.visit_chain_expression(it),
1393            Expression::ClassExpression(it) => visitor.visit_class(it),
1394            Expression::ConditionalExpression(it) => visitor.visit_conditional_expression(it),
1395            Expression::FunctionExpression(it) => {
1396                let flags = ScopeFlags::Function;
1397                visitor.visit_function(it, flags)
1398            }
1399            Expression::ImportExpression(it) => visitor.visit_import_expression(it),
1400            Expression::LogicalExpression(it) => visitor.visit_logical_expression(it),
1401            Expression::NewExpression(it) => visitor.visit_new_expression(it),
1402            Expression::ObjectExpression(it) => visitor.visit_object_expression(it),
1403            Expression::ParenthesizedExpression(it) => visitor.visit_parenthesized_expression(it),
1404            Expression::SequenceExpression(it) => visitor.visit_sequence_expression(it),
1405            Expression::TaggedTemplateExpression(it) => {
1406                visitor.visit_tagged_template_expression(it)
1407            }
1408            Expression::ThisExpression(it) => visitor.visit_this_expression(it),
1409            Expression::UnaryExpression(it) => visitor.visit_unary_expression(it),
1410            Expression::UpdateExpression(it) => visitor.visit_update_expression(it),
1411            Expression::YieldExpression(it) => visitor.visit_yield_expression(it),
1412            Expression::PrivateInExpression(it) => visitor.visit_private_in_expression(it),
1413            Expression::JSXElement(it) => visitor.visit_jsx_element(it),
1414            Expression::JSXFragment(it) => visitor.visit_jsx_fragment(it),
1415            Expression::TSAsExpression(it) => visitor.visit_ts_as_expression(it),
1416            Expression::TSSatisfiesExpression(it) => visitor.visit_ts_satisfies_expression(it),
1417            Expression::TSTypeAssertion(it) => visitor.visit_ts_type_assertion(it),
1418            Expression::TSNonNullExpression(it) => visitor.visit_ts_non_null_expression(it),
1419            Expression::TSInstantiationExpression(it) => {
1420                visitor.visit_ts_instantiation_expression(it)
1421            }
1422            Expression::V8IntrinsicExpression(it) => visitor.visit_v_8_intrinsic_expression(it),
1423            match_member_expression!(Expression) => {
1424                visitor.visit_member_expression(it.to_member_expression())
1425            }
1426        }
1427    }
1428
1429    #[inline]
1430    pub fn walk_identifier_name<'a, V: Visit<'a>>(visitor: &mut V, it: &IdentifierName<'a>) {
1431        let kind = AstKind::IdentifierName(visitor.alloc(it));
1432        visitor.enter_node(kind);
1433        visitor.visit_span(&it.span);
1434        visitor.leave_node(kind);
1435    }
1436
1437    #[inline]
1438    pub fn walk_identifier_reference<'a, V: Visit<'a>>(
1439        visitor: &mut V,
1440        it: &IdentifierReference<'a>,
1441    ) {
1442        let kind = AstKind::IdentifierReference(visitor.alloc(it));
1443        visitor.enter_node(kind);
1444        visitor.visit_span(&it.span);
1445        visitor.leave_node(kind);
1446    }
1447
1448    #[inline]
1449    pub fn walk_binding_identifier<'a, V: Visit<'a>>(visitor: &mut V, it: &BindingIdentifier<'a>) {
1450        let kind = AstKind::BindingIdentifier(visitor.alloc(it));
1451        visitor.enter_node(kind);
1452        visitor.visit_span(&it.span);
1453        visitor.leave_node(kind);
1454    }
1455
1456    #[inline]
1457    pub fn walk_label_identifier<'a, V: Visit<'a>>(visitor: &mut V, it: &LabelIdentifier<'a>) {
1458        let kind = AstKind::LabelIdentifier(visitor.alloc(it));
1459        visitor.enter_node(kind);
1460        visitor.visit_span(&it.span);
1461        visitor.leave_node(kind);
1462    }
1463
1464    #[inline]
1465    pub fn walk_this_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &ThisExpression) {
1466        let kind = AstKind::ThisExpression(visitor.alloc(it));
1467        visitor.enter_node(kind);
1468        visitor.visit_span(&it.span);
1469        visitor.leave_node(kind);
1470    }
1471
1472    #[inline]
1473    pub fn walk_array_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &ArrayExpression<'a>) {
1474        let kind = AstKind::ArrayExpression(visitor.alloc(it));
1475        visitor.enter_node(kind);
1476        visitor.visit_span(&it.span);
1477        visitor.visit_array_expression_elements(&it.elements);
1478        visitor.leave_node(kind);
1479    }
1480
1481    #[inline]
1482    pub fn walk_array_expression_element<'a, V: Visit<'a>>(
1483        visitor: &mut V,
1484        it: &ArrayExpressionElement<'a>,
1485    ) {
1486        // No `AstKind` for this type
1487        match it {
1488            ArrayExpressionElement::SpreadElement(it) => visitor.visit_spread_element(it),
1489            ArrayExpressionElement::Elision(it) => visitor.visit_elision(it),
1490            match_expression!(ArrayExpressionElement) => {
1491                visitor.visit_expression(it.to_expression())
1492            }
1493        }
1494    }
1495
1496    #[inline]
1497    pub fn walk_elision<'a, V: Visit<'a>>(visitor: &mut V, it: &Elision) {
1498        let kind = AstKind::Elision(visitor.alloc(it));
1499        visitor.enter_node(kind);
1500        visitor.visit_span(&it.span);
1501        visitor.leave_node(kind);
1502    }
1503
1504    #[inline]
1505    pub fn walk_object_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &ObjectExpression<'a>) {
1506        let kind = AstKind::ObjectExpression(visitor.alloc(it));
1507        visitor.enter_node(kind);
1508        visitor.visit_span(&it.span);
1509        visitor.visit_object_property_kinds(&it.properties);
1510        visitor.leave_node(kind);
1511    }
1512
1513    #[inline]
1514    pub fn walk_object_property_kind<'a, V: Visit<'a>>(
1515        visitor: &mut V,
1516        it: &ObjectPropertyKind<'a>,
1517    ) {
1518        // No `AstKind` for this type
1519        match it {
1520            ObjectPropertyKind::ObjectProperty(it) => visitor.visit_object_property(it),
1521            ObjectPropertyKind::SpreadProperty(it) => visitor.visit_spread_element(it),
1522        }
1523    }
1524
1525    #[inline]
1526    pub fn walk_object_property<'a, V: Visit<'a>>(visitor: &mut V, it: &ObjectProperty<'a>) {
1527        let kind = AstKind::ObjectProperty(visitor.alloc(it));
1528        visitor.enter_node(kind);
1529        visitor.visit_span(&it.span);
1530        visitor.visit_property_key(&it.key);
1531        visitor.visit_expression(&it.value);
1532        visitor.leave_node(kind);
1533    }
1534
1535    #[inline]
1536    pub fn walk_property_key<'a, V: Visit<'a>>(visitor: &mut V, it: &PropertyKey<'a>) {
1537        // No `AstKind` for this type
1538        match it {
1539            PropertyKey::StaticIdentifier(it) => visitor.visit_identifier_name(it),
1540            PropertyKey::PrivateIdentifier(it) => visitor.visit_private_identifier(it),
1541            match_expression!(PropertyKey) => visitor.visit_expression(it.to_expression()),
1542        }
1543    }
1544
1545    #[inline]
1546    pub fn walk_template_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &TemplateLiteral<'a>) {
1547        let kind = AstKind::TemplateLiteral(visitor.alloc(it));
1548        visitor.enter_node(kind);
1549        visitor.visit_span(&it.span);
1550        visitor.visit_template_elements(&it.quasis);
1551        visitor.visit_expressions(&it.expressions);
1552        visitor.leave_node(kind);
1553    }
1554
1555    #[inline]
1556    pub fn walk_tagged_template_expression<'a, V: Visit<'a>>(
1557        visitor: &mut V,
1558        it: &TaggedTemplateExpression<'a>,
1559    ) {
1560        let kind = AstKind::TaggedTemplateExpression(visitor.alloc(it));
1561        visitor.enter_node(kind);
1562        visitor.visit_span(&it.span);
1563        visitor.visit_expression(&it.tag);
1564        if let Some(type_arguments) = &it.type_arguments {
1565            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1566        }
1567        visitor.visit_template_literal(&it.quasi);
1568        visitor.leave_node(kind);
1569    }
1570
1571    #[inline]
1572    pub fn walk_template_element<'a, V: Visit<'a>>(visitor: &mut V, it: &TemplateElement<'a>) {
1573        let kind = AstKind::TemplateElement(visitor.alloc(it));
1574        visitor.enter_node(kind);
1575        visitor.visit_span(&it.span);
1576        visitor.leave_node(kind);
1577    }
1578
1579    #[inline]
1580    pub fn walk_member_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &MemberExpression<'a>) {
1581        // No `AstKind` for this type
1582        match it {
1583            MemberExpression::ComputedMemberExpression(it) => {
1584                visitor.visit_computed_member_expression(it)
1585            }
1586            MemberExpression::StaticMemberExpression(it) => {
1587                visitor.visit_static_member_expression(it)
1588            }
1589            MemberExpression::PrivateFieldExpression(it) => {
1590                visitor.visit_private_field_expression(it)
1591            }
1592        }
1593    }
1594
1595    #[inline]
1596    pub fn walk_computed_member_expression<'a, V: Visit<'a>>(
1597        visitor: &mut V,
1598        it: &ComputedMemberExpression<'a>,
1599    ) {
1600        let kind = AstKind::ComputedMemberExpression(visitor.alloc(it));
1601        visitor.enter_node(kind);
1602        visitor.visit_span(&it.span);
1603        visitor.visit_expression(&it.object);
1604        visitor.visit_expression(&it.expression);
1605        visitor.leave_node(kind);
1606    }
1607
1608    #[inline]
1609    pub fn walk_static_member_expression<'a, V: Visit<'a>>(
1610        visitor: &mut V,
1611        it: &StaticMemberExpression<'a>,
1612    ) {
1613        let kind = AstKind::StaticMemberExpression(visitor.alloc(it));
1614        visitor.enter_node(kind);
1615        visitor.visit_span(&it.span);
1616        visitor.visit_expression(&it.object);
1617        visitor.visit_identifier_name(&it.property);
1618        visitor.leave_node(kind);
1619    }
1620
1621    #[inline]
1622    pub fn walk_private_field_expression<'a, V: Visit<'a>>(
1623        visitor: &mut V,
1624        it: &PrivateFieldExpression<'a>,
1625    ) {
1626        let kind = AstKind::PrivateFieldExpression(visitor.alloc(it));
1627        visitor.enter_node(kind);
1628        visitor.visit_span(&it.span);
1629        visitor.visit_expression(&it.object);
1630        visitor.visit_private_identifier(&it.field);
1631        visitor.leave_node(kind);
1632    }
1633
1634    #[inline]
1635    pub fn walk_call_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &CallExpression<'a>) {
1636        let kind = AstKind::CallExpression(visitor.alloc(it));
1637        visitor.enter_node(kind);
1638        visitor.visit_span(&it.span);
1639        visitor.visit_expression(&it.callee);
1640        if let Some(type_arguments) = &it.type_arguments {
1641            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1642        }
1643        visitor.visit_arguments(&it.arguments);
1644        visitor.leave_node(kind);
1645    }
1646
1647    #[inline]
1648    pub fn walk_new_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &NewExpression<'a>) {
1649        let kind = AstKind::NewExpression(visitor.alloc(it));
1650        visitor.enter_node(kind);
1651        visitor.visit_span(&it.span);
1652        visitor.visit_expression(&it.callee);
1653        if let Some(type_arguments) = &it.type_arguments {
1654            visitor.visit_ts_type_parameter_instantiation(type_arguments);
1655        }
1656        visitor.visit_arguments(&it.arguments);
1657        visitor.leave_node(kind);
1658    }
1659
1660    #[inline]
1661    pub fn walk_meta_property<'a, V: Visit<'a>>(visitor: &mut V, it: &MetaProperty<'a>) {
1662        let kind = AstKind::MetaProperty(visitor.alloc(it));
1663        visitor.enter_node(kind);
1664        visitor.visit_span(&it.span);
1665        visitor.visit_identifier_name(&it.meta);
1666        visitor.visit_identifier_name(&it.property);
1667        visitor.leave_node(kind);
1668    }
1669
1670    #[inline]
1671    pub fn walk_spread_element<'a, V: Visit<'a>>(visitor: &mut V, it: &SpreadElement<'a>) {
1672        let kind = AstKind::SpreadElement(visitor.alloc(it));
1673        visitor.enter_node(kind);
1674        visitor.visit_span(&it.span);
1675        visitor.visit_expression(&it.argument);
1676        visitor.leave_node(kind);
1677    }
1678
1679    #[inline]
1680    pub fn walk_argument<'a, V: Visit<'a>>(visitor: &mut V, it: &Argument<'a>) {
1681        let kind = AstKind::Argument(visitor.alloc(it));
1682        visitor.enter_node(kind);
1683        match it {
1684            Argument::SpreadElement(it) => visitor.visit_spread_element(it),
1685            match_expression!(Argument) => visitor.visit_expression(it.to_expression()),
1686        }
1687        visitor.leave_node(kind);
1688    }
1689
1690    #[inline]
1691    pub fn walk_update_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &UpdateExpression<'a>) {
1692        let kind = AstKind::UpdateExpression(visitor.alloc(it));
1693        visitor.enter_node(kind);
1694        visitor.visit_span(&it.span);
1695        visitor.visit_simple_assignment_target(&it.argument);
1696        visitor.leave_node(kind);
1697    }
1698
1699    #[inline]
1700    pub fn walk_unary_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &UnaryExpression<'a>) {
1701        let kind = AstKind::UnaryExpression(visitor.alloc(it));
1702        visitor.enter_node(kind);
1703        visitor.visit_span(&it.span);
1704        visitor.visit_expression(&it.argument);
1705        visitor.leave_node(kind);
1706    }
1707
1708    #[inline]
1709    pub fn walk_binary_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &BinaryExpression<'a>) {
1710        let kind = AstKind::BinaryExpression(visitor.alloc(it));
1711        visitor.enter_node(kind);
1712        visitor.visit_span(&it.span);
1713        visitor.visit_expression(&it.left);
1714        visitor.visit_expression(&it.right);
1715        visitor.leave_node(kind);
1716    }
1717
1718    #[inline]
1719    pub fn walk_private_in_expression<'a, V: Visit<'a>>(
1720        visitor: &mut V,
1721        it: &PrivateInExpression<'a>,
1722    ) {
1723        let kind = AstKind::PrivateInExpression(visitor.alloc(it));
1724        visitor.enter_node(kind);
1725        visitor.visit_span(&it.span);
1726        visitor.visit_private_identifier(&it.left);
1727        visitor.visit_expression(&it.right);
1728        visitor.leave_node(kind);
1729    }
1730
1731    #[inline]
1732    pub fn walk_logical_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &LogicalExpression<'a>) {
1733        let kind = AstKind::LogicalExpression(visitor.alloc(it));
1734        visitor.enter_node(kind);
1735        visitor.visit_span(&it.span);
1736        visitor.visit_expression(&it.left);
1737        visitor.visit_expression(&it.right);
1738        visitor.leave_node(kind);
1739    }
1740
1741    #[inline]
1742    pub fn walk_conditional_expression<'a, V: Visit<'a>>(
1743        visitor: &mut V,
1744        it: &ConditionalExpression<'a>,
1745    ) {
1746        let kind = AstKind::ConditionalExpression(visitor.alloc(it));
1747        visitor.enter_node(kind);
1748        visitor.visit_span(&it.span);
1749        visitor.visit_expression(&it.test);
1750        visitor.visit_expression(&it.consequent);
1751        visitor.visit_expression(&it.alternate);
1752        visitor.leave_node(kind);
1753    }
1754
1755    #[inline]
1756    pub fn walk_assignment_expression<'a, V: Visit<'a>>(
1757        visitor: &mut V,
1758        it: &AssignmentExpression<'a>,
1759    ) {
1760        let kind = AstKind::AssignmentExpression(visitor.alloc(it));
1761        visitor.enter_node(kind);
1762        visitor.visit_span(&it.span);
1763        visitor.visit_assignment_target(&it.left);
1764        visitor.visit_expression(&it.right);
1765        visitor.leave_node(kind);
1766    }
1767
1768    #[inline]
1769    pub fn walk_assignment_target<'a, V: Visit<'a>>(visitor: &mut V, it: &AssignmentTarget<'a>) {
1770        // No `AstKind` for this type
1771        match it {
1772            match_simple_assignment_target!(AssignmentTarget) => {
1773                visitor.visit_simple_assignment_target(it.to_simple_assignment_target())
1774            }
1775            match_assignment_target_pattern!(AssignmentTarget) => {
1776                visitor.visit_assignment_target_pattern(it.to_assignment_target_pattern())
1777            }
1778        }
1779    }
1780
1781    pub fn walk_simple_assignment_target<'a, V: Visit<'a>>(
1782        visitor: &mut V,
1783        it: &SimpleAssignmentTarget<'a>,
1784    ) {
1785        // No `AstKind` for this type
1786        match it {
1787            SimpleAssignmentTarget::AssignmentTargetIdentifier(it) => {
1788                visitor.visit_identifier_reference(it)
1789            }
1790            SimpleAssignmentTarget::TSAsExpression(it) => visitor.visit_ts_as_expression(it),
1791            SimpleAssignmentTarget::TSSatisfiesExpression(it) => {
1792                visitor.visit_ts_satisfies_expression(it)
1793            }
1794            SimpleAssignmentTarget::TSNonNullExpression(it) => {
1795                visitor.visit_ts_non_null_expression(it)
1796            }
1797            SimpleAssignmentTarget::TSTypeAssertion(it) => visitor.visit_ts_type_assertion(it),
1798            match_member_expression!(SimpleAssignmentTarget) => {
1799                visitor.visit_member_expression(it.to_member_expression())
1800            }
1801        }
1802    }
1803
1804    #[inline]
1805    pub fn walk_assignment_target_pattern<'a, V: Visit<'a>>(
1806        visitor: &mut V,
1807        it: &AssignmentTargetPattern<'a>,
1808    ) {
1809        // No `AstKind` for this type
1810        match it {
1811            AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
1812                visitor.visit_array_assignment_target(it)
1813            }
1814            AssignmentTargetPattern::ObjectAssignmentTarget(it) => {
1815                visitor.visit_object_assignment_target(it)
1816            }
1817        }
1818    }
1819
1820    #[inline]
1821    pub fn walk_array_assignment_target<'a, V: Visit<'a>>(
1822        visitor: &mut V,
1823        it: &ArrayAssignmentTarget<'a>,
1824    ) {
1825        let kind = AstKind::ArrayAssignmentTarget(visitor.alloc(it));
1826        visitor.enter_node(kind);
1827        visitor.visit_span(&it.span);
1828        for el in it.elements.iter().flatten() {
1829            visitor.visit_assignment_target_maybe_default(el);
1830        }
1831        if let Some(rest) = &it.rest {
1832            visitor.visit_assignment_target_rest(rest);
1833        }
1834        visitor.leave_node(kind);
1835    }
1836
1837    #[inline]
1838    pub fn walk_object_assignment_target<'a, V: Visit<'a>>(
1839        visitor: &mut V,
1840        it: &ObjectAssignmentTarget<'a>,
1841    ) {
1842        let kind = AstKind::ObjectAssignmentTarget(visitor.alloc(it));
1843        visitor.enter_node(kind);
1844        visitor.visit_span(&it.span);
1845        visitor.visit_assignment_target_properties(&it.properties);
1846        if let Some(rest) = &it.rest {
1847            visitor.visit_assignment_target_rest(rest);
1848        }
1849        visitor.leave_node(kind);
1850    }
1851
1852    #[inline]
1853    pub fn walk_assignment_target_rest<'a, V: Visit<'a>>(
1854        visitor: &mut V,
1855        it: &AssignmentTargetRest<'a>,
1856    ) {
1857        let kind = AstKind::AssignmentTargetRest(visitor.alloc(it));
1858        visitor.enter_node(kind);
1859        visitor.visit_span(&it.span);
1860        visitor.visit_assignment_target(&it.target);
1861        visitor.leave_node(kind);
1862    }
1863
1864    #[inline]
1865    pub fn walk_assignment_target_maybe_default<'a, V: Visit<'a>>(
1866        visitor: &mut V,
1867        it: &AssignmentTargetMaybeDefault<'a>,
1868    ) {
1869        // No `AstKind` for this type
1870        match it {
1871            AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(it) => {
1872                visitor.visit_assignment_target_with_default(it)
1873            }
1874            match_assignment_target!(AssignmentTargetMaybeDefault) => {
1875                visitor.visit_assignment_target(it.to_assignment_target())
1876            }
1877        }
1878    }
1879
1880    #[inline]
1881    pub fn walk_assignment_target_with_default<'a, V: Visit<'a>>(
1882        visitor: &mut V,
1883        it: &AssignmentTargetWithDefault<'a>,
1884    ) {
1885        let kind = AstKind::AssignmentTargetWithDefault(visitor.alloc(it));
1886        visitor.enter_node(kind);
1887        visitor.visit_span(&it.span);
1888        visitor.visit_assignment_target(&it.binding);
1889        visitor.visit_expression(&it.init);
1890        visitor.leave_node(kind);
1891    }
1892
1893    #[inline]
1894    pub fn walk_assignment_target_property<'a, V: Visit<'a>>(
1895        visitor: &mut V,
1896        it: &AssignmentTargetProperty<'a>,
1897    ) {
1898        // No `AstKind` for this type
1899        match it {
1900            AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(it) => {
1901                visitor.visit_assignment_target_property_identifier(it)
1902            }
1903            AssignmentTargetProperty::AssignmentTargetPropertyProperty(it) => {
1904                visitor.visit_assignment_target_property_property(it)
1905            }
1906        }
1907    }
1908
1909    #[inline]
1910    pub fn walk_assignment_target_property_identifier<'a, V: Visit<'a>>(
1911        visitor: &mut V,
1912        it: &AssignmentTargetPropertyIdentifier<'a>,
1913    ) {
1914        let kind = AstKind::AssignmentTargetPropertyIdentifier(visitor.alloc(it));
1915        visitor.enter_node(kind);
1916        visitor.visit_span(&it.span);
1917        visitor.visit_identifier_reference(&it.binding);
1918        if let Some(init) = &it.init {
1919            visitor.visit_expression(init);
1920        }
1921        visitor.leave_node(kind);
1922    }
1923
1924    #[inline]
1925    pub fn walk_assignment_target_property_property<'a, V: Visit<'a>>(
1926        visitor: &mut V,
1927        it: &AssignmentTargetPropertyProperty<'a>,
1928    ) {
1929        let kind = AstKind::AssignmentTargetPropertyProperty(visitor.alloc(it));
1930        visitor.enter_node(kind);
1931        visitor.visit_span(&it.span);
1932        visitor.visit_property_key(&it.name);
1933        visitor.visit_assignment_target_maybe_default(&it.binding);
1934        visitor.leave_node(kind);
1935    }
1936
1937    #[inline]
1938    pub fn walk_sequence_expression<'a, V: Visit<'a>>(
1939        visitor: &mut V,
1940        it: &SequenceExpression<'a>,
1941    ) {
1942        let kind = AstKind::SequenceExpression(visitor.alloc(it));
1943        visitor.enter_node(kind);
1944        visitor.visit_span(&it.span);
1945        visitor.visit_expressions(&it.expressions);
1946        visitor.leave_node(kind);
1947    }
1948
1949    #[inline]
1950    pub fn walk_super<'a, V: Visit<'a>>(visitor: &mut V, it: &Super) {
1951        let kind = AstKind::Super(visitor.alloc(it));
1952        visitor.enter_node(kind);
1953        visitor.visit_span(&it.span);
1954        visitor.leave_node(kind);
1955    }
1956
1957    #[inline]
1958    pub fn walk_await_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &AwaitExpression<'a>) {
1959        let kind = AstKind::AwaitExpression(visitor.alloc(it));
1960        visitor.enter_node(kind);
1961        visitor.visit_span(&it.span);
1962        visitor.visit_expression(&it.argument);
1963        visitor.leave_node(kind);
1964    }
1965
1966    #[inline]
1967    pub fn walk_chain_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &ChainExpression<'a>) {
1968        let kind = AstKind::ChainExpression(visitor.alloc(it));
1969        visitor.enter_node(kind);
1970        visitor.visit_span(&it.span);
1971        visitor.visit_chain_element(&it.expression);
1972        visitor.leave_node(kind);
1973    }
1974
1975    #[inline]
1976    pub fn walk_chain_element<'a, V: Visit<'a>>(visitor: &mut V, it: &ChainElement<'a>) {
1977        // No `AstKind` for this type
1978        match it {
1979            ChainElement::CallExpression(it) => visitor.visit_call_expression(it),
1980            ChainElement::TSNonNullExpression(it) => visitor.visit_ts_non_null_expression(it),
1981            match_member_expression!(ChainElement) => {
1982                visitor.visit_member_expression(it.to_member_expression())
1983            }
1984        }
1985    }
1986
1987    #[inline]
1988    pub fn walk_parenthesized_expression<'a, V: Visit<'a>>(
1989        visitor: &mut V,
1990        it: &ParenthesizedExpression<'a>,
1991    ) {
1992        let kind = AstKind::ParenthesizedExpression(visitor.alloc(it));
1993        visitor.enter_node(kind);
1994        visitor.visit_span(&it.span);
1995        visitor.visit_expression(&it.expression);
1996        visitor.leave_node(kind);
1997    }
1998
1999    pub fn walk_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &Statement<'a>) {
2000        // No `AstKind` for this type
2001        match it {
2002            Statement::BlockStatement(it) => visitor.visit_block_statement(it),
2003            Statement::BreakStatement(it) => visitor.visit_break_statement(it),
2004            Statement::ContinueStatement(it) => visitor.visit_continue_statement(it),
2005            Statement::DebuggerStatement(it) => visitor.visit_debugger_statement(it),
2006            Statement::DoWhileStatement(it) => visitor.visit_do_while_statement(it),
2007            Statement::EmptyStatement(it) => visitor.visit_empty_statement(it),
2008            Statement::ExpressionStatement(it) => visitor.visit_expression_statement(it),
2009            Statement::ForInStatement(it) => visitor.visit_for_in_statement(it),
2010            Statement::ForOfStatement(it) => visitor.visit_for_of_statement(it),
2011            Statement::ForStatement(it) => visitor.visit_for_statement(it),
2012            Statement::IfStatement(it) => visitor.visit_if_statement(it),
2013            Statement::LabeledStatement(it) => visitor.visit_labeled_statement(it),
2014            Statement::ReturnStatement(it) => visitor.visit_return_statement(it),
2015            Statement::SwitchStatement(it) => visitor.visit_switch_statement(it),
2016            Statement::ThrowStatement(it) => visitor.visit_throw_statement(it),
2017            Statement::TryStatement(it) => visitor.visit_try_statement(it),
2018            Statement::WhileStatement(it) => visitor.visit_while_statement(it),
2019            Statement::WithStatement(it) => visitor.visit_with_statement(it),
2020            match_declaration!(Statement) => visitor.visit_declaration(it.to_declaration()),
2021            match_module_declaration!(Statement) => {
2022                visitor.visit_module_declaration(it.to_module_declaration())
2023            }
2024        }
2025    }
2026
2027    #[inline]
2028    pub fn walk_directive<'a, V: Visit<'a>>(visitor: &mut V, it: &Directive<'a>) {
2029        let kind = AstKind::Directive(visitor.alloc(it));
2030        visitor.enter_node(kind);
2031        visitor.visit_span(&it.span);
2032        visitor.visit_string_literal(&it.expression);
2033        visitor.leave_node(kind);
2034    }
2035
2036    #[inline]
2037    pub fn walk_hashbang<'a, V: Visit<'a>>(visitor: &mut V, it: &Hashbang<'a>) {
2038        let kind = AstKind::Hashbang(visitor.alloc(it));
2039        visitor.enter_node(kind);
2040        visitor.visit_span(&it.span);
2041        visitor.leave_node(kind);
2042    }
2043
2044    #[inline]
2045    pub fn walk_block_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &BlockStatement<'a>) {
2046        let kind = AstKind::BlockStatement(visitor.alloc(it));
2047        visitor.enter_node(kind);
2048        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2049        visitor.visit_span(&it.span);
2050        visitor.visit_statements(&it.body);
2051        visitor.leave_scope();
2052        visitor.leave_node(kind);
2053    }
2054
2055    pub fn walk_declaration<'a, V: Visit<'a>>(visitor: &mut V, it: &Declaration<'a>) {
2056        // No `AstKind` for this type
2057        match it {
2058            Declaration::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2059            Declaration::FunctionDeclaration(it) => {
2060                let flags = ScopeFlags::Function;
2061                visitor.visit_function(it, flags)
2062            }
2063            Declaration::ClassDeclaration(it) => visitor.visit_class(it),
2064            Declaration::TSTypeAliasDeclaration(it) => visitor.visit_ts_type_alias_declaration(it),
2065            Declaration::TSInterfaceDeclaration(it) => visitor.visit_ts_interface_declaration(it),
2066            Declaration::TSEnumDeclaration(it) => visitor.visit_ts_enum_declaration(it),
2067            Declaration::TSModuleDeclaration(it) => visitor.visit_ts_module_declaration(it),
2068            Declaration::TSImportEqualsDeclaration(it) => {
2069                visitor.visit_ts_import_equals_declaration(it)
2070            }
2071        }
2072    }
2073
2074    #[inline]
2075    pub fn walk_variable_declaration<'a, V: Visit<'a>>(
2076        visitor: &mut V,
2077        it: &VariableDeclaration<'a>,
2078    ) {
2079        let kind = AstKind::VariableDeclaration(visitor.alloc(it));
2080        visitor.enter_node(kind);
2081        visitor.visit_span(&it.span);
2082        visitor.visit_variable_declarators(&it.declarations);
2083        visitor.leave_node(kind);
2084    }
2085
2086    #[inline]
2087    pub fn walk_variable_declarator<'a, V: Visit<'a>>(
2088        visitor: &mut V,
2089        it: &VariableDeclarator<'a>,
2090    ) {
2091        let kind = AstKind::VariableDeclarator(visitor.alloc(it));
2092        visitor.enter_node(kind);
2093        visitor.visit_span(&it.span);
2094        visitor.visit_binding_pattern(&it.id);
2095        if let Some(init) = &it.init {
2096            visitor.visit_expression(init);
2097        }
2098        visitor.leave_node(kind);
2099    }
2100
2101    #[inline]
2102    pub fn walk_empty_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &EmptyStatement) {
2103        let kind = AstKind::EmptyStatement(visitor.alloc(it));
2104        visitor.enter_node(kind);
2105        visitor.visit_span(&it.span);
2106        visitor.leave_node(kind);
2107    }
2108
2109    #[inline]
2110    pub fn walk_expression_statement<'a, V: Visit<'a>>(
2111        visitor: &mut V,
2112        it: &ExpressionStatement<'a>,
2113    ) {
2114        let kind = AstKind::ExpressionStatement(visitor.alloc(it));
2115        visitor.enter_node(kind);
2116        visitor.visit_span(&it.span);
2117        visitor.visit_expression(&it.expression);
2118        visitor.leave_node(kind);
2119    }
2120
2121    #[inline]
2122    pub fn walk_if_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &IfStatement<'a>) {
2123        let kind = AstKind::IfStatement(visitor.alloc(it));
2124        visitor.enter_node(kind);
2125        visitor.visit_span(&it.span);
2126        visitor.visit_expression(&it.test);
2127        visitor.visit_statement(&it.consequent);
2128        if let Some(alternate) = &it.alternate {
2129            visitor.visit_statement(alternate);
2130        }
2131        visitor.leave_node(kind);
2132    }
2133
2134    #[inline]
2135    pub fn walk_do_while_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &DoWhileStatement<'a>) {
2136        let kind = AstKind::DoWhileStatement(visitor.alloc(it));
2137        visitor.enter_node(kind);
2138        visitor.visit_span(&it.span);
2139        visitor.visit_statement(&it.body);
2140        visitor.visit_expression(&it.test);
2141        visitor.leave_node(kind);
2142    }
2143
2144    #[inline]
2145    pub fn walk_while_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &WhileStatement<'a>) {
2146        let kind = AstKind::WhileStatement(visitor.alloc(it));
2147        visitor.enter_node(kind);
2148        visitor.visit_span(&it.span);
2149        visitor.visit_expression(&it.test);
2150        visitor.visit_statement(&it.body);
2151        visitor.leave_node(kind);
2152    }
2153
2154    #[inline]
2155    pub fn walk_for_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ForStatement<'a>) {
2156        let kind = AstKind::ForStatement(visitor.alloc(it));
2157        visitor.enter_node(kind);
2158        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2159        visitor.visit_span(&it.span);
2160        if let Some(init) = &it.init {
2161            visitor.visit_for_statement_init(init);
2162        }
2163        if let Some(test) = &it.test {
2164            visitor.visit_expression(test);
2165        }
2166        if let Some(update) = &it.update {
2167            visitor.visit_expression(update);
2168        }
2169        visitor.visit_statement(&it.body);
2170        visitor.leave_scope();
2171        visitor.leave_node(kind);
2172    }
2173
2174    #[inline]
2175    pub fn walk_for_statement_init<'a, V: Visit<'a>>(visitor: &mut V, it: &ForStatementInit<'a>) {
2176        // No `AstKind` for this type
2177        match it {
2178            ForStatementInit::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2179            match_expression!(ForStatementInit) => visitor.visit_expression(it.to_expression()),
2180        }
2181    }
2182
2183    #[inline]
2184    pub fn walk_for_in_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ForInStatement<'a>) {
2185        let kind = AstKind::ForInStatement(visitor.alloc(it));
2186        visitor.enter_node(kind);
2187        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2188        visitor.visit_span(&it.span);
2189        visitor.visit_for_statement_left(&it.left);
2190        visitor.visit_expression(&it.right);
2191        visitor.visit_statement(&it.body);
2192        visitor.leave_scope();
2193        visitor.leave_node(kind);
2194    }
2195
2196    #[inline]
2197    pub fn walk_for_statement_left<'a, V: Visit<'a>>(visitor: &mut V, it: &ForStatementLeft<'a>) {
2198        // No `AstKind` for this type
2199        match it {
2200            ForStatementLeft::VariableDeclaration(it) => visitor.visit_variable_declaration(it),
2201            match_assignment_target!(ForStatementLeft) => {
2202                visitor.visit_assignment_target(it.to_assignment_target())
2203            }
2204        }
2205    }
2206
2207    #[inline]
2208    pub fn walk_for_of_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ForOfStatement<'a>) {
2209        let kind = AstKind::ForOfStatement(visitor.alloc(it));
2210        visitor.enter_node(kind);
2211        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2212        visitor.visit_span(&it.span);
2213        visitor.visit_for_statement_left(&it.left);
2214        visitor.visit_expression(&it.right);
2215        visitor.visit_statement(&it.body);
2216        visitor.leave_scope();
2217        visitor.leave_node(kind);
2218    }
2219
2220    #[inline]
2221    pub fn walk_continue_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ContinueStatement<'a>) {
2222        let kind = AstKind::ContinueStatement(visitor.alloc(it));
2223        visitor.enter_node(kind);
2224        visitor.visit_span(&it.span);
2225        if let Some(label) = &it.label {
2226            visitor.visit_label_identifier(label);
2227        }
2228        visitor.leave_node(kind);
2229    }
2230
2231    #[inline]
2232    pub fn walk_break_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &BreakStatement<'a>) {
2233        let kind = AstKind::BreakStatement(visitor.alloc(it));
2234        visitor.enter_node(kind);
2235        visitor.visit_span(&it.span);
2236        if let Some(label) = &it.label {
2237            visitor.visit_label_identifier(label);
2238        }
2239        visitor.leave_node(kind);
2240    }
2241
2242    #[inline]
2243    pub fn walk_return_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ReturnStatement<'a>) {
2244        let kind = AstKind::ReturnStatement(visitor.alloc(it));
2245        visitor.enter_node(kind);
2246        visitor.visit_span(&it.span);
2247        if let Some(argument) = &it.argument {
2248            visitor.visit_expression(argument);
2249        }
2250        visitor.leave_node(kind);
2251    }
2252
2253    #[inline]
2254    pub fn walk_with_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &WithStatement<'a>) {
2255        let kind = AstKind::WithStatement(visitor.alloc(it));
2256        visitor.enter_node(kind);
2257        visitor.visit_span(&it.span);
2258        visitor.visit_expression(&it.object);
2259        visitor.visit_statement(&it.body);
2260        visitor.leave_node(kind);
2261    }
2262
2263    #[inline]
2264    pub fn walk_switch_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &SwitchStatement<'a>) {
2265        let kind = AstKind::SwitchStatement(visitor.alloc(it));
2266        visitor.enter_node(kind);
2267        visitor.visit_span(&it.span);
2268        visitor.visit_expression(&it.discriminant);
2269        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
2270        visitor.visit_switch_cases(&it.cases);
2271        visitor.leave_scope();
2272        visitor.leave_node(kind);
2273    }
2274
2275    #[inline]
2276    pub fn walk_switch_case<'a, V: Visit<'a>>(visitor: &mut V, it: &SwitchCase<'a>) {
2277        let kind = AstKind::SwitchCase(visitor.alloc(it));
2278        visitor.enter_node(kind);
2279        visitor.visit_span(&it.span);
2280        if let Some(test) = &it.test {
2281            visitor.visit_expression(test);
2282        }
2283        visitor.visit_statements(&it.consequent);
2284        visitor.leave_node(kind);
2285    }
2286
2287    #[inline]
2288    pub fn walk_labeled_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &LabeledStatement<'a>) {
2289        let kind = AstKind::LabeledStatement(visitor.alloc(it));
2290        visitor.enter_node(kind);
2291        visitor.visit_span(&it.span);
2292        visitor.visit_label_identifier(&it.label);
2293        visitor.visit_statement(&it.body);
2294        visitor.leave_node(kind);
2295    }
2296
2297    #[inline]
2298    pub fn walk_throw_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &ThrowStatement<'a>) {
2299        let kind = AstKind::ThrowStatement(visitor.alloc(it));
2300        visitor.enter_node(kind);
2301        visitor.visit_span(&it.span);
2302        visitor.visit_expression(&it.argument);
2303        visitor.leave_node(kind);
2304    }
2305
2306    #[inline]
2307    pub fn walk_try_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &TryStatement<'a>) {
2308        let kind = AstKind::TryStatement(visitor.alloc(it));
2309        visitor.enter_node(kind);
2310        visitor.visit_span(&it.span);
2311        visitor.visit_block_statement(&it.block);
2312        if let Some(handler) = &it.handler {
2313            visitor.visit_catch_clause(handler);
2314        }
2315        if let Some(finalizer) = &it.finalizer {
2316            visitor.visit_block_statement(finalizer);
2317        }
2318        visitor.leave_node(kind);
2319    }
2320
2321    #[inline]
2322    pub fn walk_catch_clause<'a, V: Visit<'a>>(visitor: &mut V, it: &CatchClause<'a>) {
2323        let kind = AstKind::CatchClause(visitor.alloc(it));
2324        visitor.enter_node(kind);
2325        visitor.enter_scope(ScopeFlags::CatchClause, &it.scope_id);
2326        visitor.visit_span(&it.span);
2327        if let Some(param) = &it.param {
2328            visitor.visit_catch_parameter(param);
2329        }
2330        visitor.visit_block_statement(&it.body);
2331        visitor.leave_scope();
2332        visitor.leave_node(kind);
2333    }
2334
2335    #[inline]
2336    pub fn walk_catch_parameter<'a, V: Visit<'a>>(visitor: &mut V, it: &CatchParameter<'a>) {
2337        let kind = AstKind::CatchParameter(visitor.alloc(it));
2338        visitor.enter_node(kind);
2339        visitor.visit_span(&it.span);
2340        visitor.visit_binding_pattern(&it.pattern);
2341        visitor.leave_node(kind);
2342    }
2343
2344    #[inline]
2345    pub fn walk_debugger_statement<'a, V: Visit<'a>>(visitor: &mut V, it: &DebuggerStatement) {
2346        let kind = AstKind::DebuggerStatement(visitor.alloc(it));
2347        visitor.enter_node(kind);
2348        visitor.visit_span(&it.span);
2349        visitor.leave_node(kind);
2350    }
2351
2352    #[inline]
2353    pub fn walk_binding_pattern<'a, V: Visit<'a>>(visitor: &mut V, it: &BindingPattern<'a>) {
2354        // No `AstKind` for this type
2355        visitor.visit_binding_pattern_kind(&it.kind);
2356        if let Some(type_annotation) = &it.type_annotation {
2357            visitor.visit_ts_type_annotation(type_annotation);
2358        }
2359    }
2360
2361    #[inline]
2362    pub fn walk_binding_pattern_kind<'a, V: Visit<'a>>(
2363        visitor: &mut V,
2364        it: &BindingPatternKind<'a>,
2365    ) {
2366        // No `AstKind` for this type
2367        match it {
2368            BindingPatternKind::BindingIdentifier(it) => visitor.visit_binding_identifier(it),
2369            BindingPatternKind::ObjectPattern(it) => visitor.visit_object_pattern(it),
2370            BindingPatternKind::ArrayPattern(it) => visitor.visit_array_pattern(it),
2371            BindingPatternKind::AssignmentPattern(it) => visitor.visit_assignment_pattern(it),
2372        }
2373    }
2374
2375    #[inline]
2376    pub fn walk_assignment_pattern<'a, V: Visit<'a>>(visitor: &mut V, it: &AssignmentPattern<'a>) {
2377        let kind = AstKind::AssignmentPattern(visitor.alloc(it));
2378        visitor.enter_node(kind);
2379        visitor.visit_span(&it.span);
2380        visitor.visit_binding_pattern(&it.left);
2381        visitor.visit_expression(&it.right);
2382        visitor.leave_node(kind);
2383    }
2384
2385    #[inline]
2386    pub fn walk_object_pattern<'a, V: Visit<'a>>(visitor: &mut V, it: &ObjectPattern<'a>) {
2387        let kind = AstKind::ObjectPattern(visitor.alloc(it));
2388        visitor.enter_node(kind);
2389        visitor.visit_span(&it.span);
2390        visitor.visit_binding_properties(&it.properties);
2391        if let Some(rest) = &it.rest {
2392            visitor.visit_binding_rest_element(rest);
2393        }
2394        visitor.leave_node(kind);
2395    }
2396
2397    #[inline]
2398    pub fn walk_binding_property<'a, V: Visit<'a>>(visitor: &mut V, it: &BindingProperty<'a>) {
2399        let kind = AstKind::BindingProperty(visitor.alloc(it));
2400        visitor.enter_node(kind);
2401        visitor.visit_span(&it.span);
2402        visitor.visit_property_key(&it.key);
2403        visitor.visit_binding_pattern(&it.value);
2404        visitor.leave_node(kind);
2405    }
2406
2407    #[inline]
2408    pub fn walk_array_pattern<'a, V: Visit<'a>>(visitor: &mut V, it: &ArrayPattern<'a>) {
2409        let kind = AstKind::ArrayPattern(visitor.alloc(it));
2410        visitor.enter_node(kind);
2411        visitor.visit_span(&it.span);
2412        for el in it.elements.iter().flatten() {
2413            visitor.visit_binding_pattern(el);
2414        }
2415        if let Some(rest) = &it.rest {
2416            visitor.visit_binding_rest_element(rest);
2417        }
2418        visitor.leave_node(kind);
2419    }
2420
2421    #[inline]
2422    pub fn walk_binding_rest_element<'a, V: Visit<'a>>(
2423        visitor: &mut V,
2424        it: &BindingRestElement<'a>,
2425    ) {
2426        let kind = AstKind::BindingRestElement(visitor.alloc(it));
2427        visitor.enter_node(kind);
2428        visitor.visit_span(&it.span);
2429        visitor.visit_binding_pattern(&it.argument);
2430        visitor.leave_node(kind);
2431    }
2432
2433    pub fn walk_function<'a, V: Visit<'a>>(visitor: &mut V, it: &Function<'a>, flags: ScopeFlags) {
2434        let kind = AstKind::Function(visitor.alloc(it));
2435        visitor.enter_node(kind);
2436        visitor.enter_scope(
2437            {
2438                let mut flags = flags;
2439                if it.has_use_strict_directive() {
2440                    flags |= ScopeFlags::StrictMode;
2441                }
2442                flags
2443            },
2444            &it.scope_id,
2445        );
2446        visitor.visit_span(&it.span);
2447        if let Some(id) = &it.id {
2448            visitor.visit_binding_identifier(id);
2449        }
2450        if let Some(type_parameters) = &it.type_parameters {
2451            visitor.visit_ts_type_parameter_declaration(type_parameters);
2452        }
2453        if let Some(this_param) = &it.this_param {
2454            visitor.visit_ts_this_parameter(this_param);
2455        }
2456        visitor.visit_formal_parameters(&it.params);
2457        if let Some(return_type) = &it.return_type {
2458            visitor.visit_ts_type_annotation(return_type);
2459        }
2460        if let Some(body) = &it.body {
2461            visitor.visit_function_body(body);
2462        }
2463        visitor.leave_scope();
2464        visitor.leave_node(kind);
2465    }
2466
2467    #[inline]
2468    pub fn walk_formal_parameters<'a, V: Visit<'a>>(visitor: &mut V, it: &FormalParameters<'a>) {
2469        let kind = AstKind::FormalParameters(visitor.alloc(it));
2470        visitor.enter_node(kind);
2471        visitor.visit_span(&it.span);
2472        visitor.visit_formal_parameter_list(&it.items);
2473        if let Some(rest) = &it.rest {
2474            visitor.visit_binding_rest_element(rest);
2475        }
2476        visitor.leave_node(kind);
2477    }
2478
2479    #[inline]
2480    pub fn walk_formal_parameter<'a, V: Visit<'a>>(visitor: &mut V, it: &FormalParameter<'a>) {
2481        let kind = AstKind::FormalParameter(visitor.alloc(it));
2482        visitor.enter_node(kind);
2483        visitor.visit_span(&it.span);
2484        visitor.visit_decorators(&it.decorators);
2485        visitor.visit_binding_pattern(&it.pattern);
2486        visitor.leave_node(kind);
2487    }
2488
2489    #[inline]
2490    pub fn walk_function_body<'a, V: Visit<'a>>(visitor: &mut V, it: &FunctionBody<'a>) {
2491        let kind = AstKind::FunctionBody(visitor.alloc(it));
2492        visitor.enter_node(kind);
2493        visitor.visit_span(&it.span);
2494        visitor.visit_directives(&it.directives);
2495        visitor.visit_statements(&it.statements);
2496        visitor.leave_node(kind);
2497    }
2498
2499    #[inline]
2500    pub fn walk_arrow_function_expression<'a, V: Visit<'a>>(
2501        visitor: &mut V,
2502        it: &ArrowFunctionExpression<'a>,
2503    ) {
2504        let kind = AstKind::ArrowFunctionExpression(visitor.alloc(it));
2505        visitor.enter_node(kind);
2506        visitor.enter_scope(
2507            {
2508                let mut flags = ScopeFlags::Function | ScopeFlags::Arrow;
2509                if it.has_use_strict_directive() {
2510                    flags |= ScopeFlags::StrictMode;
2511                }
2512                flags
2513            },
2514            &it.scope_id,
2515        );
2516        visitor.visit_span(&it.span);
2517        if let Some(type_parameters) = &it.type_parameters {
2518            visitor.visit_ts_type_parameter_declaration(type_parameters);
2519        }
2520        visitor.visit_formal_parameters(&it.params);
2521        if let Some(return_type) = &it.return_type {
2522            visitor.visit_ts_type_annotation(return_type);
2523        }
2524        visitor.visit_function_body(&it.body);
2525        visitor.leave_scope();
2526        visitor.leave_node(kind);
2527    }
2528
2529    #[inline]
2530    pub fn walk_yield_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &YieldExpression<'a>) {
2531        let kind = AstKind::YieldExpression(visitor.alloc(it));
2532        visitor.enter_node(kind);
2533        visitor.visit_span(&it.span);
2534        if let Some(argument) = &it.argument {
2535            visitor.visit_expression(argument);
2536        }
2537        visitor.leave_node(kind);
2538    }
2539
2540    pub fn walk_class<'a, V: Visit<'a>>(visitor: &mut V, it: &Class<'a>) {
2541        let kind = AstKind::Class(visitor.alloc(it));
2542        visitor.enter_node(kind);
2543        visitor.visit_span(&it.span);
2544        visitor.visit_decorators(&it.decorators);
2545        if let Some(id) = &it.id {
2546            visitor.visit_binding_identifier(id);
2547        }
2548        visitor.enter_scope(ScopeFlags::StrictMode, &it.scope_id);
2549        if let Some(type_parameters) = &it.type_parameters {
2550            visitor.visit_ts_type_parameter_declaration(type_parameters);
2551        }
2552        if let Some(super_class) = &it.super_class {
2553            visitor.visit_expression(super_class);
2554        }
2555        if let Some(super_type_arguments) = &it.super_type_arguments {
2556            visitor.visit_ts_type_parameter_instantiation(super_type_arguments);
2557        }
2558        visitor.visit_ts_class_implements_list(&it.implements);
2559        visitor.visit_class_body(&it.body);
2560        visitor.leave_scope();
2561        visitor.leave_node(kind);
2562    }
2563
2564    #[inline]
2565    pub fn walk_class_body<'a, V: Visit<'a>>(visitor: &mut V, it: &ClassBody<'a>) {
2566        let kind = AstKind::ClassBody(visitor.alloc(it));
2567        visitor.enter_node(kind);
2568        visitor.visit_span(&it.span);
2569        visitor.visit_class_elements(&it.body);
2570        visitor.leave_node(kind);
2571    }
2572
2573    #[inline]
2574    pub fn walk_class_element<'a, V: Visit<'a>>(visitor: &mut V, it: &ClassElement<'a>) {
2575        // No `AstKind` for this type
2576        match it {
2577            ClassElement::StaticBlock(it) => visitor.visit_static_block(it),
2578            ClassElement::MethodDefinition(it) => visitor.visit_method_definition(it),
2579            ClassElement::PropertyDefinition(it) => visitor.visit_property_definition(it),
2580            ClassElement::AccessorProperty(it) => visitor.visit_accessor_property(it),
2581            ClassElement::TSIndexSignature(it) => visitor.visit_ts_index_signature(it),
2582        }
2583    }
2584
2585    #[inline]
2586    pub fn walk_method_definition<'a, V: Visit<'a>>(visitor: &mut V, it: &MethodDefinition<'a>) {
2587        let kind = AstKind::MethodDefinition(visitor.alloc(it));
2588        visitor.enter_node(kind);
2589        visitor.visit_span(&it.span);
2590        visitor.visit_decorators(&it.decorators);
2591        visitor.visit_property_key(&it.key);
2592        {
2593            let flags = match it.kind {
2594                MethodDefinitionKind::Get => ScopeFlags::Function | ScopeFlags::GetAccessor,
2595                MethodDefinitionKind::Set => ScopeFlags::Function | ScopeFlags::SetAccessor,
2596                MethodDefinitionKind::Constructor => ScopeFlags::Function | ScopeFlags::Constructor,
2597                MethodDefinitionKind::Method => ScopeFlags::Function,
2598            };
2599            visitor.visit_function(&it.value, flags);
2600        }
2601        visitor.leave_node(kind);
2602    }
2603
2604    #[inline]
2605    pub fn walk_property_definition<'a, V: Visit<'a>>(
2606        visitor: &mut V,
2607        it: &PropertyDefinition<'a>,
2608    ) {
2609        let kind = AstKind::PropertyDefinition(visitor.alloc(it));
2610        visitor.enter_node(kind);
2611        visitor.visit_span(&it.span);
2612        visitor.visit_decorators(&it.decorators);
2613        visitor.visit_property_key(&it.key);
2614        if let Some(type_annotation) = &it.type_annotation {
2615            visitor.visit_ts_type_annotation(type_annotation);
2616        }
2617        if let Some(value) = &it.value {
2618            visitor.visit_expression(value);
2619        }
2620        visitor.leave_node(kind);
2621    }
2622
2623    #[inline]
2624    pub fn walk_private_identifier<'a, V: Visit<'a>>(visitor: &mut V, it: &PrivateIdentifier<'a>) {
2625        let kind = AstKind::PrivateIdentifier(visitor.alloc(it));
2626        visitor.enter_node(kind);
2627        visitor.visit_span(&it.span);
2628        visitor.leave_node(kind);
2629    }
2630
2631    #[inline]
2632    pub fn walk_static_block<'a, V: Visit<'a>>(visitor: &mut V, it: &StaticBlock<'a>) {
2633        let kind = AstKind::StaticBlock(visitor.alloc(it));
2634        visitor.enter_node(kind);
2635        visitor.enter_scope(ScopeFlags::ClassStaticBlock, &it.scope_id);
2636        visitor.visit_span(&it.span);
2637        visitor.visit_statements(&it.body);
2638        visitor.leave_scope();
2639        visitor.leave_node(kind);
2640    }
2641
2642    pub fn walk_module_declaration<'a, V: Visit<'a>>(visitor: &mut V, it: &ModuleDeclaration<'a>) {
2643        // No `AstKind` for this type
2644        match it {
2645            ModuleDeclaration::ImportDeclaration(it) => visitor.visit_import_declaration(it),
2646            ModuleDeclaration::ExportAllDeclaration(it) => visitor.visit_export_all_declaration(it),
2647            ModuleDeclaration::ExportDefaultDeclaration(it) => {
2648                visitor.visit_export_default_declaration(it)
2649            }
2650            ModuleDeclaration::ExportNamedDeclaration(it) => {
2651                visitor.visit_export_named_declaration(it)
2652            }
2653            ModuleDeclaration::TSExportAssignment(it) => visitor.visit_ts_export_assignment(it),
2654            ModuleDeclaration::TSNamespaceExportDeclaration(it) => {
2655                visitor.visit_ts_namespace_export_declaration(it)
2656            }
2657        }
2658    }
2659
2660    #[inline]
2661    pub fn walk_accessor_property<'a, V: Visit<'a>>(visitor: &mut V, it: &AccessorProperty<'a>) {
2662        let kind = AstKind::AccessorProperty(visitor.alloc(it));
2663        visitor.enter_node(kind);
2664        visitor.visit_span(&it.span);
2665        visitor.visit_decorators(&it.decorators);
2666        visitor.visit_property_key(&it.key);
2667        if let Some(type_annotation) = &it.type_annotation {
2668            visitor.visit_ts_type_annotation(type_annotation);
2669        }
2670        if let Some(value) = &it.value {
2671            visitor.visit_expression(value);
2672        }
2673        visitor.leave_node(kind);
2674    }
2675
2676    #[inline]
2677    pub fn walk_import_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &ImportExpression<'a>) {
2678        let kind = AstKind::ImportExpression(visitor.alloc(it));
2679        visitor.enter_node(kind);
2680        visitor.visit_span(&it.span);
2681        visitor.visit_expression(&it.source);
2682        if let Some(options) = &it.options {
2683            visitor.visit_expression(options);
2684        }
2685        visitor.leave_node(kind);
2686    }
2687
2688    #[inline]
2689    pub fn walk_import_declaration<'a, V: Visit<'a>>(visitor: &mut V, it: &ImportDeclaration<'a>) {
2690        let kind = AstKind::ImportDeclaration(visitor.alloc(it));
2691        visitor.enter_node(kind);
2692        visitor.visit_span(&it.span);
2693        if let Some(specifiers) = &it.specifiers {
2694            visitor.visit_import_declaration_specifiers(specifiers);
2695        }
2696        visitor.visit_string_literal(&it.source);
2697        if let Some(with_clause) = &it.with_clause {
2698            visitor.visit_with_clause(with_clause);
2699        }
2700        visitor.leave_node(kind);
2701    }
2702
2703    #[inline]
2704    pub fn walk_import_declaration_specifier<'a, V: Visit<'a>>(
2705        visitor: &mut V,
2706        it: &ImportDeclarationSpecifier<'a>,
2707    ) {
2708        // No `AstKind` for this type
2709        match it {
2710            ImportDeclarationSpecifier::ImportSpecifier(it) => visitor.visit_import_specifier(it),
2711            ImportDeclarationSpecifier::ImportDefaultSpecifier(it) => {
2712                visitor.visit_import_default_specifier(it)
2713            }
2714            ImportDeclarationSpecifier::ImportNamespaceSpecifier(it) => {
2715                visitor.visit_import_namespace_specifier(it)
2716            }
2717        }
2718    }
2719
2720    #[inline]
2721    pub fn walk_import_specifier<'a, V: Visit<'a>>(visitor: &mut V, it: &ImportSpecifier<'a>) {
2722        let kind = AstKind::ImportSpecifier(visitor.alloc(it));
2723        visitor.enter_node(kind);
2724        visitor.visit_span(&it.span);
2725        visitor.visit_module_export_name(&it.imported);
2726        visitor.visit_binding_identifier(&it.local);
2727        visitor.leave_node(kind);
2728    }
2729
2730    #[inline]
2731    pub fn walk_import_default_specifier<'a, V: Visit<'a>>(
2732        visitor: &mut V,
2733        it: &ImportDefaultSpecifier<'a>,
2734    ) {
2735        let kind = AstKind::ImportDefaultSpecifier(visitor.alloc(it));
2736        visitor.enter_node(kind);
2737        visitor.visit_span(&it.span);
2738        visitor.visit_binding_identifier(&it.local);
2739        visitor.leave_node(kind);
2740    }
2741
2742    #[inline]
2743    pub fn walk_import_namespace_specifier<'a, V: Visit<'a>>(
2744        visitor: &mut V,
2745        it: &ImportNamespaceSpecifier<'a>,
2746    ) {
2747        let kind = AstKind::ImportNamespaceSpecifier(visitor.alloc(it));
2748        visitor.enter_node(kind);
2749        visitor.visit_span(&it.span);
2750        visitor.visit_binding_identifier(&it.local);
2751        visitor.leave_node(kind);
2752    }
2753
2754    #[inline]
2755    pub fn walk_with_clause<'a, V: Visit<'a>>(visitor: &mut V, it: &WithClause<'a>) {
2756        let kind = AstKind::WithClause(visitor.alloc(it));
2757        visitor.enter_node(kind);
2758        visitor.visit_span(&it.span);
2759        visitor.visit_import_attributes(&it.with_entries);
2760        visitor.leave_node(kind);
2761    }
2762
2763    #[inline]
2764    pub fn walk_import_attribute<'a, V: Visit<'a>>(visitor: &mut V, it: &ImportAttribute<'a>) {
2765        let kind = AstKind::ImportAttribute(visitor.alloc(it));
2766        visitor.enter_node(kind);
2767        visitor.visit_span(&it.span);
2768        visitor.visit_import_attribute_key(&it.key);
2769        visitor.visit_string_literal(&it.value);
2770        visitor.leave_node(kind);
2771    }
2772
2773    #[inline]
2774    pub fn walk_import_attribute_key<'a, V: Visit<'a>>(
2775        visitor: &mut V,
2776        it: &ImportAttributeKey<'a>,
2777    ) {
2778        // No `AstKind` for this type
2779        match it {
2780            ImportAttributeKey::Identifier(it) => visitor.visit_identifier_name(it),
2781            ImportAttributeKey::StringLiteral(it) => visitor.visit_string_literal(it),
2782        }
2783    }
2784
2785    #[inline]
2786    pub fn walk_export_named_declaration<'a, V: Visit<'a>>(
2787        visitor: &mut V,
2788        it: &ExportNamedDeclaration<'a>,
2789    ) {
2790        let kind = AstKind::ExportNamedDeclaration(visitor.alloc(it));
2791        visitor.enter_node(kind);
2792        visitor.visit_span(&it.span);
2793        if let Some(declaration) = &it.declaration {
2794            visitor.visit_declaration(declaration);
2795        }
2796        visitor.visit_export_specifiers(&it.specifiers);
2797        if let Some(source) = &it.source {
2798            visitor.visit_string_literal(source);
2799        }
2800        if let Some(with_clause) = &it.with_clause {
2801            visitor.visit_with_clause(with_clause);
2802        }
2803        visitor.leave_node(kind);
2804    }
2805
2806    #[inline]
2807    pub fn walk_export_default_declaration<'a, V: Visit<'a>>(
2808        visitor: &mut V,
2809        it: &ExportDefaultDeclaration<'a>,
2810    ) {
2811        let kind = AstKind::ExportDefaultDeclaration(visitor.alloc(it));
2812        visitor.enter_node(kind);
2813        visitor.visit_span(&it.span);
2814        visitor.visit_export_default_declaration_kind(&it.declaration);
2815        visitor.leave_node(kind);
2816    }
2817
2818    #[inline]
2819    pub fn walk_export_all_declaration<'a, V: Visit<'a>>(
2820        visitor: &mut V,
2821        it: &ExportAllDeclaration<'a>,
2822    ) {
2823        let kind = AstKind::ExportAllDeclaration(visitor.alloc(it));
2824        visitor.enter_node(kind);
2825        visitor.visit_span(&it.span);
2826        if let Some(exported) = &it.exported {
2827            visitor.visit_module_export_name(exported);
2828        }
2829        visitor.visit_string_literal(&it.source);
2830        if let Some(with_clause) = &it.with_clause {
2831            visitor.visit_with_clause(with_clause);
2832        }
2833        visitor.leave_node(kind);
2834    }
2835
2836    #[inline]
2837    pub fn walk_export_specifier<'a, V: Visit<'a>>(visitor: &mut V, it: &ExportSpecifier<'a>) {
2838        let kind = AstKind::ExportSpecifier(visitor.alloc(it));
2839        visitor.enter_node(kind);
2840        visitor.visit_span(&it.span);
2841        visitor.visit_module_export_name(&it.local);
2842        visitor.visit_module_export_name(&it.exported);
2843        visitor.leave_node(kind);
2844    }
2845
2846    #[inline]
2847    pub fn walk_export_default_declaration_kind<'a, V: Visit<'a>>(
2848        visitor: &mut V,
2849        it: &ExportDefaultDeclarationKind<'a>,
2850    ) {
2851        // No `AstKind` for this type
2852        match it {
2853            ExportDefaultDeclarationKind::FunctionDeclaration(it) => {
2854                let flags = ScopeFlags::Function;
2855                visitor.visit_function(it, flags)
2856            }
2857            ExportDefaultDeclarationKind::ClassDeclaration(it) => visitor.visit_class(it),
2858            ExportDefaultDeclarationKind::TSInterfaceDeclaration(it) => {
2859                visitor.visit_ts_interface_declaration(it)
2860            }
2861            match_expression!(ExportDefaultDeclarationKind) => {
2862                visitor.visit_expression(it.to_expression())
2863            }
2864        }
2865    }
2866
2867    #[inline]
2868    pub fn walk_module_export_name<'a, V: Visit<'a>>(visitor: &mut V, it: &ModuleExportName<'a>) {
2869        // No `AstKind` for this type
2870        match it {
2871            ModuleExportName::IdentifierName(it) => visitor.visit_identifier_name(it),
2872            ModuleExportName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
2873            ModuleExportName::StringLiteral(it) => visitor.visit_string_literal(it),
2874        }
2875    }
2876
2877    #[inline]
2878    pub fn walk_v_8_intrinsic_expression<'a, V: Visit<'a>>(
2879        visitor: &mut V,
2880        it: &V8IntrinsicExpression<'a>,
2881    ) {
2882        let kind = AstKind::V8IntrinsicExpression(visitor.alloc(it));
2883        visitor.enter_node(kind);
2884        visitor.visit_span(&it.span);
2885        visitor.visit_identifier_name(&it.name);
2886        visitor.visit_arguments(&it.arguments);
2887        visitor.leave_node(kind);
2888    }
2889
2890    #[inline]
2891    pub fn walk_boolean_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &BooleanLiteral) {
2892        let kind = AstKind::BooleanLiteral(visitor.alloc(it));
2893        visitor.enter_node(kind);
2894        visitor.visit_span(&it.span);
2895        visitor.leave_node(kind);
2896    }
2897
2898    #[inline]
2899    pub fn walk_null_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &NullLiteral) {
2900        let kind = AstKind::NullLiteral(visitor.alloc(it));
2901        visitor.enter_node(kind);
2902        visitor.visit_span(&it.span);
2903        visitor.leave_node(kind);
2904    }
2905
2906    #[inline]
2907    pub fn walk_numeric_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &NumericLiteral<'a>) {
2908        let kind = AstKind::NumericLiteral(visitor.alloc(it));
2909        visitor.enter_node(kind);
2910        visitor.visit_span(&it.span);
2911        visitor.leave_node(kind);
2912    }
2913
2914    #[inline]
2915    pub fn walk_string_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &StringLiteral<'a>) {
2916        let kind = AstKind::StringLiteral(visitor.alloc(it));
2917        visitor.enter_node(kind);
2918        visitor.visit_span(&it.span);
2919        visitor.leave_node(kind);
2920    }
2921
2922    #[inline]
2923    pub fn walk_big_int_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &BigIntLiteral<'a>) {
2924        let kind = AstKind::BigIntLiteral(visitor.alloc(it));
2925        visitor.enter_node(kind);
2926        visitor.visit_span(&it.span);
2927        visitor.leave_node(kind);
2928    }
2929
2930    #[inline]
2931    pub fn walk_reg_exp_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &RegExpLiteral<'a>) {
2932        let kind = AstKind::RegExpLiteral(visitor.alloc(it));
2933        visitor.enter_node(kind);
2934        visitor.visit_span(&it.span);
2935        visitor.leave_node(kind);
2936    }
2937
2938    #[inline]
2939    pub fn walk_jsx_element<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXElement<'a>) {
2940        let kind = AstKind::JSXElement(visitor.alloc(it));
2941        visitor.enter_node(kind);
2942        visitor.visit_span(&it.span);
2943        visitor.visit_jsx_opening_element(&it.opening_element);
2944        visitor.visit_jsx_children(&it.children);
2945        if let Some(closing_element) = &it.closing_element {
2946            visitor.visit_jsx_closing_element(closing_element);
2947        }
2948        visitor.leave_node(kind);
2949    }
2950
2951    #[inline]
2952    pub fn walk_jsx_opening_element<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXOpeningElement<'a>) {
2953        let kind = AstKind::JSXOpeningElement(visitor.alloc(it));
2954        visitor.enter_node(kind);
2955        visitor.visit_span(&it.span);
2956        visitor.visit_jsx_element_name(&it.name);
2957        if let Some(type_arguments) = &it.type_arguments {
2958            visitor.visit_ts_type_parameter_instantiation(type_arguments);
2959        }
2960        visitor.visit_jsx_attribute_items(&it.attributes);
2961        visitor.leave_node(kind);
2962    }
2963
2964    #[inline]
2965    pub fn walk_jsx_closing_element<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXClosingElement<'a>) {
2966        let kind = AstKind::JSXClosingElement(visitor.alloc(it));
2967        visitor.enter_node(kind);
2968        visitor.visit_span(&it.span);
2969        visitor.visit_jsx_element_name(&it.name);
2970        visitor.leave_node(kind);
2971    }
2972
2973    #[inline]
2974    pub fn walk_jsx_fragment<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXFragment<'a>) {
2975        let kind = AstKind::JSXFragment(visitor.alloc(it));
2976        visitor.enter_node(kind);
2977        visitor.visit_span(&it.span);
2978        visitor.visit_jsx_opening_fragment(&it.opening_fragment);
2979        visitor.visit_jsx_children(&it.children);
2980        visitor.visit_jsx_closing_fragment(&it.closing_fragment);
2981        visitor.leave_node(kind);
2982    }
2983
2984    #[inline]
2985    pub fn walk_jsx_opening_fragment<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXOpeningFragment) {
2986        let kind = AstKind::JSXOpeningFragment(visitor.alloc(it));
2987        visitor.enter_node(kind);
2988        visitor.visit_span(&it.span);
2989        visitor.leave_node(kind);
2990    }
2991
2992    #[inline]
2993    pub fn walk_jsx_closing_fragment<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXClosingFragment) {
2994        let kind = AstKind::JSXClosingFragment(visitor.alloc(it));
2995        visitor.enter_node(kind);
2996        visitor.visit_span(&it.span);
2997        visitor.leave_node(kind);
2998    }
2999
3000    #[inline]
3001    pub fn walk_jsx_element_name<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXElementName<'a>) {
3002        // No `AstKind` for this type
3003        match it {
3004            JSXElementName::Identifier(it) => visitor.visit_jsx_identifier(it),
3005            JSXElementName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
3006            JSXElementName::NamespacedName(it) => visitor.visit_jsx_namespaced_name(it),
3007            JSXElementName::MemberExpression(it) => visitor.visit_jsx_member_expression(it),
3008            JSXElementName::ThisExpression(it) => visitor.visit_this_expression(it),
3009        }
3010    }
3011
3012    #[inline]
3013    pub fn walk_jsx_namespaced_name<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXNamespacedName<'a>) {
3014        let kind = AstKind::JSXNamespacedName(visitor.alloc(it));
3015        visitor.enter_node(kind);
3016        visitor.visit_span(&it.span);
3017        visitor.visit_jsx_identifier(&it.namespace);
3018        visitor.visit_jsx_identifier(&it.name);
3019        visitor.leave_node(kind);
3020    }
3021
3022    #[inline]
3023    pub fn walk_jsx_member_expression<'a, V: Visit<'a>>(
3024        visitor: &mut V,
3025        it: &JSXMemberExpression<'a>,
3026    ) {
3027        let kind = AstKind::JSXMemberExpression(visitor.alloc(it));
3028        visitor.enter_node(kind);
3029        visitor.visit_span(&it.span);
3030        visitor.visit_jsx_member_expression_object(&it.object);
3031        visitor.visit_jsx_identifier(&it.property);
3032        visitor.leave_node(kind);
3033    }
3034
3035    #[inline]
3036    pub fn walk_jsx_member_expression_object<'a, V: Visit<'a>>(
3037        visitor: &mut V,
3038        it: &JSXMemberExpressionObject<'a>,
3039    ) {
3040        // No `AstKind` for this type
3041        match it {
3042            JSXMemberExpressionObject::IdentifierReference(it) => {
3043                visitor.visit_identifier_reference(it)
3044            }
3045            JSXMemberExpressionObject::MemberExpression(it) => {
3046                visitor.visit_jsx_member_expression(it)
3047            }
3048            JSXMemberExpressionObject::ThisExpression(it) => visitor.visit_this_expression(it),
3049        }
3050    }
3051
3052    #[inline]
3053    pub fn walk_jsx_expression_container<'a, V: Visit<'a>>(
3054        visitor: &mut V,
3055        it: &JSXExpressionContainer<'a>,
3056    ) {
3057        let kind = AstKind::JSXExpressionContainer(visitor.alloc(it));
3058        visitor.enter_node(kind);
3059        visitor.visit_span(&it.span);
3060        visitor.visit_jsx_expression(&it.expression);
3061        visitor.leave_node(kind);
3062    }
3063
3064    #[inline]
3065    pub fn walk_jsx_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXExpression<'a>) {
3066        // No `AstKind` for this type
3067        match it {
3068            JSXExpression::EmptyExpression(it) => visitor.visit_jsx_empty_expression(it),
3069            match_expression!(JSXExpression) => visitor.visit_expression(it.to_expression()),
3070        }
3071    }
3072
3073    #[inline]
3074    pub fn walk_jsx_empty_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXEmptyExpression) {
3075        let kind = AstKind::JSXEmptyExpression(visitor.alloc(it));
3076        visitor.enter_node(kind);
3077        visitor.visit_span(&it.span);
3078        visitor.leave_node(kind);
3079    }
3080
3081    #[inline]
3082    pub fn walk_jsx_attribute_item<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXAttributeItem<'a>) {
3083        // No `AstKind` for this type
3084        match it {
3085            JSXAttributeItem::Attribute(it) => visitor.visit_jsx_attribute(it),
3086            JSXAttributeItem::SpreadAttribute(it) => visitor.visit_jsx_spread_attribute(it),
3087        }
3088    }
3089
3090    #[inline]
3091    pub fn walk_jsx_attribute<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXAttribute<'a>) {
3092        let kind = AstKind::JSXAttribute(visitor.alloc(it));
3093        visitor.enter_node(kind);
3094        visitor.visit_span(&it.span);
3095        visitor.visit_jsx_attribute_name(&it.name);
3096        if let Some(value) = &it.value {
3097            visitor.visit_jsx_attribute_value(value);
3098        }
3099        visitor.leave_node(kind);
3100    }
3101
3102    #[inline]
3103    pub fn walk_jsx_spread_attribute<'a, V: Visit<'a>>(
3104        visitor: &mut V,
3105        it: &JSXSpreadAttribute<'a>,
3106    ) {
3107        let kind = AstKind::JSXSpreadAttribute(visitor.alloc(it));
3108        visitor.enter_node(kind);
3109        visitor.visit_span(&it.span);
3110        visitor.visit_expression(&it.argument);
3111        visitor.leave_node(kind);
3112    }
3113
3114    #[inline]
3115    pub fn walk_jsx_attribute_name<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXAttributeName<'a>) {
3116        // No `AstKind` for this type
3117        match it {
3118            JSXAttributeName::Identifier(it) => visitor.visit_jsx_identifier(it),
3119            JSXAttributeName::NamespacedName(it) => visitor.visit_jsx_namespaced_name(it),
3120        }
3121    }
3122
3123    #[inline]
3124    pub fn walk_jsx_attribute_value<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXAttributeValue<'a>) {
3125        // No `AstKind` for this type
3126        match it {
3127            JSXAttributeValue::StringLiteral(it) => visitor.visit_string_literal(it),
3128            JSXAttributeValue::ExpressionContainer(it) => {
3129                visitor.visit_jsx_expression_container(it)
3130            }
3131            JSXAttributeValue::Element(it) => visitor.visit_jsx_element(it),
3132            JSXAttributeValue::Fragment(it) => visitor.visit_jsx_fragment(it),
3133        }
3134    }
3135
3136    #[inline]
3137    pub fn walk_jsx_identifier<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXIdentifier<'a>) {
3138        let kind = AstKind::JSXIdentifier(visitor.alloc(it));
3139        visitor.enter_node(kind);
3140        visitor.visit_span(&it.span);
3141        visitor.leave_node(kind);
3142    }
3143
3144    #[inline]
3145    pub fn walk_jsx_child<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXChild<'a>) {
3146        // No `AstKind` for this type
3147        match it {
3148            JSXChild::Text(it) => visitor.visit_jsx_text(it),
3149            JSXChild::Element(it) => visitor.visit_jsx_element(it),
3150            JSXChild::Fragment(it) => visitor.visit_jsx_fragment(it),
3151            JSXChild::ExpressionContainer(it) => visitor.visit_jsx_expression_container(it),
3152            JSXChild::Spread(it) => visitor.visit_jsx_spread_child(it),
3153        }
3154    }
3155
3156    #[inline]
3157    pub fn walk_jsx_spread_child<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXSpreadChild<'a>) {
3158        let kind = AstKind::JSXSpreadChild(visitor.alloc(it));
3159        visitor.enter_node(kind);
3160        visitor.visit_span(&it.span);
3161        visitor.visit_expression(&it.expression);
3162        visitor.leave_node(kind);
3163    }
3164
3165    #[inline]
3166    pub fn walk_jsx_text<'a, V: Visit<'a>>(visitor: &mut V, it: &JSXText<'a>) {
3167        let kind = AstKind::JSXText(visitor.alloc(it));
3168        visitor.enter_node(kind);
3169        visitor.visit_span(&it.span);
3170        visitor.leave_node(kind);
3171    }
3172
3173    #[inline]
3174    pub fn walk_ts_this_parameter<'a, V: Visit<'a>>(visitor: &mut V, it: &TSThisParameter<'a>) {
3175        let kind = AstKind::TSThisParameter(visitor.alloc(it));
3176        visitor.enter_node(kind);
3177        visitor.visit_span(&it.span);
3178        visitor.visit_span(&it.this_span);
3179        if let Some(type_annotation) = &it.type_annotation {
3180            visitor.visit_ts_type_annotation(type_annotation);
3181        }
3182        visitor.leave_node(kind);
3183    }
3184
3185    #[inline]
3186    pub fn walk_ts_enum_declaration<'a, V: Visit<'a>>(visitor: &mut V, it: &TSEnumDeclaration<'a>) {
3187        let kind = AstKind::TSEnumDeclaration(visitor.alloc(it));
3188        visitor.enter_node(kind);
3189        visitor.visit_span(&it.span);
3190        visitor.visit_binding_identifier(&it.id);
3191        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3192        visitor.visit_ts_enum_body(&it.body);
3193        visitor.leave_scope();
3194        visitor.leave_node(kind);
3195    }
3196
3197    #[inline]
3198    pub fn walk_ts_enum_body<'a, V: Visit<'a>>(visitor: &mut V, it: &TSEnumBody<'a>) {
3199        let kind = AstKind::TSEnumBody(visitor.alloc(it));
3200        visitor.enter_node(kind);
3201        visitor.visit_span(&it.span);
3202        visitor.visit_ts_enum_members(&it.members);
3203        visitor.leave_node(kind);
3204    }
3205
3206    #[inline]
3207    pub fn walk_ts_enum_member<'a, V: Visit<'a>>(visitor: &mut V, it: &TSEnumMember<'a>) {
3208        let kind = AstKind::TSEnumMember(visitor.alloc(it));
3209        visitor.enter_node(kind);
3210        visitor.visit_span(&it.span);
3211        visitor.visit_ts_enum_member_name(&it.id);
3212        if let Some(initializer) = &it.initializer {
3213            visitor.visit_expression(initializer);
3214        }
3215        visitor.leave_node(kind);
3216    }
3217
3218    #[inline]
3219    pub fn walk_ts_enum_member_name<'a, V: Visit<'a>>(visitor: &mut V, it: &TSEnumMemberName<'a>) {
3220        // No `AstKind` for this type
3221        match it {
3222            TSEnumMemberName::Identifier(it) => visitor.visit_identifier_name(it),
3223            TSEnumMemberName::String(it) => visitor.visit_string_literal(it),
3224            TSEnumMemberName::ComputedString(it) => visitor.visit_string_literal(it),
3225            TSEnumMemberName::ComputedTemplateString(it) => visitor.visit_template_literal(it),
3226        }
3227    }
3228
3229    #[inline]
3230    pub fn walk_ts_type_annotation<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeAnnotation<'a>) {
3231        let kind = AstKind::TSTypeAnnotation(visitor.alloc(it));
3232        visitor.enter_node(kind);
3233        visitor.visit_span(&it.span);
3234        visitor.visit_ts_type(&it.type_annotation);
3235        visitor.leave_node(kind);
3236    }
3237
3238    #[inline]
3239    pub fn walk_ts_literal_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSLiteralType<'a>) {
3240        let kind = AstKind::TSLiteralType(visitor.alloc(it));
3241        visitor.enter_node(kind);
3242        visitor.visit_span(&it.span);
3243        visitor.visit_ts_literal(&it.literal);
3244        visitor.leave_node(kind);
3245    }
3246
3247    pub fn walk_ts_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &TSLiteral<'a>) {
3248        // No `AstKind` for this type
3249        match it {
3250            TSLiteral::BooleanLiteral(it) => visitor.visit_boolean_literal(it),
3251            TSLiteral::NumericLiteral(it) => visitor.visit_numeric_literal(it),
3252            TSLiteral::BigIntLiteral(it) => visitor.visit_big_int_literal(it),
3253            TSLiteral::StringLiteral(it) => visitor.visit_string_literal(it),
3254            TSLiteral::TemplateLiteral(it) => visitor.visit_template_literal(it),
3255            TSLiteral::UnaryExpression(it) => visitor.visit_unary_expression(it),
3256        }
3257    }
3258
3259    pub fn walk_ts_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSType<'a>) {
3260        // No `AstKind` for this type
3261        match it {
3262            TSType::TSAnyKeyword(it) => visitor.visit_ts_any_keyword(it),
3263            TSType::TSBigIntKeyword(it) => visitor.visit_ts_big_int_keyword(it),
3264            TSType::TSBooleanKeyword(it) => visitor.visit_ts_boolean_keyword(it),
3265            TSType::TSIntrinsicKeyword(it) => visitor.visit_ts_intrinsic_keyword(it),
3266            TSType::TSNeverKeyword(it) => visitor.visit_ts_never_keyword(it),
3267            TSType::TSNullKeyword(it) => visitor.visit_ts_null_keyword(it),
3268            TSType::TSNumberKeyword(it) => visitor.visit_ts_number_keyword(it),
3269            TSType::TSObjectKeyword(it) => visitor.visit_ts_object_keyword(it),
3270            TSType::TSStringKeyword(it) => visitor.visit_ts_string_keyword(it),
3271            TSType::TSSymbolKeyword(it) => visitor.visit_ts_symbol_keyword(it),
3272            TSType::TSUndefinedKeyword(it) => visitor.visit_ts_undefined_keyword(it),
3273            TSType::TSUnknownKeyword(it) => visitor.visit_ts_unknown_keyword(it),
3274            TSType::TSVoidKeyword(it) => visitor.visit_ts_void_keyword(it),
3275            TSType::TSArrayType(it) => visitor.visit_ts_array_type(it),
3276            TSType::TSConditionalType(it) => visitor.visit_ts_conditional_type(it),
3277            TSType::TSConstructorType(it) => visitor.visit_ts_constructor_type(it),
3278            TSType::TSFunctionType(it) => visitor.visit_ts_function_type(it),
3279            TSType::TSImportType(it) => visitor.visit_ts_import_type(it),
3280            TSType::TSIndexedAccessType(it) => visitor.visit_ts_indexed_access_type(it),
3281            TSType::TSInferType(it) => visitor.visit_ts_infer_type(it),
3282            TSType::TSIntersectionType(it) => visitor.visit_ts_intersection_type(it),
3283            TSType::TSLiteralType(it) => visitor.visit_ts_literal_type(it),
3284            TSType::TSMappedType(it) => visitor.visit_ts_mapped_type(it),
3285            TSType::TSNamedTupleMember(it) => visitor.visit_ts_named_tuple_member(it),
3286            TSType::TSTemplateLiteralType(it) => visitor.visit_ts_template_literal_type(it),
3287            TSType::TSThisType(it) => visitor.visit_ts_this_type(it),
3288            TSType::TSTupleType(it) => visitor.visit_ts_tuple_type(it),
3289            TSType::TSTypeLiteral(it) => visitor.visit_ts_type_literal(it),
3290            TSType::TSTypeOperatorType(it) => visitor.visit_ts_type_operator(it),
3291            TSType::TSTypePredicate(it) => visitor.visit_ts_type_predicate(it),
3292            TSType::TSTypeQuery(it) => visitor.visit_ts_type_query(it),
3293            TSType::TSTypeReference(it) => visitor.visit_ts_type_reference(it),
3294            TSType::TSUnionType(it) => visitor.visit_ts_union_type(it),
3295            TSType::TSParenthesizedType(it) => visitor.visit_ts_parenthesized_type(it),
3296            TSType::JSDocNullableType(it) => visitor.visit_js_doc_nullable_type(it),
3297            TSType::JSDocNonNullableType(it) => visitor.visit_js_doc_non_nullable_type(it),
3298            TSType::JSDocUnknownType(it) => visitor.visit_js_doc_unknown_type(it),
3299        }
3300    }
3301
3302    #[inline]
3303    pub fn walk_ts_conditional_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSConditionalType<'a>) {
3304        let kind = AstKind::TSConditionalType(visitor.alloc(it));
3305        visitor.enter_node(kind);
3306        visitor.visit_span(&it.span);
3307        visitor.visit_ts_type(&it.check_type);
3308        visitor.enter_scope(ScopeFlags::TsConditional, &it.scope_id);
3309        visitor.visit_ts_type(&it.extends_type);
3310        visitor.visit_ts_type(&it.true_type);
3311        visitor.leave_scope();
3312        visitor.visit_ts_type(&it.false_type);
3313        visitor.leave_node(kind);
3314    }
3315
3316    #[inline]
3317    pub fn walk_ts_union_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSUnionType<'a>) {
3318        let kind = AstKind::TSUnionType(visitor.alloc(it));
3319        visitor.enter_node(kind);
3320        visitor.visit_span(&it.span);
3321        visitor.visit_ts_types(&it.types);
3322        visitor.leave_node(kind);
3323    }
3324
3325    #[inline]
3326    pub fn walk_ts_intersection_type<'a, V: Visit<'a>>(
3327        visitor: &mut V,
3328        it: &TSIntersectionType<'a>,
3329    ) {
3330        let kind = AstKind::TSIntersectionType(visitor.alloc(it));
3331        visitor.enter_node(kind);
3332        visitor.visit_span(&it.span);
3333        visitor.visit_ts_types(&it.types);
3334        visitor.leave_node(kind);
3335    }
3336
3337    #[inline]
3338    pub fn walk_ts_parenthesized_type<'a, V: Visit<'a>>(
3339        visitor: &mut V,
3340        it: &TSParenthesizedType<'a>,
3341    ) {
3342        let kind = AstKind::TSParenthesizedType(visitor.alloc(it));
3343        visitor.enter_node(kind);
3344        visitor.visit_span(&it.span);
3345        visitor.visit_ts_type(&it.type_annotation);
3346        visitor.leave_node(kind);
3347    }
3348
3349    #[inline]
3350    pub fn walk_ts_type_operator<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeOperator<'a>) {
3351        let kind = AstKind::TSTypeOperator(visitor.alloc(it));
3352        visitor.enter_node(kind);
3353        visitor.visit_span(&it.span);
3354        visitor.visit_ts_type(&it.type_annotation);
3355        visitor.leave_node(kind);
3356    }
3357
3358    #[inline]
3359    pub fn walk_ts_array_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSArrayType<'a>) {
3360        let kind = AstKind::TSArrayType(visitor.alloc(it));
3361        visitor.enter_node(kind);
3362        visitor.visit_span(&it.span);
3363        visitor.visit_ts_type(&it.element_type);
3364        visitor.leave_node(kind);
3365    }
3366
3367    #[inline]
3368    pub fn walk_ts_indexed_access_type<'a, V: Visit<'a>>(
3369        visitor: &mut V,
3370        it: &TSIndexedAccessType<'a>,
3371    ) {
3372        let kind = AstKind::TSIndexedAccessType(visitor.alloc(it));
3373        visitor.enter_node(kind);
3374        visitor.visit_span(&it.span);
3375        visitor.visit_ts_type(&it.object_type);
3376        visitor.visit_ts_type(&it.index_type);
3377        visitor.leave_node(kind);
3378    }
3379
3380    #[inline]
3381    pub fn walk_ts_tuple_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTupleType<'a>) {
3382        let kind = AstKind::TSTupleType(visitor.alloc(it));
3383        visitor.enter_node(kind);
3384        visitor.visit_span(&it.span);
3385        visitor.visit_ts_tuple_elements(&it.element_types);
3386        visitor.leave_node(kind);
3387    }
3388
3389    #[inline]
3390    pub fn walk_ts_named_tuple_member<'a, V: Visit<'a>>(
3391        visitor: &mut V,
3392        it: &TSNamedTupleMember<'a>,
3393    ) {
3394        let kind = AstKind::TSNamedTupleMember(visitor.alloc(it));
3395        visitor.enter_node(kind);
3396        visitor.visit_span(&it.span);
3397        visitor.visit_identifier_name(&it.label);
3398        visitor.visit_ts_tuple_element(&it.element_type);
3399        visitor.leave_node(kind);
3400    }
3401
3402    #[inline]
3403    pub fn walk_ts_optional_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSOptionalType<'a>) {
3404        let kind = AstKind::TSOptionalType(visitor.alloc(it));
3405        visitor.enter_node(kind);
3406        visitor.visit_span(&it.span);
3407        visitor.visit_ts_type(&it.type_annotation);
3408        visitor.leave_node(kind);
3409    }
3410
3411    #[inline]
3412    pub fn walk_ts_rest_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSRestType<'a>) {
3413        let kind = AstKind::TSRestType(visitor.alloc(it));
3414        visitor.enter_node(kind);
3415        visitor.visit_span(&it.span);
3416        visitor.visit_ts_type(&it.type_annotation);
3417        visitor.leave_node(kind);
3418    }
3419
3420    #[inline]
3421    pub fn walk_ts_tuple_element<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTupleElement<'a>) {
3422        // No `AstKind` for this type
3423        match it {
3424            TSTupleElement::TSOptionalType(it) => visitor.visit_ts_optional_type(it),
3425            TSTupleElement::TSRestType(it) => visitor.visit_ts_rest_type(it),
3426            match_ts_type!(TSTupleElement) => visitor.visit_ts_type(it.to_ts_type()),
3427        }
3428    }
3429
3430    #[inline]
3431    pub fn walk_ts_any_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSAnyKeyword) {
3432        let kind = AstKind::TSAnyKeyword(visitor.alloc(it));
3433        visitor.enter_node(kind);
3434        visitor.visit_span(&it.span);
3435        visitor.leave_node(kind);
3436    }
3437
3438    #[inline]
3439    pub fn walk_ts_string_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSStringKeyword) {
3440        let kind = AstKind::TSStringKeyword(visitor.alloc(it));
3441        visitor.enter_node(kind);
3442        visitor.visit_span(&it.span);
3443        visitor.leave_node(kind);
3444    }
3445
3446    #[inline]
3447    pub fn walk_ts_boolean_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSBooleanKeyword) {
3448        let kind = AstKind::TSBooleanKeyword(visitor.alloc(it));
3449        visitor.enter_node(kind);
3450        visitor.visit_span(&it.span);
3451        visitor.leave_node(kind);
3452    }
3453
3454    #[inline]
3455    pub fn walk_ts_number_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSNumberKeyword) {
3456        let kind = AstKind::TSNumberKeyword(visitor.alloc(it));
3457        visitor.enter_node(kind);
3458        visitor.visit_span(&it.span);
3459        visitor.leave_node(kind);
3460    }
3461
3462    #[inline]
3463    pub fn walk_ts_never_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSNeverKeyword) {
3464        let kind = AstKind::TSNeverKeyword(visitor.alloc(it));
3465        visitor.enter_node(kind);
3466        visitor.visit_span(&it.span);
3467        visitor.leave_node(kind);
3468    }
3469
3470    #[inline]
3471    pub fn walk_ts_intrinsic_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSIntrinsicKeyword) {
3472        let kind = AstKind::TSIntrinsicKeyword(visitor.alloc(it));
3473        visitor.enter_node(kind);
3474        visitor.visit_span(&it.span);
3475        visitor.leave_node(kind);
3476    }
3477
3478    #[inline]
3479    pub fn walk_ts_unknown_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSUnknownKeyword) {
3480        let kind = AstKind::TSUnknownKeyword(visitor.alloc(it));
3481        visitor.enter_node(kind);
3482        visitor.visit_span(&it.span);
3483        visitor.leave_node(kind);
3484    }
3485
3486    #[inline]
3487    pub fn walk_ts_null_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSNullKeyword) {
3488        let kind = AstKind::TSNullKeyword(visitor.alloc(it));
3489        visitor.enter_node(kind);
3490        visitor.visit_span(&it.span);
3491        visitor.leave_node(kind);
3492    }
3493
3494    #[inline]
3495    pub fn walk_ts_undefined_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSUndefinedKeyword) {
3496        let kind = AstKind::TSUndefinedKeyword(visitor.alloc(it));
3497        visitor.enter_node(kind);
3498        visitor.visit_span(&it.span);
3499        visitor.leave_node(kind);
3500    }
3501
3502    #[inline]
3503    pub fn walk_ts_void_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSVoidKeyword) {
3504        let kind = AstKind::TSVoidKeyword(visitor.alloc(it));
3505        visitor.enter_node(kind);
3506        visitor.visit_span(&it.span);
3507        visitor.leave_node(kind);
3508    }
3509
3510    #[inline]
3511    pub fn walk_ts_symbol_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSSymbolKeyword) {
3512        let kind = AstKind::TSSymbolKeyword(visitor.alloc(it));
3513        visitor.enter_node(kind);
3514        visitor.visit_span(&it.span);
3515        visitor.leave_node(kind);
3516    }
3517
3518    #[inline]
3519    pub fn walk_ts_this_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSThisType) {
3520        let kind = AstKind::TSThisType(visitor.alloc(it));
3521        visitor.enter_node(kind);
3522        visitor.visit_span(&it.span);
3523        visitor.leave_node(kind);
3524    }
3525
3526    #[inline]
3527    pub fn walk_ts_object_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSObjectKeyword) {
3528        let kind = AstKind::TSObjectKeyword(visitor.alloc(it));
3529        visitor.enter_node(kind);
3530        visitor.visit_span(&it.span);
3531        visitor.leave_node(kind);
3532    }
3533
3534    #[inline]
3535    pub fn walk_ts_big_int_keyword<'a, V: Visit<'a>>(visitor: &mut V, it: &TSBigIntKeyword) {
3536        let kind = AstKind::TSBigIntKeyword(visitor.alloc(it));
3537        visitor.enter_node(kind);
3538        visitor.visit_span(&it.span);
3539        visitor.leave_node(kind);
3540    }
3541
3542    #[inline]
3543    pub fn walk_ts_type_reference<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeReference<'a>) {
3544        let kind = AstKind::TSTypeReference(visitor.alloc(it));
3545        visitor.enter_node(kind);
3546        visitor.visit_span(&it.span);
3547        visitor.visit_ts_type_name(&it.type_name);
3548        if let Some(type_arguments) = &it.type_arguments {
3549            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3550        }
3551        visitor.leave_node(kind);
3552    }
3553
3554    #[inline]
3555    pub fn walk_ts_type_name<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeName<'a>) {
3556        // No `AstKind` for this type
3557        match it {
3558            TSTypeName::IdentifierReference(it) => visitor.visit_identifier_reference(it),
3559            TSTypeName::QualifiedName(it) => visitor.visit_ts_qualified_name(it),
3560            TSTypeName::ThisExpression(it) => visitor.visit_this_expression(it),
3561        }
3562    }
3563
3564    #[inline]
3565    pub fn walk_ts_qualified_name<'a, V: Visit<'a>>(visitor: &mut V, it: &TSQualifiedName<'a>) {
3566        let kind = AstKind::TSQualifiedName(visitor.alloc(it));
3567        visitor.enter_node(kind);
3568        visitor.visit_span(&it.span);
3569        visitor.visit_ts_type_name(&it.left);
3570        visitor.visit_identifier_name(&it.right);
3571        visitor.leave_node(kind);
3572    }
3573
3574    #[inline]
3575    pub fn walk_ts_type_parameter_instantiation<'a, V: Visit<'a>>(
3576        visitor: &mut V,
3577        it: &TSTypeParameterInstantiation<'a>,
3578    ) {
3579        let kind = AstKind::TSTypeParameterInstantiation(visitor.alloc(it));
3580        visitor.enter_node(kind);
3581        visitor.visit_span(&it.span);
3582        visitor.visit_ts_types(&it.params);
3583        visitor.leave_node(kind);
3584    }
3585
3586    #[inline]
3587    pub fn walk_ts_type_parameter<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeParameter<'a>) {
3588        let kind = AstKind::TSTypeParameter(visitor.alloc(it));
3589        visitor.enter_node(kind);
3590        visitor.visit_span(&it.span);
3591        visitor.visit_binding_identifier(&it.name);
3592        if let Some(constraint) = &it.constraint {
3593            visitor.visit_ts_type(constraint);
3594        }
3595        if let Some(default) = &it.default {
3596            visitor.visit_ts_type(default);
3597        }
3598        visitor.leave_node(kind);
3599    }
3600
3601    #[inline]
3602    pub fn walk_ts_type_parameter_declaration<'a, V: Visit<'a>>(
3603        visitor: &mut V,
3604        it: &TSTypeParameterDeclaration<'a>,
3605    ) {
3606        let kind = AstKind::TSTypeParameterDeclaration(visitor.alloc(it));
3607        visitor.enter_node(kind);
3608        visitor.visit_span(&it.span);
3609        visitor.visit_ts_type_parameters(&it.params);
3610        visitor.leave_node(kind);
3611    }
3612
3613    #[inline]
3614    pub fn walk_ts_type_alias_declaration<'a, V: Visit<'a>>(
3615        visitor: &mut V,
3616        it: &TSTypeAliasDeclaration<'a>,
3617    ) {
3618        let kind = AstKind::TSTypeAliasDeclaration(visitor.alloc(it));
3619        visitor.enter_node(kind);
3620        visitor.visit_span(&it.span);
3621        visitor.visit_binding_identifier(&it.id);
3622        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3623        if let Some(type_parameters) = &it.type_parameters {
3624            visitor.visit_ts_type_parameter_declaration(type_parameters);
3625        }
3626        visitor.visit_ts_type(&it.type_annotation);
3627        visitor.leave_scope();
3628        visitor.leave_node(kind);
3629    }
3630
3631    #[inline]
3632    pub fn walk_ts_class_implements<'a, V: Visit<'a>>(visitor: &mut V, it: &TSClassImplements<'a>) {
3633        let kind = AstKind::TSClassImplements(visitor.alloc(it));
3634        visitor.enter_node(kind);
3635        visitor.visit_span(&it.span);
3636        visitor.visit_ts_type_name(&it.expression);
3637        if let Some(type_arguments) = &it.type_arguments {
3638            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3639        }
3640        visitor.leave_node(kind);
3641    }
3642
3643    #[inline]
3644    pub fn walk_ts_interface_declaration<'a, V: Visit<'a>>(
3645        visitor: &mut V,
3646        it: &TSInterfaceDeclaration<'a>,
3647    ) {
3648        let kind = AstKind::TSInterfaceDeclaration(visitor.alloc(it));
3649        visitor.enter_node(kind);
3650        visitor.visit_span(&it.span);
3651        visitor.visit_binding_identifier(&it.id);
3652        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3653        if let Some(type_parameters) = &it.type_parameters {
3654            visitor.visit_ts_type_parameter_declaration(type_parameters);
3655        }
3656        visitor.visit_ts_interface_heritages(&it.extends);
3657        visitor.visit_ts_interface_body(&it.body);
3658        visitor.leave_scope();
3659        visitor.leave_node(kind);
3660    }
3661
3662    #[inline]
3663    pub fn walk_ts_interface_body<'a, V: Visit<'a>>(visitor: &mut V, it: &TSInterfaceBody<'a>) {
3664        let kind = AstKind::TSInterfaceBody(visitor.alloc(it));
3665        visitor.enter_node(kind);
3666        visitor.visit_span(&it.span);
3667        visitor.visit_ts_signatures(&it.body);
3668        visitor.leave_node(kind);
3669    }
3670
3671    #[inline]
3672    pub fn walk_ts_property_signature<'a, V: Visit<'a>>(
3673        visitor: &mut V,
3674        it: &TSPropertySignature<'a>,
3675    ) {
3676        let kind = AstKind::TSPropertySignature(visitor.alloc(it));
3677        visitor.enter_node(kind);
3678        visitor.visit_span(&it.span);
3679        visitor.visit_property_key(&it.key);
3680        if let Some(type_annotation) = &it.type_annotation {
3681            visitor.visit_ts_type_annotation(type_annotation);
3682        }
3683        visitor.leave_node(kind);
3684    }
3685
3686    #[inline]
3687    pub fn walk_ts_signature<'a, V: Visit<'a>>(visitor: &mut V, it: &TSSignature<'a>) {
3688        // No `AstKind` for this type
3689        match it {
3690            TSSignature::TSIndexSignature(it) => visitor.visit_ts_index_signature(it),
3691            TSSignature::TSPropertySignature(it) => visitor.visit_ts_property_signature(it),
3692            TSSignature::TSCallSignatureDeclaration(it) => {
3693                visitor.visit_ts_call_signature_declaration(it)
3694            }
3695            TSSignature::TSConstructSignatureDeclaration(it) => {
3696                visitor.visit_ts_construct_signature_declaration(it)
3697            }
3698            TSSignature::TSMethodSignature(it) => visitor.visit_ts_method_signature(it),
3699        }
3700    }
3701
3702    #[inline]
3703    pub fn walk_ts_index_signature<'a, V: Visit<'a>>(visitor: &mut V, it: &TSIndexSignature<'a>) {
3704        let kind = AstKind::TSIndexSignature(visitor.alloc(it));
3705        visitor.enter_node(kind);
3706        visitor.visit_span(&it.span);
3707        visitor.visit_ts_index_signature_names(&it.parameters);
3708        visitor.visit_ts_type_annotation(&it.type_annotation);
3709        visitor.leave_node(kind);
3710    }
3711
3712    #[inline]
3713    pub fn walk_ts_call_signature_declaration<'a, V: Visit<'a>>(
3714        visitor: &mut V,
3715        it: &TSCallSignatureDeclaration<'a>,
3716    ) {
3717        let kind = AstKind::TSCallSignatureDeclaration(visitor.alloc(it));
3718        visitor.enter_node(kind);
3719        visitor.visit_span(&it.span);
3720        if let Some(type_parameters) = &it.type_parameters {
3721            visitor.visit_ts_type_parameter_declaration(type_parameters);
3722        }
3723        if let Some(this_param) = &it.this_param {
3724            visitor.visit_ts_this_parameter(this_param);
3725        }
3726        visitor.visit_formal_parameters(&it.params);
3727        if let Some(return_type) = &it.return_type {
3728            visitor.visit_ts_type_annotation(return_type);
3729        }
3730        visitor.leave_node(kind);
3731    }
3732
3733    pub fn walk_ts_method_signature<'a, V: Visit<'a>>(visitor: &mut V, it: &TSMethodSignature<'a>) {
3734        let kind = AstKind::TSMethodSignature(visitor.alloc(it));
3735        visitor.enter_node(kind);
3736        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3737        visitor.visit_span(&it.span);
3738        visitor.visit_property_key(&it.key);
3739        if let Some(type_parameters) = &it.type_parameters {
3740            visitor.visit_ts_type_parameter_declaration(type_parameters);
3741        }
3742        if let Some(this_param) = &it.this_param {
3743            visitor.visit_ts_this_parameter(this_param);
3744        }
3745        visitor.visit_formal_parameters(&it.params);
3746        if let Some(return_type) = &it.return_type {
3747            visitor.visit_ts_type_annotation(return_type);
3748        }
3749        visitor.leave_scope();
3750        visitor.leave_node(kind);
3751    }
3752
3753    #[inline]
3754    pub fn walk_ts_construct_signature_declaration<'a, V: Visit<'a>>(
3755        visitor: &mut V,
3756        it: &TSConstructSignatureDeclaration<'a>,
3757    ) {
3758        let kind = AstKind::TSConstructSignatureDeclaration(visitor.alloc(it));
3759        visitor.enter_node(kind);
3760        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3761        visitor.visit_span(&it.span);
3762        if let Some(type_parameters) = &it.type_parameters {
3763            visitor.visit_ts_type_parameter_declaration(type_parameters);
3764        }
3765        visitor.visit_formal_parameters(&it.params);
3766        if let Some(return_type) = &it.return_type {
3767            visitor.visit_ts_type_annotation(return_type);
3768        }
3769        visitor.leave_scope();
3770        visitor.leave_node(kind);
3771    }
3772
3773    #[inline]
3774    pub fn walk_ts_index_signature_name<'a, V: Visit<'a>>(
3775        visitor: &mut V,
3776        it: &TSIndexSignatureName<'a>,
3777    ) {
3778        let kind = AstKind::TSIndexSignatureName(visitor.alloc(it));
3779        visitor.enter_node(kind);
3780        visitor.visit_span(&it.span);
3781        visitor.visit_ts_type_annotation(&it.type_annotation);
3782        visitor.leave_node(kind);
3783    }
3784
3785    #[inline]
3786    pub fn walk_ts_interface_heritage<'a, V: Visit<'a>>(
3787        visitor: &mut V,
3788        it: &TSInterfaceHeritage<'a>,
3789    ) {
3790        let kind = AstKind::TSInterfaceHeritage(visitor.alloc(it));
3791        visitor.enter_node(kind);
3792        visitor.visit_span(&it.span);
3793        visitor.visit_expression(&it.expression);
3794        if let Some(type_arguments) = &it.type_arguments {
3795            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3796        }
3797        visitor.leave_node(kind);
3798    }
3799
3800    #[inline]
3801    pub fn walk_ts_type_predicate<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypePredicate<'a>) {
3802        let kind = AstKind::TSTypePredicate(visitor.alloc(it));
3803        visitor.enter_node(kind);
3804        visitor.visit_span(&it.span);
3805        visitor.visit_ts_type_predicate_name(&it.parameter_name);
3806        if let Some(type_annotation) = &it.type_annotation {
3807            visitor.visit_ts_type_annotation(type_annotation);
3808        }
3809        visitor.leave_node(kind);
3810    }
3811
3812    #[inline]
3813    pub fn walk_ts_type_predicate_name<'a, V: Visit<'a>>(
3814        visitor: &mut V,
3815        it: &TSTypePredicateName<'a>,
3816    ) {
3817        // No `AstKind` for this type
3818        match it {
3819            TSTypePredicateName::Identifier(it) => visitor.visit_identifier_name(it),
3820            TSTypePredicateName::This(it) => visitor.visit_ts_this_type(it),
3821        }
3822    }
3823
3824    #[inline]
3825    pub fn walk_ts_module_declaration<'a, V: Visit<'a>>(
3826        visitor: &mut V,
3827        it: &TSModuleDeclaration<'a>,
3828    ) {
3829        let kind = AstKind::TSModuleDeclaration(visitor.alloc(it));
3830        visitor.enter_node(kind);
3831        visitor.visit_span(&it.span);
3832        visitor.visit_ts_module_declaration_name(&it.id);
3833        visitor.enter_scope(
3834            {
3835                let mut flags = ScopeFlags::TsModuleBlock;
3836                if it.body.as_ref().is_some_and(TSModuleDeclarationBody::has_use_strict_directive) {
3837                    flags |= ScopeFlags::StrictMode;
3838                }
3839                flags
3840            },
3841            &it.scope_id,
3842        );
3843        if let Some(body) = &it.body {
3844            visitor.visit_ts_module_declaration_body(body);
3845        }
3846        visitor.leave_scope();
3847        visitor.leave_node(kind);
3848    }
3849
3850    #[inline]
3851    pub fn walk_ts_module_declaration_name<'a, V: Visit<'a>>(
3852        visitor: &mut V,
3853        it: &TSModuleDeclarationName<'a>,
3854    ) {
3855        // No `AstKind` for this type
3856        match it {
3857            TSModuleDeclarationName::Identifier(it) => visitor.visit_binding_identifier(it),
3858            TSModuleDeclarationName::StringLiteral(it) => visitor.visit_string_literal(it),
3859        }
3860    }
3861
3862    #[inline]
3863    pub fn walk_ts_module_declaration_body<'a, V: Visit<'a>>(
3864        visitor: &mut V,
3865        it: &TSModuleDeclarationBody<'a>,
3866    ) {
3867        // No `AstKind` for this type
3868        match it {
3869            TSModuleDeclarationBody::TSModuleDeclaration(it) => {
3870                visitor.visit_ts_module_declaration(it)
3871            }
3872            TSModuleDeclarationBody::TSModuleBlock(it) => visitor.visit_ts_module_block(it),
3873        }
3874    }
3875
3876    #[inline]
3877    pub fn walk_ts_module_block<'a, V: Visit<'a>>(visitor: &mut V, it: &TSModuleBlock<'a>) {
3878        let kind = AstKind::TSModuleBlock(visitor.alloc(it));
3879        visitor.enter_node(kind);
3880        visitor.visit_span(&it.span);
3881        visitor.visit_directives(&it.directives);
3882        visitor.visit_statements(&it.body);
3883        visitor.leave_node(kind);
3884    }
3885
3886    #[inline]
3887    pub fn walk_ts_type_literal<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeLiteral<'a>) {
3888        let kind = AstKind::TSTypeLiteral(visitor.alloc(it));
3889        visitor.enter_node(kind);
3890        visitor.visit_span(&it.span);
3891        visitor.visit_ts_signatures(&it.members);
3892        visitor.leave_node(kind);
3893    }
3894
3895    #[inline]
3896    pub fn walk_ts_infer_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSInferType<'a>) {
3897        let kind = AstKind::TSInferType(visitor.alloc(it));
3898        visitor.enter_node(kind);
3899        visitor.visit_span(&it.span);
3900        visitor.visit_ts_type_parameter(&it.type_parameter);
3901        visitor.leave_node(kind);
3902    }
3903
3904    #[inline]
3905    pub fn walk_ts_type_query<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeQuery<'a>) {
3906        let kind = AstKind::TSTypeQuery(visitor.alloc(it));
3907        visitor.enter_node(kind);
3908        visitor.visit_span(&it.span);
3909        visitor.visit_ts_type_query_expr_name(&it.expr_name);
3910        if let Some(type_arguments) = &it.type_arguments {
3911            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3912        }
3913        visitor.leave_node(kind);
3914    }
3915
3916    #[inline]
3917    pub fn walk_ts_type_query_expr_name<'a, V: Visit<'a>>(
3918        visitor: &mut V,
3919        it: &TSTypeQueryExprName<'a>,
3920    ) {
3921        // No `AstKind` for this type
3922        match it {
3923            TSTypeQueryExprName::TSImportType(it) => visitor.visit_ts_import_type(it),
3924            match_ts_type_name!(TSTypeQueryExprName) => {
3925                visitor.visit_ts_type_name(it.to_ts_type_name())
3926            }
3927        }
3928    }
3929
3930    #[inline]
3931    pub fn walk_ts_import_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSImportType<'a>) {
3932        let kind = AstKind::TSImportType(visitor.alloc(it));
3933        visitor.enter_node(kind);
3934        visitor.visit_span(&it.span);
3935        visitor.visit_ts_type(&it.argument);
3936        if let Some(options) = &it.options {
3937            visitor.visit_object_expression(options);
3938        }
3939        if let Some(qualifier) = &it.qualifier {
3940            visitor.visit_ts_import_type_qualifier(qualifier);
3941        }
3942        if let Some(type_arguments) = &it.type_arguments {
3943            visitor.visit_ts_type_parameter_instantiation(type_arguments);
3944        }
3945        visitor.leave_node(kind);
3946    }
3947
3948    #[inline]
3949    pub fn walk_ts_import_type_qualifier<'a, V: Visit<'a>>(
3950        visitor: &mut V,
3951        it: &TSImportTypeQualifier<'a>,
3952    ) {
3953        // No `AstKind` for this type
3954        match it {
3955            TSImportTypeQualifier::Identifier(it) => visitor.visit_identifier_name(it),
3956            TSImportTypeQualifier::QualifiedName(it) => {
3957                visitor.visit_ts_import_type_qualified_name(it)
3958            }
3959        }
3960    }
3961
3962    #[inline]
3963    pub fn walk_ts_import_type_qualified_name<'a, V: Visit<'a>>(
3964        visitor: &mut V,
3965        it: &TSImportTypeQualifiedName<'a>,
3966    ) {
3967        let kind = AstKind::TSImportTypeQualifiedName(visitor.alloc(it));
3968        visitor.enter_node(kind);
3969        visitor.visit_span(&it.span);
3970        visitor.visit_ts_import_type_qualifier(&it.left);
3971        visitor.visit_identifier_name(&it.right);
3972        visitor.leave_node(kind);
3973    }
3974
3975    #[inline]
3976    pub fn walk_ts_function_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSFunctionType<'a>) {
3977        let kind = AstKind::TSFunctionType(visitor.alloc(it));
3978        visitor.enter_node(kind);
3979        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
3980        visitor.visit_span(&it.span);
3981        if let Some(type_parameters) = &it.type_parameters {
3982            visitor.visit_ts_type_parameter_declaration(type_parameters);
3983        }
3984        if let Some(this_param) = &it.this_param {
3985            visitor.visit_ts_this_parameter(this_param);
3986        }
3987        visitor.visit_formal_parameters(&it.params);
3988        visitor.visit_ts_type_annotation(&it.return_type);
3989        visitor.leave_scope();
3990        visitor.leave_node(kind);
3991    }
3992
3993    #[inline]
3994    pub fn walk_ts_constructor_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSConstructorType<'a>) {
3995        let kind = AstKind::TSConstructorType(visitor.alloc(it));
3996        visitor.enter_node(kind);
3997        visitor.visit_span(&it.span);
3998        if let Some(type_parameters) = &it.type_parameters {
3999            visitor.visit_ts_type_parameter_declaration(type_parameters);
4000        }
4001        visitor.visit_formal_parameters(&it.params);
4002        visitor.visit_ts_type_annotation(&it.return_type);
4003        visitor.leave_node(kind);
4004    }
4005
4006    #[inline]
4007    pub fn walk_ts_mapped_type<'a, V: Visit<'a>>(visitor: &mut V, it: &TSMappedType<'a>) {
4008        let kind = AstKind::TSMappedType(visitor.alloc(it));
4009        visitor.enter_node(kind);
4010        visitor.enter_scope(ScopeFlags::empty(), &it.scope_id);
4011        visitor.visit_span(&it.span);
4012        visitor.visit_ts_type_parameter(&it.type_parameter);
4013        if let Some(name_type) = &it.name_type {
4014            visitor.visit_ts_type(name_type);
4015        }
4016        if let Some(type_annotation) = &it.type_annotation {
4017            visitor.visit_ts_type(type_annotation);
4018        }
4019        visitor.leave_scope();
4020        visitor.leave_node(kind);
4021    }
4022
4023    #[inline]
4024    pub fn walk_ts_template_literal_type<'a, V: Visit<'a>>(
4025        visitor: &mut V,
4026        it: &TSTemplateLiteralType<'a>,
4027    ) {
4028        let kind = AstKind::TSTemplateLiteralType(visitor.alloc(it));
4029        visitor.enter_node(kind);
4030        visitor.visit_span(&it.span);
4031        visitor.visit_template_elements(&it.quasis);
4032        visitor.visit_ts_types(&it.types);
4033        visitor.leave_node(kind);
4034    }
4035
4036    #[inline]
4037    pub fn walk_ts_as_expression<'a, V: Visit<'a>>(visitor: &mut V, it: &TSAsExpression<'a>) {
4038        let kind = AstKind::TSAsExpression(visitor.alloc(it));
4039        visitor.enter_node(kind);
4040        visitor.visit_span(&it.span);
4041        visitor.visit_expression(&it.expression);
4042        visitor.visit_ts_type(&it.type_annotation);
4043        visitor.leave_node(kind);
4044    }
4045
4046    #[inline]
4047    pub fn walk_ts_satisfies_expression<'a, V: Visit<'a>>(
4048        visitor: &mut V,
4049        it: &TSSatisfiesExpression<'a>,
4050    ) {
4051        let kind = AstKind::TSSatisfiesExpression(visitor.alloc(it));
4052        visitor.enter_node(kind);
4053        visitor.visit_span(&it.span);
4054        visitor.visit_expression(&it.expression);
4055        visitor.visit_ts_type(&it.type_annotation);
4056        visitor.leave_node(kind);
4057    }
4058
4059    #[inline]
4060    pub fn walk_ts_type_assertion<'a, V: Visit<'a>>(visitor: &mut V, it: &TSTypeAssertion<'a>) {
4061        let kind = AstKind::TSTypeAssertion(visitor.alloc(it));
4062        visitor.enter_node(kind);
4063        visitor.visit_span(&it.span);
4064        visitor.visit_ts_type(&it.type_annotation);
4065        visitor.visit_expression(&it.expression);
4066        visitor.leave_node(kind);
4067    }
4068
4069    #[inline]
4070    pub fn walk_ts_import_equals_declaration<'a, V: Visit<'a>>(
4071        visitor: &mut V,
4072        it: &TSImportEqualsDeclaration<'a>,
4073    ) {
4074        let kind = AstKind::TSImportEqualsDeclaration(visitor.alloc(it));
4075        visitor.enter_node(kind);
4076        visitor.visit_span(&it.span);
4077        visitor.visit_binding_identifier(&it.id);
4078        visitor.visit_ts_module_reference(&it.module_reference);
4079        visitor.leave_node(kind);
4080    }
4081
4082    #[inline]
4083    pub fn walk_ts_module_reference<'a, V: Visit<'a>>(visitor: &mut V, it: &TSModuleReference<'a>) {
4084        // No `AstKind` for this type
4085        match it {
4086            TSModuleReference::ExternalModuleReference(it) => {
4087                visitor.visit_ts_external_module_reference(it)
4088            }
4089            match_ts_type_name!(TSModuleReference) => {
4090                visitor.visit_ts_type_name(it.to_ts_type_name())
4091            }
4092        }
4093    }
4094
4095    #[inline]
4096    pub fn walk_ts_external_module_reference<'a, V: Visit<'a>>(
4097        visitor: &mut V,
4098        it: &TSExternalModuleReference<'a>,
4099    ) {
4100        let kind = AstKind::TSExternalModuleReference(visitor.alloc(it));
4101        visitor.enter_node(kind);
4102        visitor.visit_span(&it.span);
4103        visitor.visit_string_literal(&it.expression);
4104        visitor.leave_node(kind);
4105    }
4106
4107    #[inline]
4108    pub fn walk_ts_non_null_expression<'a, V: Visit<'a>>(
4109        visitor: &mut V,
4110        it: &TSNonNullExpression<'a>,
4111    ) {
4112        let kind = AstKind::TSNonNullExpression(visitor.alloc(it));
4113        visitor.enter_node(kind);
4114        visitor.visit_span(&it.span);
4115        visitor.visit_expression(&it.expression);
4116        visitor.leave_node(kind);
4117    }
4118
4119    #[inline]
4120    pub fn walk_decorator<'a, V: Visit<'a>>(visitor: &mut V, it: &Decorator<'a>) {
4121        let kind = AstKind::Decorator(visitor.alloc(it));
4122        visitor.enter_node(kind);
4123        visitor.visit_span(&it.span);
4124        visitor.visit_expression(&it.expression);
4125        visitor.leave_node(kind);
4126    }
4127
4128    #[inline]
4129    pub fn walk_ts_export_assignment<'a, V: Visit<'a>>(
4130        visitor: &mut V,
4131        it: &TSExportAssignment<'a>,
4132    ) {
4133        let kind = AstKind::TSExportAssignment(visitor.alloc(it));
4134        visitor.enter_node(kind);
4135        visitor.visit_span(&it.span);
4136        visitor.visit_expression(&it.expression);
4137        visitor.leave_node(kind);
4138    }
4139
4140    #[inline]
4141    pub fn walk_ts_namespace_export_declaration<'a, V: Visit<'a>>(
4142        visitor: &mut V,
4143        it: &TSNamespaceExportDeclaration<'a>,
4144    ) {
4145        let kind = AstKind::TSNamespaceExportDeclaration(visitor.alloc(it));
4146        visitor.enter_node(kind);
4147        visitor.visit_span(&it.span);
4148        visitor.visit_identifier_name(&it.id);
4149        visitor.leave_node(kind);
4150    }
4151
4152    #[inline]
4153    pub fn walk_ts_instantiation_expression<'a, V: Visit<'a>>(
4154        visitor: &mut V,
4155        it: &TSInstantiationExpression<'a>,
4156    ) {
4157        let kind = AstKind::TSInstantiationExpression(visitor.alloc(it));
4158        visitor.enter_node(kind);
4159        visitor.visit_span(&it.span);
4160        visitor.visit_expression(&it.expression);
4161        visitor.visit_ts_type_parameter_instantiation(&it.type_arguments);
4162        visitor.leave_node(kind);
4163    }
4164
4165    #[inline]
4166    pub fn walk_js_doc_nullable_type<'a, V: Visit<'a>>(
4167        visitor: &mut V,
4168        it: &JSDocNullableType<'a>,
4169    ) {
4170        let kind = AstKind::JSDocNullableType(visitor.alloc(it));
4171        visitor.enter_node(kind);
4172        visitor.visit_span(&it.span);
4173        visitor.visit_ts_type(&it.type_annotation);
4174        visitor.leave_node(kind);
4175    }
4176
4177    #[inline]
4178    pub fn walk_js_doc_non_nullable_type<'a, V: Visit<'a>>(
4179        visitor: &mut V,
4180        it: &JSDocNonNullableType<'a>,
4181    ) {
4182        let kind = AstKind::JSDocNonNullableType(visitor.alloc(it));
4183        visitor.enter_node(kind);
4184        visitor.visit_span(&it.span);
4185        visitor.visit_ts_type(&it.type_annotation);
4186        visitor.leave_node(kind);
4187    }
4188
4189    #[inline]
4190    pub fn walk_js_doc_unknown_type<'a, V: Visit<'a>>(visitor: &mut V, it: &JSDocUnknownType) {
4191        let kind = AstKind::JSDocUnknownType(visitor.alloc(it));
4192        visitor.enter_node(kind);
4193        visitor.visit_span(&it.span);
4194        visitor.leave_node(kind);
4195    }
4196
4197    #[inline]
4198    pub fn walk_span<'a, V: Visit<'a>>(visitor: &mut V, it: &Span) {
4199        // No `AstKind` for this type
4200    }
4201
4202    #[inline]
4203    pub fn walk_directives<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Directive<'a>>) {
4204        for el in it {
4205            visitor.visit_directive(el);
4206        }
4207    }
4208
4209    #[inline]
4210    pub fn walk_statements<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Statement<'a>>) {
4211        for el in it {
4212            visitor.visit_statement(el);
4213        }
4214    }
4215
4216    #[inline]
4217    pub fn walk_array_expression_elements<'a, V: Visit<'a>>(
4218        visitor: &mut V,
4219        it: &Vec<'a, ArrayExpressionElement<'a>>,
4220    ) {
4221        for el in it {
4222            visitor.visit_array_expression_element(el);
4223        }
4224    }
4225
4226    #[inline]
4227    pub fn walk_object_property_kinds<'a, V: Visit<'a>>(
4228        visitor: &mut V,
4229        it: &Vec<'a, ObjectPropertyKind<'a>>,
4230    ) {
4231        for el in it {
4232            visitor.visit_object_property_kind(el);
4233        }
4234    }
4235
4236    #[inline]
4237    pub fn walk_template_elements<'a, V: Visit<'a>>(
4238        visitor: &mut V,
4239        it: &Vec<'a, TemplateElement<'a>>,
4240    ) {
4241        for el in it {
4242            visitor.visit_template_element(el);
4243        }
4244    }
4245
4246    #[inline]
4247    pub fn walk_expressions<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Expression<'a>>) {
4248        for el in it {
4249            visitor.visit_expression(el);
4250        }
4251    }
4252
4253    #[inline]
4254    pub fn walk_arguments<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Argument<'a>>) {
4255        for el in it {
4256            visitor.visit_argument(el);
4257        }
4258    }
4259
4260    #[inline]
4261    pub fn walk_assignment_target_properties<'a, V: Visit<'a>>(
4262        visitor: &mut V,
4263        it: &Vec<'a, AssignmentTargetProperty<'a>>,
4264    ) {
4265        for el in it {
4266            visitor.visit_assignment_target_property(el);
4267        }
4268    }
4269
4270    #[inline]
4271    pub fn walk_variable_declarators<'a, V: Visit<'a>>(
4272        visitor: &mut V,
4273        it: &Vec<'a, VariableDeclarator<'a>>,
4274    ) {
4275        for el in it {
4276            visitor.visit_variable_declarator(el);
4277        }
4278    }
4279
4280    #[inline]
4281    pub fn walk_switch_cases<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, SwitchCase<'a>>) {
4282        for el in it {
4283            visitor.visit_switch_case(el);
4284        }
4285    }
4286
4287    #[inline]
4288    pub fn walk_binding_properties<'a, V: Visit<'a>>(
4289        visitor: &mut V,
4290        it: &Vec<'a, BindingProperty<'a>>,
4291    ) {
4292        for el in it {
4293            visitor.visit_binding_property(el);
4294        }
4295    }
4296
4297    #[inline]
4298    pub fn walk_formal_parameter_list<'a, V: Visit<'a>>(
4299        visitor: &mut V,
4300        it: &Vec<'a, FormalParameter<'a>>,
4301    ) {
4302        for el in it {
4303            visitor.visit_formal_parameter(el);
4304        }
4305    }
4306
4307    #[inline]
4308    pub fn walk_decorators<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Decorator<'a>>) {
4309        for el in it {
4310            visitor.visit_decorator(el);
4311        }
4312    }
4313
4314    #[inline]
4315    pub fn walk_ts_class_implements_list<'a, V: Visit<'a>>(
4316        visitor: &mut V,
4317        it: &Vec<'a, TSClassImplements<'a>>,
4318    ) {
4319        for el in it {
4320            visitor.visit_ts_class_implements(el);
4321        }
4322    }
4323
4324    #[inline]
4325    pub fn walk_class_elements<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, ClassElement<'a>>) {
4326        for el in it {
4327            visitor.visit_class_element(el);
4328        }
4329    }
4330
4331    #[inline]
4332    pub fn walk_import_declaration_specifiers<'a, V: Visit<'a>>(
4333        visitor: &mut V,
4334        it: &Vec<'a, ImportDeclarationSpecifier<'a>>,
4335    ) {
4336        for el in it {
4337            visitor.visit_import_declaration_specifier(el);
4338        }
4339    }
4340
4341    #[inline]
4342    pub fn walk_import_attributes<'a, V: Visit<'a>>(
4343        visitor: &mut V,
4344        it: &Vec<'a, ImportAttribute<'a>>,
4345    ) {
4346        for el in it {
4347            visitor.visit_import_attribute(el);
4348        }
4349    }
4350
4351    #[inline]
4352    pub fn walk_export_specifiers<'a, V: Visit<'a>>(
4353        visitor: &mut V,
4354        it: &Vec<'a, ExportSpecifier<'a>>,
4355    ) {
4356        for el in it {
4357            visitor.visit_export_specifier(el);
4358        }
4359    }
4360
4361    #[inline]
4362    pub fn walk_jsx_children<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, JSXChild<'a>>) {
4363        for el in it {
4364            visitor.visit_jsx_child(el);
4365        }
4366    }
4367
4368    #[inline]
4369    pub fn walk_jsx_attribute_items<'a, V: Visit<'a>>(
4370        visitor: &mut V,
4371        it: &Vec<'a, JSXAttributeItem<'a>>,
4372    ) {
4373        for el in it {
4374            visitor.visit_jsx_attribute_item(el);
4375        }
4376    }
4377
4378    #[inline]
4379    pub fn walk_ts_enum_members<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, TSEnumMember<'a>>) {
4380        for el in it {
4381            visitor.visit_ts_enum_member(el);
4382        }
4383    }
4384
4385    #[inline]
4386    pub fn walk_ts_types<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, TSType<'a>>) {
4387        for el in it {
4388            visitor.visit_ts_type(el);
4389        }
4390    }
4391
4392    #[inline]
4393    pub fn walk_ts_tuple_elements<'a, V: Visit<'a>>(
4394        visitor: &mut V,
4395        it: &Vec<'a, TSTupleElement<'a>>,
4396    ) {
4397        for el in it {
4398            visitor.visit_ts_tuple_element(el);
4399        }
4400    }
4401
4402    #[inline]
4403    pub fn walk_ts_type_parameters<'a, V: Visit<'a>>(
4404        visitor: &mut V,
4405        it: &Vec<'a, TSTypeParameter<'a>>,
4406    ) {
4407        for el in it {
4408            visitor.visit_ts_type_parameter(el);
4409        }
4410    }
4411
4412    #[inline]
4413    pub fn walk_ts_interface_heritages<'a, V: Visit<'a>>(
4414        visitor: &mut V,
4415        it: &Vec<'a, TSInterfaceHeritage<'a>>,
4416    ) {
4417        for el in it {
4418            visitor.visit_ts_interface_heritage(el);
4419        }
4420    }
4421
4422    #[inline]
4423    pub fn walk_ts_signatures<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, TSSignature<'a>>) {
4424        for el in it {
4425            visitor.visit_ts_signature(el);
4426        }
4427    }
4428
4429    #[inline]
4430    pub fn walk_ts_index_signature_names<'a, V: Visit<'a>>(
4431        visitor: &mut V,
4432        it: &Vec<'a, TSIndexSignatureName<'a>>,
4433    ) {
4434        for el in it {
4435            visitor.visit_ts_index_signature_name(el);
4436        }
4437    }
4438
4439    #[inline]
4440    pub fn walk_spans<'a, V: Visit<'a>>(visitor: &mut V, it: &Vec<'a, Span>) {
4441        for el in it {
4442            visitor.visit_span(el);
4443        }
4444    }
4445}