Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


SSL visit_generated.rs   Interaktion und
Portierbarkeitunbekannt

 
Spracherkennung für: .rs vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

// WARNING: This file is auto-generated.

#![allow(unused_mut)]
#![allow(unused_parens)]
#![allow(unused_variables)]
#![allow(dead_code)]

use crate::arena;
use crate::source_atom_set::SourceAtomSetIndex;
use crate::source_slice_list::SourceSliceIndex;
use crate::types::*;

pub trait Pass<'alloc> {
    fn visit_argument(&mut self, ast: &'alloc Argument<'alloc>) {
        self.enter_argument(ast);
        match ast {
            Argument::SpreadElement(ast) => {
                self.visit_enum_argument_variant_spread_element(ast)
            }
            Argument::Expression(ast) => {
                self.visit_enum_argument_variant_expression(ast)
            }
        }
        self.leave_argument(ast);
    }

    fn enter_argument(&mut self, ast: &'alloc Argument<'alloc>) {
    }

    fn leave_argument(&mut self, ast: &'alloc Argument<'alloc>) {
    }

    fn visit_enum_argument_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_argument_variant_spread_element(ast);
        self.visit_expression(ast);
        self.leave_enum_argument_variant_spread_element(ast);
    }

    fn enter_enum_argument_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_argument_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_argument_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_argument_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_argument_variant_expression(ast);
    }

    fn enter_enum_argument_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_argument_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
        self.enter_arguments(ast);
        for item in &ast.args {
            self.visit_argument(item);
        }
        self.leave_arguments(ast);
    }

    fn enter_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
    }

    fn leave_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
    }

    fn visit_identifier(&mut self, ast: &'alloc Identifier) {
        self.enter_identifier(ast);
        self.leave_identifier(ast);
    }

    fn enter_identifier(&mut self, ast: &'alloc Identifier) {
    }

    fn leave_identifier(&mut self, ast: &'alloc Identifier) {
    }

    fn visit_identifier_name(&mut self, ast: &'alloc IdentifierName) {
        self.enter_identifier_name(ast);
        self.leave_identifier_name(ast);
    }

    fn enter_identifier_name(&mut self, ast: &'alloc IdentifierName) {
    }

    fn leave_identifier_name(&mut self, ast: &'alloc IdentifierName) {
    }

    fn visit_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
        self.enter_private_identifier(ast);
        self.leave_private_identifier(ast);
    }

    fn enter_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
    }

    fn leave_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
    }

    fn visit_label(&mut self, ast: &'alloc Label) {
        self.enter_label(ast);
        self.leave_label(ast);
    }

    fn enter_label(&mut self, ast: &'alloc Label) {
    }

    fn leave_label(&mut self, ast: &'alloc Label) {
    }

    fn visit_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
        self.enter_variable_declaration_kind(ast);
        match ast {
            VariableDeclarationKind::Var { .. } => {
                self.visit_enum_variable_declaration_kind_variant_var()
            }
            VariableDeclarationKind::Let { .. } => {
                self.visit_enum_variable_declaration_kind_variant_let()
            }
            VariableDeclarationKind::Const { .. } => {
                self.visit_enum_variable_declaration_kind_variant_const()
            }
        }
        self.leave_variable_declaration_kind(ast);
    }

    fn enter_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
    }

    fn leave_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
    }

    fn visit_enum_variable_declaration_kind_variant_var(&mut self) {
    }

    fn visit_enum_variable_declaration_kind_variant_let(&mut self) {
    }

    fn visit_enum_variable_declaration_kind_variant_const(&mut self) {
    }

    fn visit_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
        self.enter_compound_assignment_operator(ast);
        match ast {
            CompoundAssignmentOperator::LogicalOr { .. } => {
                self.visit_enum_compound_assignment_operator_variant_logical_or()
            }
            CompoundAssignmentOperator::LogicalAnd { .. } => {
                self.visit_enum_compound_assignment_operator_variant_logical_and()
            }
            CompoundAssignmentOperator::Coalesce { .. } => {
                self.visit_enum_compound_assignment_operator_variant_coalesce()
            }
            CompoundAssignmentOperator::Add { .. } => {
                self.visit_enum_compound_assignment_operator_variant_add()
            }
            CompoundAssignmentOperator::Sub { .. } => {
                self.visit_enum_compound_assignment_operator_variant_sub()
            }
            CompoundAssignmentOperator::Mul { .. } => {
                self.visit_enum_compound_assignment_operator_variant_mul()
            }
            CompoundAssignmentOperator::Div { .. } => {
                self.visit_enum_compound_assignment_operator_variant_div()
            }
            CompoundAssignmentOperator::Mod { .. } => {
                self.visit_enum_compound_assignment_operator_variant_mod()
            }
            CompoundAssignmentOperator::Pow { .. } => {
                self.visit_enum_compound_assignment_operator_variant_pow()
            }
            CompoundAssignmentOperator::LeftShift { .. } => {
                self.visit_enum_compound_assignment_operator_variant_left_shift()
            }
            CompoundAssignmentOperator::RightShift { .. } => {
                self.visit_enum_compound_assignment_operator_variant_right_shift()
            }
            CompoundAssignmentOperator::RightShiftExt { .. } => {
                self.visit_enum_compound_assignment_operator_variant_right_shift_ext()
            }
            CompoundAssignmentOperator::Or { .. } => {
                self.visit_enum_compound_assignment_operator_variant_or()
            }
            CompoundAssignmentOperator::Xor { .. } => {
                self.visit_enum_compound_assignment_operator_variant_xor()
            }
            CompoundAssignmentOperator::And { .. } => {
                self.visit_enum_compound_assignment_operator_variant_and()
            }
        }
        self.leave_compound_assignment_operator(ast);
    }

    fn enter_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
    }

    fn leave_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
    }

    fn visit_enum_compound_assignment_operator_variant_logical_or(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_logical_and(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_coalesce(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_add(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_sub(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_mul(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_div(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_mod(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_pow(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_left_shift(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_right_shift(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_right_shift_ext(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_or(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_xor(&mut self) {
    }

    fn visit_enum_compound_assignment_operator_variant_and(&mut self) {
    }

    fn visit_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
        self.enter_binary_operator(ast);
        match ast {
            BinaryOperator::Equals { .. } => {
                self.visit_enum_binary_operator_variant_equals()
            }
            BinaryOperator::NotEquals { .. } => {
                self.visit_enum_binary_operator_variant_not_equals()
            }
            BinaryOperator::StrictEquals { .. } => {
                self.visit_enum_binary_operator_variant_strict_equals()
            }
            BinaryOperator::StrictNotEquals { .. } => {
                self.visit_enum_binary_operator_variant_strict_not_equals()
            }
            BinaryOperator::LessThan { .. } => {
                self.visit_enum_binary_operator_variant_less_than()
            }
            BinaryOperator::LessThanOrEqual { .. } => {
                self.visit_enum_binary_operator_variant_less_than_or_equal()
            }
            BinaryOperator::GreaterThan { .. } => {
                self.visit_enum_binary_operator_variant_greater_than()
            }
            BinaryOperator::GreaterThanOrEqual { .. } => {
                self.visit_enum_binary_operator_variant_greater_than_or_equal()
            }
            BinaryOperator::In { .. } => {
                self.visit_enum_binary_operator_variant_in()
            }
            BinaryOperator::Instanceof { .. } => {
                self.visit_enum_binary_operator_variant_instanceof()
            }
            BinaryOperator::LeftShift { .. } => {
                self.visit_enum_binary_operator_variant_left_shift()
            }
            BinaryOperator::RightShift { .. } => {
                self.visit_enum_binary_operator_variant_right_shift()
            }
            BinaryOperator::RightShiftExt { .. } => {
                self.visit_enum_binary_operator_variant_right_shift_ext()
            }
            BinaryOperator::Add { .. } => {
                self.visit_enum_binary_operator_variant_add()
            }
            BinaryOperator::Sub { .. } => {
                self.visit_enum_binary_operator_variant_sub()
            }
            BinaryOperator::Mul { .. } => {
                self.visit_enum_binary_operator_variant_mul()
            }
            BinaryOperator::Div { .. } => {
                self.visit_enum_binary_operator_variant_div()
            }
            BinaryOperator::Mod { .. } => {
                self.visit_enum_binary_operator_variant_mod()
            }
            BinaryOperator::Pow { .. } => {
                self.visit_enum_binary_operator_variant_pow()
            }
            BinaryOperator::Comma { .. } => {
                self.visit_enum_binary_operator_variant_comma()
            }
            BinaryOperator::Coalesce { .. } => {
                self.visit_enum_binary_operator_variant_coalesce()
            }
            BinaryOperator::LogicalOr { .. } => {
                self.visit_enum_binary_operator_variant_logical_or()
            }
            BinaryOperator::LogicalAnd { .. } => {
                self.visit_enum_binary_operator_variant_logical_and()
            }
            BinaryOperator::BitwiseOr { .. } => {
                self.visit_enum_binary_operator_variant_bitwise_or()
            }
            BinaryOperator::BitwiseXor { .. } => {
                self.visit_enum_binary_operator_variant_bitwise_xor()
            }
            BinaryOperator::BitwiseAnd { .. } => {
                self.visit_enum_binary_operator_variant_bitwise_and()
            }
        }
        self.leave_binary_operator(ast);
    }

    fn enter_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
    }

    fn leave_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
    }

    fn visit_enum_binary_operator_variant_equals(&mut self) {
    }

    fn visit_enum_binary_operator_variant_not_equals(&mut self) {
    }

    fn visit_enum_binary_operator_variant_strict_equals(&mut self) {
    }

    fn visit_enum_binary_operator_variant_strict_not_equals(&mut self) {
    }

    fn visit_enum_binary_operator_variant_less_than(&mut self) {
    }

    fn visit_enum_binary_operator_variant_less_than_or_equal(&mut self) {
    }

    fn visit_enum_binary_operator_variant_greater_than(&mut self) {
    }

    fn visit_enum_binary_operator_variant_greater_than_or_equal(&mut self) {
    }

    fn visit_enum_binary_operator_variant_in(&mut self) {
    }

    fn visit_enum_binary_operator_variant_instanceof(&mut self) {
    }

    fn visit_enum_binary_operator_variant_left_shift(&mut self) {
    }

    fn visit_enum_binary_operator_variant_right_shift(&mut self) {
    }

    fn visit_enum_binary_operator_variant_right_shift_ext(&mut self) {
    }

    fn visit_enum_binary_operator_variant_add(&mut self) {
    }

    fn visit_enum_binary_operator_variant_sub(&mut self) {
    }

    fn visit_enum_binary_operator_variant_mul(&mut self) {
    }

    fn visit_enum_binary_operator_variant_div(&mut self) {
    }

    fn visit_enum_binary_operator_variant_mod(&mut self) {
    }

    fn visit_enum_binary_operator_variant_pow(&mut self) {
    }

    fn visit_enum_binary_operator_variant_comma(&mut self) {
    }

    fn visit_enum_binary_operator_variant_coalesce(&mut self) {
    }

    fn visit_enum_binary_operator_variant_logical_or(&mut self) {
    }

    fn visit_enum_binary_operator_variant_logical_and(&mut self) {
    }

    fn visit_enum_binary_operator_variant_bitwise_or(&mut self) {
    }

    fn visit_enum_binary_operator_variant_bitwise_xor(&mut self) {
    }

    fn visit_enum_binary_operator_variant_bitwise_and(&mut self) {
    }

    fn visit_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
        self.enter_unary_operator(ast);
        match ast {
            UnaryOperator::Plus { .. } => {
                self.visit_enum_unary_operator_variant_plus()
            }
            UnaryOperator::Minus { .. } => {
                self.visit_enum_unary_operator_variant_minus()
            }
            UnaryOperator::LogicalNot { .. } => {
                self.visit_enum_unary_operator_variant_logical_not()
            }
            UnaryOperator::BitwiseNot { .. } => {
                self.visit_enum_unary_operator_variant_bitwise_not()
            }
            UnaryOperator::Typeof { .. } => {
                self.visit_enum_unary_operator_variant_typeof()
            }
            UnaryOperator::Void { .. } => {
                self.visit_enum_unary_operator_variant_void()
            }
            UnaryOperator::Delete { .. } => {
                self.visit_enum_unary_operator_variant_delete()
            }
        }
        self.leave_unary_operator(ast);
    }

    fn enter_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
    }

    fn leave_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
    }

    fn visit_enum_unary_operator_variant_plus(&mut self) {
    }

    fn visit_enum_unary_operator_variant_minus(&mut self) {
    }

    fn visit_enum_unary_operator_variant_logical_not(&mut self) {
    }

    fn visit_enum_unary_operator_variant_bitwise_not(&mut self) {
    }

    fn visit_enum_unary_operator_variant_typeof(&mut self) {
    }

    fn visit_enum_unary_operator_variant_void(&mut self) {
    }

    fn visit_enum_unary_operator_variant_delete(&mut self) {
    }

    fn visit_update_operator(&mut self, ast: &'alloc UpdateOperator) {
        self.enter_update_operator(ast);
        match ast {
            UpdateOperator::Increment { .. } => {
                self.visit_enum_update_operator_variant_increment()
            }
            UpdateOperator::Decrement { .. } => {
                self.visit_enum_update_operator_variant_decrement()
            }
        }
        self.leave_update_operator(ast);
    }

    fn enter_update_operator(&mut self, ast: &'alloc UpdateOperator) {
    }

    fn leave_update_operator(&mut self, ast: &'alloc UpdateOperator) {
    }

    fn visit_enum_update_operator_variant_increment(&mut self) {
    }

    fn visit_enum_update_operator_variant_decrement(&mut self) {
    }

    fn visit_function(&mut self, ast: &'alloc Function<'alloc>) {
        self.enter_function(ast);
        if let Some(item) = &ast.name {
            self.visit_binding_identifier(item);
        }
        self.visit_formal_parameters(&ast.params);
        self.visit_function_body(&ast.body);
        self.leave_function(ast);
    }

    fn enter_function(&mut self, ast: &'alloc Function<'alloc>) {
    }

    fn leave_function(&mut self, ast: &'alloc Function<'alloc>) {
    }

    fn visit_program(&mut self, ast: &'alloc Program<'alloc>) {
        self.enter_program(ast);
        match ast {
            Program::Module(ast) => {
                self.visit_enum_program_variant_module(ast)
            }
            Program::Script(ast) => {
                self.visit_enum_program_variant_script(ast)
            }
        }
        self.leave_program(ast);
    }

    fn enter_program(&mut self, ast: &'alloc Program<'alloc>) {
    }

    fn leave_program(&mut self, ast: &'alloc Program<'alloc>) {
    }

    fn visit_enum_program_variant_module(
        &mut self,
        ast: &'alloc Module<'alloc>,
    ) {
        self.enter_enum_program_variant_module(ast);
        self.visit_module(ast);
        self.leave_enum_program_variant_module(ast);
    }

    fn enter_enum_program_variant_module(
        &mut self,
        ast: &'alloc Module<'alloc>,
    ) {
    }

    fn leave_enum_program_variant_module(
        &mut self,
        ast: &'alloc Module<'alloc>,
    ) {
    }

    fn visit_enum_program_variant_script(
        &mut self,
        ast: &'alloc Script<'alloc>,
    ) {
        self.enter_enum_program_variant_script(ast);
        self.visit_script(ast);
        self.leave_enum_program_variant_script(ast);
    }

    fn enter_enum_program_variant_script(
        &mut self,
        ast: &'alloc Script<'alloc>,
    ) {
    }

    fn leave_enum_program_variant_script(
        &mut self,
        ast: &'alloc Script<'alloc>,
    ) {
    }

    fn visit_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
        self.enter_if_statement(ast);
        self.visit_expression(&ast.test);
        self.visit_statement(&ast.consequent);
        if let Some(item) = &ast.alternate {
            self.visit_statement(item);
        }
        self.leave_if_statement(ast);
    }

    fn enter_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
    }

    fn leave_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
    }

    fn visit_statement(&mut self, ast: &'alloc Statement<'alloc>) {
        self.enter_statement(ast);
        match ast {
            Statement::BlockStatement { block, .. } => {
                self.visit_enum_statement_variant_block_statement(
                    block,
                )
            }
            Statement::BreakStatement { label, .. } => {
                self.visit_enum_statement_variant_break_statement(
                    label,
                )
            }
            Statement::ContinueStatement { label, .. } => {
                self.visit_enum_statement_variant_continue_statement(
                    label,
                )
            }
            Statement::DebuggerStatement { .. } => {
                self.visit_enum_statement_variant_debugger_statement()
            }
            Statement::DoWhileStatement { block, test, .. } => {
                self.visit_enum_statement_variant_do_while_statement(
                    block,
                    test,
                )
            }
            Statement::EmptyStatement { .. } => {
                self.visit_enum_statement_variant_empty_statement()
            }
            Statement::ExpressionStatement(ast) => {
                self.visit_enum_statement_variant_expression_statement(ast)
            }
            Statement::ForInStatement { left, right, block, .. } => {
                self.visit_enum_statement_variant_for_in_statement(
                    left,
                    right,
                    block,
                )
            }
            Statement::ForOfStatement { left, right, block, .. } => {
                self.visit_enum_statement_variant_for_of_statement(
                    left,
                    right,
                    block,
                )
            }
            Statement::ForStatement { init, test, update, block, .. } => {
                self.visit_enum_statement_variant_for_statement(
                    init,
                    test,
                    update,
                    block,
                )
            }
            Statement::IfStatement(ast) => {
                self.visit_enum_statement_variant_if_statement(ast)
            }
            Statement::LabelledStatement { label, body, .. } => {
                self.visit_enum_statement_variant_labelled_statement(
                    label,
                    body,
                )
            }
            Statement::ReturnStatement { expression, .. } => {
                self.visit_enum_statement_variant_return_statement(
                    expression,
                )
            }
            Statement::SwitchStatement { discriminant, cases, .. } => {
                self.visit_enum_statement_variant_switch_statement(
                    discriminant,
                    cases,
                )
            }
            Statement::SwitchStatementWithDefault { discriminant, pre_default_cases, default_case, post_default_cases, .. } => {
                self.visit_enum_statement_variant_switch_statement_with_default(
                    discriminant,
                    pre_default_cases,
                    default_case,
                    post_default_cases,
                )
            }
            Statement::ThrowStatement { expression, .. } => {
                self.visit_enum_statement_variant_throw_statement(
                    expression,
                )
            }
            Statement::TryCatchStatement { body, catch_clause, .. } => {
                self.visit_enum_statement_variant_try_catch_statement(
                    body,
                    catch_clause,
                )
            }
            Statement::TryFinallyStatement { body, catch_clause, finalizer, .. } => {
                self.visit_enum_statement_variant_try_finally_statement(
                    body,
                    catch_clause,
                    finalizer,
                )
            }
            Statement::WhileStatement { test, block, .. } => {
                self.visit_enum_statement_variant_while_statement(
                    test,
                    block,
                )
            }
            Statement::WithStatement { object, body, .. } => {
                self.visit_enum_statement_variant_with_statement(
                    object,
                    body,
                )
            }
            Statement::VariableDeclarationStatement(ast) => {
                self.visit_enum_statement_variant_variable_declaration_statement(ast)
            }
            Statement::FunctionDeclaration(ast) => {
                self.visit_enum_statement_variant_function_declaration(ast)
            }
            Statement::ClassDeclaration(ast) => {
                self.visit_enum_statement_variant_class_declaration(ast)
            }
        }
        self.leave_statement(ast);
    }

    fn enter_statement(&mut self, ast: &'alloc Statement<'alloc>) {
    }

    fn leave_statement(&mut self, ast: &'alloc Statement<'alloc>) {
    }

    fn visit_enum_statement_variant_block_statement(
        &mut self,
        block: &'alloc Block<'alloc>,
    ) {
        self.enter_enum_statement_variant_block_statement(
            block,
        );
        self.visit_block(block);
        self.leave_enum_statement_variant_block_statement(
            block,
        );
    }

    fn enter_enum_statement_variant_block_statement(
        &mut self,
        block: &'alloc Block<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_block_statement(
        &mut self,
        block: &'alloc Block<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_break_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
        self.enter_enum_statement_variant_break_statement(
            label,
        );
        if let Some(item) = label {
            self.visit_label(item);
        }
        self.leave_enum_statement_variant_break_statement(
            label,
        );
    }

    fn enter_enum_statement_variant_break_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
    }

    fn leave_enum_statement_variant_break_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
    }

    fn visit_enum_statement_variant_continue_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
        self.enter_enum_statement_variant_continue_statement(
            label,
        );
        if let Some(item) = label {
            self.visit_label(item);
        }
        self.leave_enum_statement_variant_continue_statement(
            label,
        );
    }

    fn enter_enum_statement_variant_continue_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
    }

    fn leave_enum_statement_variant_continue_statement(
        &mut self,
        label: &'alloc Option<Label>,
    ) {
    }

    fn visit_enum_statement_variant_debugger_statement(&mut self) {
    }

    fn visit_enum_statement_variant_do_while_statement(
        &mut self,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_statement_variant_do_while_statement(
            block,
            test,
        );
        self.visit_statement(block);
        self.visit_expression(test);
        self.leave_enum_statement_variant_do_while_statement(
            block,
            test,
        );
    }

    fn enter_enum_statement_variant_do_while_statement(
        &mut self,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_do_while_statement(
        &mut self,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_empty_statement(&mut self) {
    }

    fn visit_enum_statement_variant_expression_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_statement_variant_expression_statement(ast);
        self.visit_expression(ast);
        self.leave_enum_statement_variant_expression_statement(ast);
    }

    fn enter_enum_statement_variant_expression_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_expression_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_for_in_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_for_in_statement(
            left,
            right,
            block,
        );
        self.visit_variable_declaration_or_assignment_target(left);
        self.visit_expression(right);
        self.visit_statement(block);
        self.leave_enum_statement_variant_for_in_statement(
            left,
            right,
            block,
        );
    }

    fn enter_enum_statement_variant_for_in_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_for_in_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_for_of_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_for_of_statement(
            left,
            right,
            block,
        );
        self.visit_variable_declaration_or_assignment_target(left);
        self.visit_expression(right);
        self.visit_statement(block);
        self.leave_enum_statement_variant_for_of_statement(
            left,
            right,
            block,
        );
    }

    fn enter_enum_statement_variant_for_of_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_for_of_statement(
        &mut self,
        left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_for_statement(
        &mut self,
        init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
        test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_for_statement(
            init,
            test,
            update,
            block,
        );
        if let Some(item) = init {
            self.visit_variable_declaration_or_expression(item);
        }
        if let Some(item) = test {
            self.visit_expression(item);
        }
        if let Some(item) = update {
            self.visit_expression(item);
        }
        self.visit_statement(block);
        self.leave_enum_statement_variant_for_statement(
            init,
            test,
            update,
            block,
        );
    }

    fn enter_enum_statement_variant_for_statement(
        &mut self,
        init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
        test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_for_statement(
        &mut self,
        init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
        test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_if_statement(
        &mut self,
        ast: &'alloc IfStatement<'alloc>,
    ) {
        self.enter_enum_statement_variant_if_statement(ast);
        self.visit_if_statement(ast);
        self.leave_enum_statement_variant_if_statement(ast);
    }

    fn enter_enum_statement_variant_if_statement(
        &mut self,
        ast: &'alloc IfStatement<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_if_statement(
        &mut self,
        ast: &'alloc IfStatement<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_labelled_statement(
        &mut self,
        label: &'alloc Label,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_labelled_statement(
            label,
            body,
        );
        self.visit_label(label);
        self.visit_statement(body);
        self.leave_enum_statement_variant_labelled_statement(
            label,
            body,
        );
    }

    fn enter_enum_statement_variant_labelled_statement(
        &mut self,
        label: &'alloc Label,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_labelled_statement(
        &mut self,
        label: &'alloc Label,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_return_statement(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
        self.enter_enum_statement_variant_return_statement(
            expression,
        );
        if let Some(item) = expression {
            self.visit_expression(item);
        }
        self.leave_enum_statement_variant_return_statement(
            expression,
        );
    }

    fn enter_enum_statement_variant_return_statement(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn leave_enum_statement_variant_return_statement(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn visit_enum_statement_variant_switch_statement(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
        self.enter_enum_statement_variant_switch_statement(
            discriminant,
            cases,
        );
        self.visit_expression(discriminant);
        for item in cases.iter() {
            self.visit_switch_case(item);
        }
        self.leave_enum_statement_variant_switch_statement(
            discriminant,
            cases,
        );
    }

    fn enter_enum_statement_variant_switch_statement(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_switch_statement(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_switch_statement_with_default(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
        default_case: &'alloc SwitchDefault<'alloc>,
        post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
        self.enter_enum_statement_variant_switch_statement_with_default(
            discriminant,
            pre_default_cases,
            default_case,
            post_default_cases,
        );
        self.visit_expression(discriminant);
        for item in pre_default_cases.iter() {
            self.visit_switch_case(item);
        }
        self.visit_switch_default(default_case);
        for item in post_default_cases.iter() {
            self.visit_switch_case(item);
        }
        self.leave_enum_statement_variant_switch_statement_with_default(
            discriminant,
            pre_default_cases,
            default_case,
            post_default_cases,
        );
    }

    fn enter_enum_statement_variant_switch_statement_with_default(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
        default_case: &'alloc SwitchDefault<'alloc>,
        post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_switch_statement_with_default(
        &mut self,
        discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
        default_case: &'alloc SwitchDefault<'alloc>,
        post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_throw_statement(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_statement_variant_throw_statement(
            expression,
        );
        self.visit_expression(expression);
        self.leave_enum_statement_variant_throw_statement(
            expression,
        );
    }

    fn enter_enum_statement_variant_throw_statement(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_throw_statement(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_try_catch_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc CatchClause<'alloc>,
    ) {
        self.enter_enum_statement_variant_try_catch_statement(
            body,
            catch_clause,
        );
        self.visit_block(body);
        self.visit_catch_clause(catch_clause);
        self.leave_enum_statement_variant_try_catch_statement(
            body,
            catch_clause,
        );
    }

    fn enter_enum_statement_variant_try_catch_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc CatchClause<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_try_catch_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc CatchClause<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_try_finally_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc Option<CatchClause<'alloc>>,
        finalizer: &'alloc Block<'alloc>,
    ) {
        self.enter_enum_statement_variant_try_finally_statement(
            body,
            catch_clause,
            finalizer,
        );
        self.visit_block(body);
        if let Some(item) = catch_clause {
            self.visit_catch_clause(item);
        }
        self.visit_block(finalizer);
        self.leave_enum_statement_variant_try_finally_statement(
            body,
            catch_clause,
            finalizer,
        );
    }

    fn enter_enum_statement_variant_try_finally_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc Option<CatchClause<'alloc>>,
        finalizer: &'alloc Block<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_try_finally_statement(
        &mut self,
        body: &'alloc Block<'alloc>,
        catch_clause: &'alloc Option<CatchClause<'alloc>>,
        finalizer: &'alloc Block<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_while_statement(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_while_statement(
            test,
            block,
        );
        self.visit_expression(test);
        self.visit_statement(block);
        self.leave_enum_statement_variant_while_statement(
            test,
            block,
        );
    }

    fn enter_enum_statement_variant_while_statement(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_while_statement(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_with_statement(
        &mut self,
        object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_statement_variant_with_statement(
            object,
            body,
        );
        self.visit_expression(object);
        self.visit_statement(body);
        self.leave_enum_statement_variant_with_statement(
            object,
            body,
        );
    }

    fn enter_enum_statement_variant_with_statement(
        &mut self,
        object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_statement_variant_with_statement(
        &mut self,
        object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_enum_statement_variant_variable_declaration_statement(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
        self.enter_enum_statement_variant_variable_declaration_statement(ast);
        self.visit_variable_declaration(ast);
        self.leave_enum_statement_variant_variable_declaration_statement(ast);
    }

    fn enter_enum_statement_variant_variable_declaration_statement(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_variable_declaration_statement(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
        self.enter_enum_statement_variant_function_declaration(ast);
        self.visit_function(ast);
        self.leave_enum_statement_variant_function_declaration(ast);
    }

    fn enter_enum_statement_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn visit_enum_statement_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
        self.enter_enum_statement_variant_class_declaration(ast);
        self.visit_class_declaration(ast);
        self.leave_enum_statement_variant_class_declaration(ast);
    }

    fn enter_enum_statement_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_statement_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn visit_expression(&mut self, ast: &'alloc Expression<'alloc>) {
        self.enter_expression(ast);
        match ast {
            Expression::MemberExpression(ast) => {
                self.visit_enum_expression_variant_member_expression(ast)
            }
            Expression::ClassExpression(ast) => {
                self.visit_enum_expression_variant_class_expression(ast)
            }
            Expression::LiteralBooleanExpression { value, .. } => {
                self.visit_enum_expression_variant_literal_boolean_expression(
                    value,
                )
            }
            Expression::LiteralInfinityExpression { .. } => {
                self.visit_enum_expression_variant_literal_infinity_expression()
            }
            Expression::LiteralNullExpression { .. } => {
                self.visit_enum_expression_variant_literal_null_expression()
            }
            Expression::LiteralNumericExpression(ast) => {
                self.visit_enum_expression_variant_literal_numeric_expression(ast)
            }
            Expression::LiteralRegExpExpression { pattern, global, ignore_case, multi_line, dot_all, sticky, unicode, .. } => {
                self.visit_enum_expression_variant_literal_reg_exp_expression(
                    pattern,
                    global,
                    ignore_case,
                    multi_line,
                    dot_all,
                    sticky,
                    unicode,
                )
            }
            Expression::LiteralStringExpression { value, .. } => {
                self.visit_enum_expression_variant_literal_string_expression(
                    value,
                )
            }
            Expression::ArrayExpression(ast) => {
                self.visit_enum_expression_variant_array_expression(ast)
            }
            Expression::ArrowExpression { is_async, params, body, .. } => {
                self.visit_enum_expression_variant_arrow_expression(
                    is_async,
                    params,
                    body,
                )
            }
            Expression::AssignmentExpression { binding, expression, .. } => {
                self.visit_enum_expression_variant_assignment_expression(
                    binding,
                    expression,
                )
            }
            Expression::BinaryExpression { operator, left, right, .. } => {
                self.visit_enum_expression_variant_binary_expression(
                    operator,
                    left,
                    right,
                )
            }
            Expression::CallExpression(ast) => {
                self.visit_enum_expression_variant_call_expression(ast)
            }
            Expression::CompoundAssignmentExpression { operator, binding, expression, .. } => {
                self.visit_enum_expression_variant_compound_assignment_expression(
                    operator,
                    binding,
                    expression,
                )
            }
            Expression::ConditionalExpression { test, consequent, alternate, .. } => {
                self.visit_enum_expression_variant_conditional_expression(
                    test,
                    consequent,
                    alternate,
                )
            }
            Expression::FunctionExpression(ast) => {
                self.visit_enum_expression_variant_function_expression(ast)
            }
            Expression::IdentifierExpression(ast) => {
                self.visit_enum_expression_variant_identifier_expression(ast)
            }
            Expression::NewExpression { callee, arguments, .. } => {
                self.visit_enum_expression_variant_new_expression(
                    callee,
                    arguments,
                )
            }
            Expression::NewTargetExpression { .. } => {
                self.visit_enum_expression_variant_new_target_expression()
            }
            Expression::ObjectExpression(ast) => {
                self.visit_enum_expression_variant_object_expression(ast)
            }
            Expression::OptionalExpression { object, tail, .. } => {
                self.visit_enum_expression_variant_optional_expression(
                    object,
                    tail,
                )
            }
            Expression::OptionalChain(ast) => {
                self.visit_enum_expression_variant_optional_chain(ast)
            }
            Expression::UnaryExpression { operator, operand, .. } => {
                self.visit_enum_expression_variant_unary_expression(
                    operator,
                    operand,
                )
            }
            Expression::TemplateExpression(ast) => {
                self.visit_enum_expression_variant_template_expression(ast)
            }
            Expression::ThisExpression { .. } => {
                self.visit_enum_expression_variant_this_expression()
            }
            Expression::UpdateExpression { is_prefix, operator, operand, .. } => {
                self.visit_enum_expression_variant_update_expression(
                    is_prefix,
                    operator,
                    operand,
                )
            }
            Expression::YieldExpression { expression, .. } => {
                self.visit_enum_expression_variant_yield_expression(
                    expression,
                )
            }
            Expression::YieldGeneratorExpression { expression, .. } => {
                self.visit_enum_expression_variant_yield_generator_expression(
                    expression,
                )
            }
            Expression::AwaitExpression { expression, .. } => {
                self.visit_enum_expression_variant_await_expression(
                    expression,
                )
            }
            Expression::ImportCallExpression { argument, .. } => {
                self.visit_enum_expression_variant_import_call_expression(
                    argument,
                )
            }
        }
        self.leave_expression(ast);
    }

    fn enter_expression(&mut self, ast: &'alloc Expression<'alloc>) {
    }

    fn leave_expression(&mut self, ast: &'alloc Expression<'alloc>) {
    }

    fn visit_enum_expression_variant_member_expression(
        &mut self,
        ast: &'alloc MemberExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_member_expression(ast);
        self.visit_member_expression(ast);
        self.leave_enum_expression_variant_member_expression(ast);
    }

    fn enter_enum_expression_variant_member_expression(
        &mut self,
        ast: &'alloc MemberExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_member_expression(
        &mut self,
        ast: &'alloc MemberExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_class_expression(
        &mut self,
        ast: &'alloc ClassExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_class_expression(ast);
        self.visit_class_expression(ast);
        self.leave_enum_expression_variant_class_expression(ast);
    }

    fn enter_enum_expression_variant_class_expression(
        &mut self,
        ast: &'alloc ClassExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_class_expression(
        &mut self,
        ast: &'alloc ClassExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_literal_boolean_expression(
        &mut self,
        value: &'alloc bool,
    ) {
        self.enter_enum_expression_variant_literal_boolean_expression(
            value,
        );
        self.leave_enum_expression_variant_literal_boolean_expression(
            value,
        );
    }

    fn enter_enum_expression_variant_literal_boolean_expression(
        &mut self,
        value: &'alloc bool,
    ) {
    }

    fn leave_enum_expression_variant_literal_boolean_expression(
        &mut self,
        value: &'alloc bool,
    ) {
    }

    fn visit_enum_expression_variant_literal_infinity_expression(&mut self) {
    }

    fn visit_enum_expression_variant_literal_null_expression(&mut self) {
    }

    fn visit_enum_expression_variant_literal_numeric_expression(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
        self.enter_enum_expression_variant_literal_numeric_expression(ast);
        self.visit_numeric_literal(ast);
        self.leave_enum_expression_variant_literal_numeric_expression(ast);
    }

    fn enter_enum_expression_variant_literal_numeric_expression(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn leave_enum_expression_variant_literal_numeric_expression(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn visit_enum_expression_variant_literal_reg_exp_expression(
        &mut self,
        pattern: &'alloc SourceSliceIndex,
        global: &'alloc bool,
        ignore_case: &'alloc bool,
        multi_line: &'alloc bool,
        dot_all: &'alloc bool,
        sticky: &'alloc bool,
        unicode: &'alloc bool,
    ) {
        self.enter_enum_expression_variant_literal_reg_exp_expression(
            pattern,
            global,
            ignore_case,
            multi_line,
            dot_all,
            sticky,
            unicode,
        );
        self.leave_enum_expression_variant_literal_reg_exp_expression(
            pattern,
            global,
            ignore_case,
            multi_line,
            dot_all,
            sticky,
            unicode,
        );
    }

    fn enter_enum_expression_variant_literal_reg_exp_expression(
        &mut self,
        pattern: &'alloc SourceSliceIndex,
        global: &'alloc bool,
        ignore_case: &'alloc bool,
        multi_line: &'alloc bool,
        dot_all: &'alloc bool,
        sticky: &'alloc bool,
        unicode: &'alloc bool,
    ) {
    }

    fn leave_enum_expression_variant_literal_reg_exp_expression(
        &mut self,
        pattern: &'alloc SourceSliceIndex,
        global: &'alloc bool,
        ignore_case: &'alloc bool,
        multi_line: &'alloc bool,
        dot_all: &'alloc bool,
        sticky: &'alloc bool,
        unicode: &'alloc bool,
    ) {
    }

    fn visit_enum_expression_variant_literal_string_expression(
        &mut self,
        value: &'alloc SourceAtomSetIndex,
    ) {
        self.enter_enum_expression_variant_literal_string_expression(
            value,
        );
        self.leave_enum_expression_variant_literal_string_expression(
            value,
        );
    }

    fn enter_enum_expression_variant_literal_string_expression(
        &mut self,
        value: &'alloc SourceAtomSetIndex,
    ) {
    }

    fn leave_enum_expression_variant_literal_string_expression(
        &mut self,
        value: &'alloc SourceAtomSetIndex,
    ) {
    }

    fn visit_enum_expression_variant_array_expression(
        &mut self,
        ast: &'alloc ArrayExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_array_expression(ast);
        self.visit_array_expression(ast);
        self.leave_enum_expression_variant_array_expression(ast);
    }

    fn enter_enum_expression_variant_array_expression(
        &mut self,
        ast: &'alloc ArrayExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_array_expression(
        &mut self,
        ast: &'alloc ArrayExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_arrow_expression(
        &mut self,
        is_async: &'alloc bool,
        params: &'alloc FormalParameters<'alloc>,
        body: &'alloc ArrowExpressionBody<'alloc>,
    ) {
        self.enter_enum_expression_variant_arrow_expression(
            is_async,
            params,
            body,
        );
        self.visit_formal_parameters(params);
        self.visit_arrow_expression_body(body);
        self.leave_enum_expression_variant_arrow_expression(
            is_async,
            params,
            body,
        );
    }

    fn enter_enum_expression_variant_arrow_expression(
        &mut self,
        is_async: &'alloc bool,
        params: &'alloc FormalParameters<'alloc>,
        body: &'alloc ArrowExpressionBody<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_arrow_expression(
        &mut self,
        is_async: &'alloc bool,
        params: &'alloc FormalParameters<'alloc>,
        body: &'alloc ArrowExpressionBody<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_assignment_expression(
        &mut self,
        binding: &'alloc AssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_assignment_expression(
            binding,
            expression,
        );
        self.visit_assignment_target(binding);
        self.visit_expression(expression);
        self.leave_enum_expression_variant_assignment_expression(
            binding,
            expression,
        );
    }

    fn enter_enum_expression_variant_assignment_expression(
        &mut self,
        binding: &'alloc AssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_assignment_expression(
        &mut self,
        binding: &'alloc AssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_binary_expression(
        &mut self,
        operator: &'alloc BinaryOperator,
        left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_binary_expression(
            operator,
            left,
            right,
        );
        self.visit_binary_operator(operator);
        self.visit_expression(left);
        self.visit_expression(right);
        self.leave_enum_expression_variant_binary_expression(
            operator,
            left,
            right,
        );
    }

    fn enter_enum_expression_variant_binary_expression(
        &mut self,
        operator: &'alloc BinaryOperator,
        left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_binary_expression(
        &mut self,
        operator: &'alloc BinaryOperator,
        left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_call_expression(ast);
        self.visit_call_expression(ast);
        self.leave_enum_expression_variant_call_expression(ast);
    }

    fn enter_enum_expression_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_compound_assignment_expression(
        &mut self,
        operator: &'alloc CompoundAssignmentOperator,
        binding: &'alloc SimpleAssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_compound_assignment_expression(
            operator,
            binding,
            expression,
        );
        self.visit_compound_assignment_operator(operator);
        self.visit_simple_assignment_target(binding);
        self.visit_expression(expression);
        self.leave_enum_expression_variant_compound_assignment_expression(
            operator,
            binding,
            expression,
        );
    }

    fn enter_enum_expression_variant_compound_assignment_expression(
        &mut self,
        operator: &'alloc CompoundAssignmentOperator,
        binding: &'alloc SimpleAssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_compound_assignment_expression(
        &mut self,
        operator: &'alloc CompoundAssignmentOperator,
        binding: &'alloc SimpleAssignmentTarget<'alloc>,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_conditional_expression(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_conditional_expression(
            test,
            consequent,
            alternate,
        );
        self.visit_expression(test);
        self.visit_expression(consequent);
        self.visit_expression(alternate);
        self.leave_enum_expression_variant_conditional_expression(
            test,
            consequent,
            alternate,
        );
    }

    fn enter_enum_expression_variant_conditional_expression(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_conditional_expression(
        &mut self,
        test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_function_expression(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
        self.enter_enum_expression_variant_function_expression(ast);
        self.visit_function(ast);
        self.leave_enum_expression_variant_function_expression(ast);
    }

    fn enter_enum_expression_variant_function_expression(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_function_expression(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_identifier_expression(
        &mut self,
        ast: &'alloc IdentifierExpression,
    ) {
        self.enter_enum_expression_variant_identifier_expression(ast);
        self.visit_identifier_expression(ast);
        self.leave_enum_expression_variant_identifier_expression(ast);
    }

    fn enter_enum_expression_variant_identifier_expression(
        &mut self,
        ast: &'alloc IdentifierExpression,
    ) {
    }

    fn leave_enum_expression_variant_identifier_expression(
        &mut self,
        ast: &'alloc IdentifierExpression,
    ) {
    }

    fn visit_enum_expression_variant_new_expression(
        &mut self,
        callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        arguments: &'alloc Arguments<'alloc>,
    ) {
        self.enter_enum_expression_variant_new_expression(
            callee,
            arguments,
        );
        self.visit_expression(callee);
        self.visit_arguments(arguments);
        self.leave_enum_expression_variant_new_expression(
            callee,
            arguments,
        );
    }

    fn enter_enum_expression_variant_new_expression(
        &mut self,
        callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        arguments: &'alloc Arguments<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_new_expression(
        &mut self,
        callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
        arguments: &'alloc Arguments<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_new_target_expression(&mut self) {
    }

    fn visit_enum_expression_variant_object_expression(
        &mut self,
        ast: &'alloc ObjectExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_object_expression(ast);
        self.visit_object_expression(ast);
        self.leave_enum_expression_variant_object_expression(ast);
    }

    fn enter_enum_expression_variant_object_expression(
        &mut self,
        ast: &'alloc ObjectExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_object_expression(
        &mut self,
        ast: &'alloc ObjectExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_optional_expression(
        &mut self,
        object: &'alloc ExpressionOrSuper<'alloc>,
        tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_optional_expression(
            object,
            tail,
        );
        self.visit_expression_or_super(object);
        self.visit_expression(tail);
        self.leave_enum_expression_variant_optional_expression(
            object,
            tail,
        );
    }

    fn enter_enum_expression_variant_optional_expression(
        &mut self,
        object: &'alloc ExpressionOrSuper<'alloc>,
        tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_optional_expression(
        &mut self,
        object: &'alloc ExpressionOrSuper<'alloc>,
        tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_optional_chain(
        &mut self,
        ast: &'alloc OptionalChain<'alloc>,
    ) {
        self.enter_enum_expression_variant_optional_chain(ast);
        self.visit_optional_chain(ast);
        self.leave_enum_expression_variant_optional_chain(ast);
    }

    fn enter_enum_expression_variant_optional_chain(
        &mut self,
        ast: &'alloc OptionalChain<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_optional_chain(
        &mut self,
        ast: &'alloc OptionalChain<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_unary_expression(
        &mut self,
        operator: &'alloc UnaryOperator,
        operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_unary_expression(
            operator,
            operand,
        );
        self.visit_unary_operator(operator);
        self.visit_expression(operand);
        self.leave_enum_expression_variant_unary_expression(
            operator,
            operand,
        );
    }

    fn enter_enum_expression_variant_unary_expression(
        &mut self,
        operator: &'alloc UnaryOperator,
        operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_unary_expression(
        &mut self,
        operator: &'alloc UnaryOperator,
        operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_template_expression(
        &mut self,
        ast: &'alloc TemplateExpression<'alloc>,
    ) {
        self.enter_enum_expression_variant_template_expression(ast);
        self.visit_template_expression(ast);
        self.leave_enum_expression_variant_template_expression(ast);
    }

    fn enter_enum_expression_variant_template_expression(
        &mut self,
        ast: &'alloc TemplateExpression<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_template_expression(
        &mut self,
        ast: &'alloc TemplateExpression<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_this_expression(&mut self) {
    }

    fn visit_enum_expression_variant_update_expression(
        &mut self,
        is_prefix: &'alloc bool,
        operator: &'alloc UpdateOperator,
        operand: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_expression_variant_update_expression(
            is_prefix,
            operator,
            operand,
        );
        self.visit_update_operator(operator);
        self.visit_simple_assignment_target(operand);
        self.leave_enum_expression_variant_update_expression(
            is_prefix,
            operator,
            operand,
        );
    }

    fn enter_enum_expression_variant_update_expression(
        &mut self,
        is_prefix: &'alloc bool,
        operator: &'alloc UpdateOperator,
        operand: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_expression_variant_update_expression(
        &mut self,
        is_prefix: &'alloc bool,
        operator: &'alloc UpdateOperator,
        operand: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_enum_expression_variant_yield_expression(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
        self.enter_enum_expression_variant_yield_expression(
            expression,
        );
        if let Some(item) = expression {
            self.visit_expression(item);
        }
        self.leave_enum_expression_variant_yield_expression(
            expression,
        );
    }

    fn enter_enum_expression_variant_yield_expression(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn leave_enum_expression_variant_yield_expression(
        &mut self,
        expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn visit_enum_expression_variant_yield_generator_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_yield_generator_expression(
            expression,
        );
        self.visit_expression(expression);
        self.leave_enum_expression_variant_yield_generator_expression(
            expression,
        );
    }

    fn enter_enum_expression_variant_yield_generator_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_yield_generator_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_await_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_await_expression(
            expression,
        );
        self.visit_expression(expression);
        self.leave_enum_expression_variant_await_expression(
            expression,
        );
    }

    fn enter_enum_expression_variant_await_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_await_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_variant_import_call_expression(
        &mut self,
        argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_variant_import_call_expression(
            argument,
        );
        self.visit_expression(argument);
        self.leave_enum_expression_variant_import_call_expression(
            argument,
        );
    }

    fn enter_enum_expression_variant_import_call_expression(
        &mut self,
        argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_variant_import_call_expression(
        &mut self,
        argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
        self.enter_member_expression(ast);
        match ast {
            MemberExpression::ComputedMemberExpression(ast) => {
                self.visit_enum_member_expression_variant_computed_member_expression(ast)
            }
            MemberExpression::StaticMemberExpression(ast) => {
                self.visit_enum_member_expression_variant_static_member_expression(ast)
            }
            MemberExpression::PrivateFieldExpression(ast) => {
                self.visit_enum_member_expression_variant_private_field_expression(ast)
            }
        }
        self.leave_member_expression(ast);
    }

    fn enter_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
    }

    fn leave_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
    }

    fn visit_enum_member_expression_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
        self.enter_enum_member_expression_variant_computed_member_expression(ast);
        self.visit_computed_member_expression(ast);
        self.leave_enum_member_expression_variant_computed_member_expression(ast);
    }

    fn enter_enum_member_expression_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
    }

    fn leave_enum_member_expression_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
    }

    fn visit_enum_member_expression_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
        self.enter_enum_member_expression_variant_static_member_expression(ast);
        self.visit_static_member_expression(ast);
        self.leave_enum_member_expression_variant_static_member_expression(ast);
    }

    fn enter_enum_member_expression_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
    }

    fn leave_enum_member_expression_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
    }

    fn visit_enum_member_expression_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
        self.enter_enum_member_expression_variant_private_field_expression(ast);
        self.visit_private_field_expression(ast);
        self.leave_enum_member_expression_variant_private_field_expression(ast);
    }

    fn enter_enum_member_expression_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
    }

    fn leave_enum_member_expression_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
    }

    fn visit_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
        self.enter_optional_chain(ast);
        match ast {
            OptionalChain::ComputedMemberExpressionTail { expression, .. } => {
                self.visit_enum_optional_chain_variant_computed_member_expression_tail(
                    expression,
                )
            }
            OptionalChain::StaticMemberExpressionTail { property, .. } => {
                self.visit_enum_optional_chain_variant_static_member_expression_tail(
                    property,
                )
            }
            OptionalChain::PrivateFieldExpressionTail { field, .. } => {
                self.visit_enum_optional_chain_variant_private_field_expression_tail(
                    field,
                )
            }
            OptionalChain::CallExpressionTail { arguments, .. } => {
                self.visit_enum_optional_chain_variant_call_expression_tail(
                    arguments,
                )
            }
            OptionalChain::ComputedMemberExpression(ast) => {
                self.visit_enum_optional_chain_variant_computed_member_expression(ast)
            }
            OptionalChain::StaticMemberExpression(ast) => {
                self.visit_enum_optional_chain_variant_static_member_expression(ast)
            }
            OptionalChain::PrivateFieldExpression(ast) => {
                self.visit_enum_optional_chain_variant_private_field_expression(ast)
            }
            OptionalChain::CallExpression(ast) => {
                self.visit_enum_optional_chain_variant_call_expression(ast)
            }
        }
        self.leave_optional_chain(ast);
    }

    fn enter_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
    }

    fn leave_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
    }

    fn visit_enum_optional_chain_variant_computed_member_expression_tail(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_optional_chain_variant_computed_member_expression_tail(
            expression,
        );
        self.visit_expression(expression);
        self.leave_enum_optional_chain_variant_computed_member_expression_tail(
            expression,
        );
    }

    fn enter_enum_optional_chain_variant_computed_member_expression_tail(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_optional_chain_variant_computed_member_expression_tail(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_optional_chain_variant_static_member_expression_tail(
        &mut self,
        property: &'alloc IdentifierName,
    ) {
        self.enter_enum_optional_chain_variant_static_member_expression_tail(
            property,
        );
        self.visit_identifier_name(property);
        self.leave_enum_optional_chain_variant_static_member_expression_tail(
            property,
        );
    }

    fn enter_enum_optional_chain_variant_static_member_expression_tail(
        &mut self,
        property: &'alloc IdentifierName,
    ) {
    }

    fn leave_enum_optional_chain_variant_static_member_expression_tail(
        &mut self,
        property: &'alloc IdentifierName,
    ) {
    }

    fn visit_enum_optional_chain_variant_private_field_expression_tail(
        &mut self,
        field: &'alloc PrivateIdentifier,
    ) {
        self.enter_enum_optional_chain_variant_private_field_expression_tail(
            field,
        );
        self.visit_private_identifier(field);
        self.leave_enum_optional_chain_variant_private_field_expression_tail(
            field,
        );
    }

    fn enter_enum_optional_chain_variant_private_field_expression_tail(
        &mut self,
        field: &'alloc PrivateIdentifier,
    ) {
    }

    fn leave_enum_optional_chain_variant_private_field_expression_tail(
        &mut self,
        field: &'alloc PrivateIdentifier,
    ) {
    }

    fn visit_enum_optional_chain_variant_call_expression_tail(
        &mut self,
        arguments: &'alloc Arguments<'alloc>,
    ) {
        self.enter_enum_optional_chain_variant_call_expression_tail(
            arguments,
        );
        self.visit_arguments(arguments);
        self.leave_enum_optional_chain_variant_call_expression_tail(
            arguments,
        );
    }

    fn enter_enum_optional_chain_variant_call_expression_tail(
        &mut self,
        arguments: &'alloc Arguments<'alloc>,
    ) {
    }

    fn leave_enum_optional_chain_variant_call_expression_tail(
        &mut self,
        arguments: &'alloc Arguments<'alloc>,
    ) {
    }

    fn visit_enum_optional_chain_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
        self.enter_enum_optional_chain_variant_computed_member_expression(ast);
        self.visit_computed_member_expression(ast);
        self.leave_enum_optional_chain_variant_computed_member_expression(ast);
    }

    fn enter_enum_optional_chain_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
    }

    fn leave_enum_optional_chain_variant_computed_member_expression(
        &mut self,
        ast: &'alloc ComputedMemberExpression<'alloc>,
    ) {
    }

    fn visit_enum_optional_chain_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
        self.enter_enum_optional_chain_variant_static_member_expression(ast);
        self.visit_static_member_expression(ast);
        self.leave_enum_optional_chain_variant_static_member_expression(ast);
    }

    fn enter_enum_optional_chain_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
    }

    fn leave_enum_optional_chain_variant_static_member_expression(
        &mut self,
        ast: &'alloc StaticMemberExpression<'alloc>,
    ) {
    }

    fn visit_enum_optional_chain_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
        self.enter_enum_optional_chain_variant_private_field_expression(ast);
        self.visit_private_field_expression(ast);
        self.leave_enum_optional_chain_variant_private_field_expression(ast);
    }

    fn enter_enum_optional_chain_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
    }

    fn leave_enum_optional_chain_variant_private_field_expression(
        &mut self,
        ast: &'alloc PrivateFieldExpression<'alloc>,
    ) {
    }

    fn visit_enum_optional_chain_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
        self.enter_enum_optional_chain_variant_call_expression(ast);
        self.visit_call_expression(ast);
        self.leave_enum_optional_chain_variant_call_expression(ast);
    }

    fn enter_enum_optional_chain_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
    }

    fn leave_enum_optional_chain_variant_call_expression(
        &mut self,
        ast: &'alloc CallExpression<'alloc>,
    ) {
    }

    fn visit_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
        self.enter_property_name(ast);
        match ast {
            PropertyName::ComputedPropertyName(ast) => {
                self.visit_enum_property_name_variant_computed_property_name(ast)
            }
            PropertyName::StaticPropertyName(ast) => {
                self.visit_enum_property_name_variant_static_property_name(ast)
            }
            PropertyName::StaticNumericPropertyName(ast) => {
                self.visit_enum_property_name_variant_static_numeric_property_name(ast)
            }
        }
        self.leave_property_name(ast);
    }

    fn enter_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
    }

    fn leave_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
    }

    fn visit_enum_property_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
        self.enter_enum_property_name_variant_computed_property_name(ast);
        self.visit_computed_property_name(ast);
        self.leave_enum_property_name_variant_computed_property_name(ast);
    }

    fn enter_enum_property_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
    }

    fn leave_enum_property_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
    }

    fn visit_enum_property_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
        self.enter_enum_property_name_variant_static_property_name(ast);
        self.visit_static_property_name(ast);
        self.leave_enum_property_name_variant_static_property_name(ast);
    }

    fn enter_enum_property_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
    }

    fn leave_enum_property_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
    }

    fn visit_enum_property_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
        self.enter_enum_property_name_variant_static_numeric_property_name(ast);
        self.visit_numeric_literal(ast);
        self.leave_enum_property_name_variant_static_numeric_property_name(ast);
    }

    fn enter_enum_property_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn leave_enum_property_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn visit_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
        self.enter_call_expression(ast);
        self.visit_expression_or_super(&ast.callee);
        self.visit_arguments(&ast.arguments);
        self.leave_call_expression(ast);
    }

    fn enter_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
    }

    fn leave_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
    }

    fn visit_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
        self.enter_class_element_name(ast);
        match ast {
            ClassElementName::ComputedPropertyName(ast) => {
                self.visit_enum_class_element_name_variant_computed_property_name(ast)
            }
            ClassElementName::StaticPropertyName(ast) => {
                self.visit_enum_class_element_name_variant_static_property_name(ast)
            }
            ClassElementName::StaticNumericPropertyName(ast) => {
                self.visit_enum_class_element_name_variant_static_numeric_property_name(ast)
            }
            ClassElementName::PrivateFieldName(ast) => {
                self.visit_enum_class_element_name_variant_private_field_name(ast)
            }
        }
        self.leave_class_element_name(ast);
    }

    fn enter_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
    }

    fn leave_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
    }

    fn visit_enum_class_element_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
        self.enter_enum_class_element_name_variant_computed_property_name(ast);
        self.visit_computed_property_name(ast);
        self.leave_enum_class_element_name_variant_computed_property_name(ast);
    }

    fn enter_enum_class_element_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
    }

    fn leave_enum_class_element_name_variant_computed_property_name(
        &mut self,
        ast: &'alloc ComputedPropertyName<'alloc>,
    ) {
    }

    fn visit_enum_class_element_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
        self.enter_enum_class_element_name_variant_static_property_name(ast);
        self.visit_static_property_name(ast);
        self.leave_enum_class_element_name_variant_static_property_name(ast);
    }

    fn enter_enum_class_element_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
    }

    fn leave_enum_class_element_name_variant_static_property_name(
        &mut self,
        ast: &'alloc StaticPropertyName,
    ) {
    }

    fn visit_enum_class_element_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
        self.enter_enum_class_element_name_variant_static_numeric_property_name(ast);
        self.visit_numeric_literal(ast);
        self.leave_enum_class_element_name_variant_static_numeric_property_name(ast);
    }

    fn enter_enum_class_element_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn leave_enum_class_element_name_variant_static_numeric_property_name(
        &mut self,
        ast: &'alloc NumericLiteral,
    ) {
    }

    fn visit_enum_class_element_name_variant_private_field_name(
        &mut self,
        ast: &'alloc PrivateIdentifier,
    ) {
        self.enter_enum_class_element_name_variant_private_field_name(ast);
        self.visit_private_identifier(ast);
        self.leave_enum_class_element_name_variant_private_field_name(ast);
    }

    fn enter_enum_class_element_name_variant_private_field_name(
        &mut self,
        ast: &'alloc PrivateIdentifier,
    ) {
    }

    fn leave_enum_class_element_name_variant_private_field_name(
        &mut self,
        ast: &'alloc PrivateIdentifier,
    ) {
    }

    fn visit_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
        self.enter_object_property(ast);
        match ast {
            ObjectProperty::NamedObjectProperty(ast) => {
                self.visit_enum_object_property_variant_named_object_property(ast)
            }
            ObjectProperty::ShorthandProperty(ast) => {
                self.visit_enum_object_property_variant_shorthand_property(ast)
            }
            ObjectProperty::SpreadProperty(ast) => {
                self.visit_enum_object_property_variant_spread_property(ast)
            }
        }
        self.leave_object_property(ast);
    }

    fn enter_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
    }

    fn leave_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
    }

    fn visit_enum_object_property_variant_named_object_property(
        &mut self,
        ast: &'alloc NamedObjectProperty<'alloc>,
    ) {
        self.enter_enum_object_property_variant_named_object_property(ast);
        self.visit_named_object_property(ast);
        self.leave_enum_object_property_variant_named_object_property(ast);
    }

    fn enter_enum_object_property_variant_named_object_property(
        &mut self,
        ast: &'alloc NamedObjectProperty<'alloc>,
    ) {
    }

    fn leave_enum_object_property_variant_named_object_property(
        &mut self,
        ast: &'alloc NamedObjectProperty<'alloc>,
    ) {
    }

    fn visit_enum_object_property_variant_shorthand_property(
        &mut self,
        ast: &'alloc ShorthandProperty,
    ) {
        self.enter_enum_object_property_variant_shorthand_property(ast);
        self.visit_shorthand_property(ast);
        self.leave_enum_object_property_variant_shorthand_property(ast);
    }

    fn enter_enum_object_property_variant_shorthand_property(
        &mut self,
        ast: &'alloc ShorthandProperty,
    ) {
    }

    fn leave_enum_object_property_variant_shorthand_property(
        &mut self,
        ast: &'alloc ShorthandProperty,
    ) {
    }

    fn visit_enum_object_property_variant_spread_property(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_object_property_variant_spread_property(ast);
        self.visit_expression(ast);
        self.leave_enum_object_property_variant_spread_property(ast);
    }

    fn enter_enum_object_property_variant_spread_property(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_object_property_variant_spread_property(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
        self.enter_named_object_property(ast);
        match ast {
            NamedObjectProperty::MethodDefinition(ast) => {
                self.visit_enum_named_object_property_variant_method_definition(ast)
            }
            NamedObjectProperty::DataProperty(ast) => {
                self.visit_enum_named_object_property_variant_data_property(ast)
            }
        }
        self.leave_named_object_property(ast);
    }

    fn enter_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
    }

    fn leave_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
    }

    fn visit_enum_named_object_property_variant_method_definition(
        &mut self,
        ast: &'alloc MethodDefinition<'alloc>,
    ) {
        self.enter_enum_named_object_property_variant_method_definition(ast);
        self.visit_method_definition(ast);
        self.leave_enum_named_object_property_variant_method_definition(ast);
    }

    fn enter_enum_named_object_property_variant_method_definition(
        &mut self,
        ast: &'alloc MethodDefinition<'alloc>,
    ) {
    }

    fn leave_enum_named_object_property_variant_method_definition(
        &mut self,
        ast: &'alloc MethodDefinition<'alloc>,
    ) {
    }

    fn visit_enum_named_object_property_variant_data_property(
        &mut self,
        ast: &'alloc DataProperty<'alloc>,
    ) {
        self.enter_enum_named_object_property_variant_data_property(ast);
        self.visit_data_property(ast);
        self.leave_enum_named_object_property_variant_data_property(ast);
    }

    fn enter_enum_named_object_property_variant_data_property(
        &mut self,
        ast: &'alloc DataProperty<'alloc>,
    ) {
    }

    fn leave_enum_named_object_property_variant_data_property(
        &mut self,
        ast: &'alloc DataProperty<'alloc>,
    ) {
    }

    fn visit_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
        self.enter_method_definition(ast);
        match ast {
            MethodDefinition::Method(ast) => {
                self.visit_enum_method_definition_variant_method(ast)
            }
            MethodDefinition::Getter(ast) => {
                self.visit_enum_method_definition_variant_getter(ast)
            }
            MethodDefinition::Setter(ast) => {
                self.visit_enum_method_definition_variant_setter(ast)
            }
        }
        self.leave_method_definition(ast);
    }

    fn enter_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
    }

    fn leave_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
    }

    fn visit_enum_method_definition_variant_method(
        &mut self,
        ast: &'alloc Method<'alloc>,
    ) {
        self.enter_enum_method_definition_variant_method(ast);
        self.visit_method(ast);
        self.leave_enum_method_definition_variant_method(ast);
    }

    fn enter_enum_method_definition_variant_method(
        &mut self,
        ast: &'alloc Method<'alloc>,
    ) {
    }

    fn leave_enum_method_definition_variant_method(
        &mut self,
        ast: &'alloc Method<'alloc>,
    ) {
    }

    fn visit_enum_method_definition_variant_getter(
        &mut self,
        ast: &'alloc Getter<'alloc>,
    ) {
        self.enter_enum_method_definition_variant_getter(ast);
        self.visit_getter(ast);
        self.leave_enum_method_definition_variant_getter(ast);
    }

    fn enter_enum_method_definition_variant_getter(
        &mut self,
        ast: &'alloc Getter<'alloc>,
    ) {
    }

    fn leave_enum_method_definition_variant_getter(
        &mut self,
        ast: &'alloc Getter<'alloc>,
    ) {
    }

    fn visit_enum_method_definition_variant_setter(
        &mut self,
        ast: &'alloc Setter<'alloc>,
    ) {
        self.enter_enum_method_definition_variant_setter(ast);
        self.visit_setter(ast);
        self.leave_enum_method_definition_variant_setter(ast);
    }

    fn enter_enum_method_definition_variant_setter(
        &mut self,
        ast: &'alloc Setter<'alloc>,
    ) {
    }

    fn leave_enum_method_definition_variant_setter(
        &mut self,
        ast: &'alloc Setter<'alloc>,
    ) {
    }

    fn visit_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
        self.enter_import_declaration(ast);
        match ast {
            ImportDeclaration::Import(ast) => {
                self.visit_enum_import_declaration_variant_import(ast)
            }
            ImportDeclaration::ImportNamespace(ast) => {
                self.visit_enum_import_declaration_variant_import_namespace(ast)
            }
        }
        self.leave_import_declaration(ast);
    }

    fn enter_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
    }

    fn leave_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
    }

    fn visit_enum_import_declaration_variant_import(
        &mut self,
        ast: &'alloc Import<'alloc>,
    ) {
        self.enter_enum_import_declaration_variant_import(ast);
        self.visit_import(ast);
        self.leave_enum_import_declaration_variant_import(ast);
    }

    fn enter_enum_import_declaration_variant_import(
        &mut self,
        ast: &'alloc Import<'alloc>,
    ) {
    }

    fn leave_enum_import_declaration_variant_import(
        &mut self,
        ast: &'alloc Import<'alloc>,
    ) {
    }

    fn visit_enum_import_declaration_variant_import_namespace(
        &mut self,
        ast: &'alloc ImportNamespace,
    ) {
        self.enter_enum_import_declaration_variant_import_namespace(ast);
        self.visit_import_namespace(ast);
        self.leave_enum_import_declaration_variant_import_namespace(ast);
    }

    fn enter_enum_import_declaration_variant_import_namespace(
        &mut self,
        ast: &'alloc ImportNamespace,
    ) {
    }

    fn leave_enum_import_declaration_variant_import_namespace(
        &mut self,
        ast: &'alloc ImportNamespace,
    ) {
    }

    fn visit_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
        self.enter_export_declaration(ast);
        match ast {
            ExportDeclaration::ExportAllFrom(ast) => {
                self.visit_enum_export_declaration_variant_export_all_from(ast)
            }
            ExportDeclaration::ExportFrom(ast) => {
                self.visit_enum_export_declaration_variant_export_from(ast)
            }
            ExportDeclaration::ExportLocals(ast) => {
                self.visit_enum_export_declaration_variant_export_locals(ast)
            }
            ExportDeclaration::Export(ast) => {
                self.visit_enum_export_declaration_variant_export(ast)
            }
            ExportDeclaration::ExportDefault(ast) => {
                self.visit_enum_export_declaration_variant_export_default(ast)
            }
        }
        self.leave_export_declaration(ast);
    }

    fn enter_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
    }

    fn leave_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
    }

    fn visit_enum_export_declaration_variant_export_all_from(
        &mut self,
        ast: &'alloc ExportAllFrom,
    ) {
        self.enter_enum_export_declaration_variant_export_all_from(ast);
        self.visit_export_all_from(ast);
        self.leave_enum_export_declaration_variant_export_all_from(ast);
    }

    fn enter_enum_export_declaration_variant_export_all_from(
        &mut self,
        ast: &'alloc ExportAllFrom,
    ) {
    }

    fn leave_enum_export_declaration_variant_export_all_from(
        &mut self,
        ast: &'alloc ExportAllFrom,
    ) {
    }

    fn visit_enum_export_declaration_variant_export_from(
        &mut self,
        ast: &'alloc ExportFrom<'alloc>,
    ) {
        self.enter_enum_export_declaration_variant_export_from(ast);
        self.visit_export_from(ast);
        self.leave_enum_export_declaration_variant_export_from(ast);
    }

    fn enter_enum_export_declaration_variant_export_from(
        &mut self,
        ast: &'alloc ExportFrom<'alloc>,
    ) {
    }

    fn leave_enum_export_declaration_variant_export_from(
        &mut self,
        ast: &'alloc ExportFrom<'alloc>,
    ) {
    }

    fn visit_enum_export_declaration_variant_export_locals(
        &mut self,
        ast: &'alloc ExportLocals<'alloc>,
    ) {
        self.enter_enum_export_declaration_variant_export_locals(ast);
        self.visit_export_locals(ast);
        self.leave_enum_export_declaration_variant_export_locals(ast);
    }

    fn enter_enum_export_declaration_variant_export_locals(
        &mut self,
        ast: &'alloc ExportLocals<'alloc>,
    ) {
    }

    fn leave_enum_export_declaration_variant_export_locals(
        &mut self,
        ast: &'alloc ExportLocals<'alloc>,
    ) {
    }

    fn visit_enum_export_declaration_variant_export(
        &mut self,
        ast: &'alloc Export<'alloc>,
    ) {
        self.enter_enum_export_declaration_variant_export(ast);
        self.visit_export(ast);
        self.leave_enum_export_declaration_variant_export(ast);
    }

    fn enter_enum_export_declaration_variant_export(
        &mut self,
        ast: &'alloc Export<'alloc>,
    ) {
    }

    fn leave_enum_export_declaration_variant_export(
        &mut self,
        ast: &'alloc Export<'alloc>,
    ) {
    }

    fn visit_enum_export_declaration_variant_export_default(
        &mut self,
        ast: &'alloc ExportDefault<'alloc>,
    ) {
        self.enter_enum_export_declaration_variant_export_default(ast);
        self.visit_export_default(ast);
        self.leave_enum_export_declaration_variant_export_default(ast);
    }

    fn enter_enum_export_declaration_variant_export_default(
        &mut self,
        ast: &'alloc ExportDefault<'alloc>,
    ) {
    }

    fn leave_enum_export_declaration_variant_export_default(
        &mut self,
        ast: &'alloc ExportDefault<'alloc>,
    ) {
    }

    fn visit_variable_reference(&mut self, ast: &'alloc VariableReference) {
        self.enter_variable_reference(ast);
        match ast {
            VariableReference::BindingIdentifier(ast) => {
                self.visit_enum_variable_reference_variant_binding_identifier(ast)
            }
            VariableReference::AssignmentTargetIdentifier(ast) => {
                self.visit_enum_variable_reference_variant_assignment_target_identifier(ast)
            }
        }
        self.leave_variable_reference(ast);
    }

    fn enter_variable_reference(&mut self, ast: &'alloc VariableReference) {
    }

    fn leave_variable_reference(&mut self, ast: &'alloc VariableReference) {
    }

    fn visit_enum_variable_reference_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
        self.enter_enum_variable_reference_variant_binding_identifier(ast);
        self.visit_binding_identifier(ast);
        self.leave_enum_variable_reference_variant_binding_identifier(ast);
    }

    fn enter_enum_variable_reference_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
    }

    fn leave_enum_variable_reference_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
    }

    fn visit_enum_variable_reference_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
        self.enter_enum_variable_reference_variant_assignment_target_identifier(ast);
        self.visit_assignment_target_identifier(ast);
        self.leave_enum_variable_reference_variant_assignment_target_identifier(ast);
    }

    fn enter_enum_variable_reference_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
    }

    fn leave_enum_variable_reference_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
    }

    fn visit_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
        self.enter_binding_pattern(ast);
        match ast {
            BindingPattern::ObjectBinding(ast) => {
                self.visit_enum_binding_pattern_variant_object_binding(ast)
            }
            BindingPattern::ArrayBinding(ast) => {
                self.visit_enum_binding_pattern_variant_array_binding(ast)
            }
        }
        self.leave_binding_pattern(ast);
    }

    fn enter_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
    }

    fn leave_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
    }

    fn visit_enum_binding_pattern_variant_object_binding(
        &mut self,
        ast: &'alloc ObjectBinding<'alloc>,
    ) {
        self.enter_enum_binding_pattern_variant_object_binding(ast);
        self.visit_object_binding(ast);
        self.leave_enum_binding_pattern_variant_object_binding(ast);
    }

    fn enter_enum_binding_pattern_variant_object_binding(
        &mut self,
        ast: &'alloc ObjectBinding<'alloc>,
    ) {
    }

    fn leave_enum_binding_pattern_variant_object_binding(
        &mut self,
        ast: &'alloc ObjectBinding<'alloc>,
    ) {
    }

    fn visit_enum_binding_pattern_variant_array_binding(
        &mut self,
        ast: &'alloc ArrayBinding<'alloc>,
    ) {
        self.enter_enum_binding_pattern_variant_array_binding(ast);
        self.visit_array_binding(ast);
        self.leave_enum_binding_pattern_variant_array_binding(ast);
    }

    fn enter_enum_binding_pattern_variant_array_binding(
        &mut self,
        ast: &'alloc ArrayBinding<'alloc>,
    ) {
    }

    fn leave_enum_binding_pattern_variant_array_binding(
        &mut self,
        ast: &'alloc ArrayBinding<'alloc>,
    ) {
    }

    fn visit_binding(&mut self, ast: &'alloc Binding<'alloc>) {
        self.enter_binding(ast);
        match ast {
            Binding::BindingPattern(ast) => {
                self.visit_enum_binding_variant_binding_pattern(ast)
            }
            Binding::BindingIdentifier(ast) => {
                self.visit_enum_binding_variant_binding_identifier(ast)
            }
        }
        self.leave_binding(ast);
    }

    fn enter_binding(&mut self, ast: &'alloc Binding<'alloc>) {
    }

    fn leave_binding(&mut self, ast: &'alloc Binding<'alloc>) {
    }

    fn visit_enum_binding_variant_binding_pattern(
        &mut self,
        ast: &'alloc BindingPattern<'alloc>,
    ) {
        self.enter_enum_binding_variant_binding_pattern(ast);
        self.visit_binding_pattern(ast);
        self.leave_enum_binding_variant_binding_pattern(ast);
    }

    fn enter_enum_binding_variant_binding_pattern(
        &mut self,
        ast: &'alloc BindingPattern<'alloc>,
    ) {
    }

    fn leave_enum_binding_variant_binding_pattern(
        &mut self,
        ast: &'alloc BindingPattern<'alloc>,
    ) {
    }

    fn visit_enum_binding_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
        self.enter_enum_binding_variant_binding_identifier(ast);
        self.visit_binding_identifier(ast);
        self.leave_enum_binding_variant_binding_identifier(ast);
    }

    fn enter_enum_binding_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
    }

    fn leave_enum_binding_variant_binding_identifier(
        &mut self,
        ast: &'alloc BindingIdentifier,
    ) {
    }

    fn visit_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
        self.enter_simple_assignment_target(ast);
        match ast {
            SimpleAssignmentTarget::AssignmentTargetIdentifier(ast) => {
                self.visit_enum_simple_assignment_target_variant_assignment_target_identifier(ast)
            }
            SimpleAssignmentTarget::MemberAssignmentTarget(ast) => {
                self.visit_enum_simple_assignment_target_variant_member_assignment_target(ast)
            }
        }
        self.leave_simple_assignment_target(ast);
    }

    fn enter_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
    }

    fn leave_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
    }

    fn visit_enum_simple_assignment_target_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
        self.enter_enum_simple_assignment_target_variant_assignment_target_identifier(ast);
        self.visit_assignment_target_identifier(ast);
        self.leave_enum_simple_assignment_target_variant_assignment_target_identifier(ast);
    }

    fn enter_enum_simple_assignment_target_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
    }

    fn leave_enum_simple_assignment_target_variant_assignment_target_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetIdentifier,
    ) {
    }

    fn visit_enum_simple_assignment_target_variant_member_assignment_target(
        &mut self,
        ast: &'alloc MemberAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_simple_assignment_target_variant_member_assignment_target(ast);
        self.visit_member_assignment_target(ast);
        self.leave_enum_simple_assignment_target_variant_member_assignment_target(ast);
    }

    fn enter_enum_simple_assignment_target_variant_member_assignment_target(
        &mut self,
        ast: &'alloc MemberAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_simple_assignment_target_variant_member_assignment_target(
        &mut self,
        ast: &'alloc MemberAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
        self.enter_assignment_target_pattern(ast);
        match ast {
            AssignmentTargetPattern::ArrayAssignmentTarget(ast) => {
                self.visit_enum_assignment_target_pattern_variant_array_assignment_target(ast)
            }
            AssignmentTargetPattern::ObjectAssignmentTarget(ast) => {
                self.visit_enum_assignment_target_pattern_variant_object_assignment_target(ast)
            }
        }
        self.leave_assignment_target_pattern(ast);
    }

    fn enter_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
    }

    fn leave_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
    }

    fn visit_enum_assignment_target_pattern_variant_array_assignment_target(
        &mut self,
        ast: &'alloc ArrayAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_assignment_target_pattern_variant_array_assignment_target(ast);
        self.visit_array_assignment_target(ast);
        self.leave_enum_assignment_target_pattern_variant_array_assignment_target(ast);
    }

    fn enter_enum_assignment_target_pattern_variant_array_assignment_target(
        &mut self,
        ast: &'alloc ArrayAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_pattern_variant_array_assignment_target(
        &mut self,
        ast: &'alloc ArrayAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_enum_assignment_target_pattern_variant_object_assignment_target(
        &mut self,
        ast: &'alloc ObjectAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_assignment_target_pattern_variant_object_assignment_target(ast);
        self.visit_object_assignment_target(ast);
        self.leave_enum_assignment_target_pattern_variant_object_assignment_target(ast);
    }

    fn enter_enum_assignment_target_pattern_variant_object_assignment_target(
        &mut self,
        ast: &'alloc ObjectAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_pattern_variant_object_assignment_target(
        &mut self,
        ast: &'alloc ObjectAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
        self.enter_assignment_target(ast);
        match ast {
            AssignmentTarget::AssignmentTargetPattern(ast) => {
                self.visit_enum_assignment_target_variant_assignment_target_pattern(ast)
            }
            AssignmentTarget::SimpleAssignmentTarget(ast) => {
                self.visit_enum_assignment_target_variant_simple_assignment_target(ast)
            }
        }
        self.leave_assignment_target(ast);
    }

    fn enter_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
    }

    fn leave_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
    }

    fn visit_enum_assignment_target_variant_assignment_target_pattern(
        &mut self,
        ast: &'alloc AssignmentTargetPattern<'alloc>,
    ) {
        self.enter_enum_assignment_target_variant_assignment_target_pattern(ast);
        self.visit_assignment_target_pattern(ast);
        self.leave_enum_assignment_target_variant_assignment_target_pattern(ast);
    }

    fn enter_enum_assignment_target_variant_assignment_target_pattern(
        &mut self,
        ast: &'alloc AssignmentTargetPattern<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_variant_assignment_target_pattern(
        &mut self,
        ast: &'alloc AssignmentTargetPattern<'alloc>,
    ) {
    }

    fn visit_enum_assignment_target_variant_simple_assignment_target(
        &mut self,
        ast: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_assignment_target_variant_simple_assignment_target(ast);
        self.visit_simple_assignment_target(ast);
        self.leave_enum_assignment_target_variant_simple_assignment_target(ast);
    }

    fn enter_enum_assignment_target_variant_simple_assignment_target(
        &mut self,
        ast: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_variant_simple_assignment_target(
        &mut self,
        ast: &'alloc SimpleAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
        self.enter_parameter(ast);
        match ast {
            Parameter::Binding(ast) => {
                self.visit_enum_parameter_variant_binding(ast)
            }
            Parameter::BindingWithDefault(ast) => {
                self.visit_enum_parameter_variant_binding_with_default(ast)
            }
        }
        self.leave_parameter(ast);
    }

    fn enter_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
    }

    fn leave_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
    }

    fn visit_enum_parameter_variant_binding(
        &mut self,
        ast: &'alloc Binding<'alloc>,
    ) {
        self.enter_enum_parameter_variant_binding(ast);
        self.visit_binding(ast);
        self.leave_enum_parameter_variant_binding(ast);
    }

    fn enter_enum_parameter_variant_binding(
        &mut self,
        ast: &'alloc Binding<'alloc>,
    ) {
    }

    fn leave_enum_parameter_variant_binding(
        &mut self,
        ast: &'alloc Binding<'alloc>,
    ) {
    }

    fn visit_enum_parameter_variant_binding_with_default(
        &mut self,
        ast: &'alloc BindingWithDefault<'alloc>,
    ) {
        self.enter_enum_parameter_variant_binding_with_default(ast);
        self.visit_binding_with_default(ast);
        self.leave_enum_parameter_variant_binding_with_default(ast);
    }

    fn enter_enum_parameter_variant_binding_with_default(
        &mut self,
        ast: &'alloc BindingWithDefault<'alloc>,
    ) {
    }

    fn leave_enum_parameter_variant_binding_with_default(
        &mut self,
        ast: &'alloc BindingWithDefault<'alloc>,
    ) {
    }

    fn visit_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
        self.enter_binding_with_default(ast);
        self.visit_binding(&ast.binding);
        self.visit_expression(&ast.init);
        self.leave_binding_with_default(ast);
    }

    fn enter_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
    }

    fn leave_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
    }

    fn visit_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
        self.enter_binding_identifier(ast);
        self.visit_identifier(&ast.name);
        self.leave_binding_identifier(ast);
    }

    fn enter_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
    }

    fn leave_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
    }

    fn visit_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
        self.enter_assignment_target_identifier(ast);
        self.visit_identifier(&ast.name);
        self.leave_assignment_target_identifier(ast);
    }

    fn enter_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
    }

    fn leave_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
    }

    fn visit_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
        self.enter_expression_or_super(ast);
        match ast {
            ExpressionOrSuper::Expression(ast) => {
                self.visit_enum_expression_or_super_variant_expression(ast)
            }
            ExpressionOrSuper::Super { .. } => {
                self.visit_enum_expression_or_super_variant_super()
            }
        }
        self.leave_expression_or_super(ast);
    }

    fn enter_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
    }

    fn leave_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
    }

    fn visit_enum_expression_or_super_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_expression_or_super_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_expression_or_super_variant_expression(ast);
    }

    fn enter_enum_expression_or_super_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_expression_or_super_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_expression_or_super_variant_super(&mut self) {
    }

    fn visit_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
        self.enter_member_assignment_target(ast);
        match ast {
            MemberAssignmentTarget::ComputedMemberAssignmentTarget(ast) => {
                self.visit_enum_member_assignment_target_variant_computed_member_assignment_target(ast)
            }
            MemberAssignmentTarget::PrivateFieldAssignmentTarget(ast) => {
                self.visit_enum_member_assignment_target_variant_private_field_assignment_target(ast)
            }
            MemberAssignmentTarget::StaticMemberAssignmentTarget(ast) => {
                self.visit_enum_member_assignment_target_variant_static_member_assignment_target(ast)
            }
        }
        self.leave_member_assignment_target(ast);
    }

    fn enter_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
    }

    fn leave_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
    }

    fn visit_enum_member_assignment_target_variant_computed_member_assignment_target(
        &mut self,
        ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_member_assignment_target_variant_computed_member_assignment_target(ast);
        self.visit_computed_member_assignment_target(ast);
        self.leave_enum_member_assignment_target_variant_computed_member_assignment_target(ast);
    }

    fn enter_enum_member_assignment_target_variant_computed_member_assignment_target(
        &mut self,
        ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_member_assignment_target_variant_computed_member_assignment_target(
        &mut self,
        ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_enum_member_assignment_target_variant_private_field_assignment_target(
        &mut self,
        ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_member_assignment_target_variant_private_field_assignment_target(ast);
        self.visit_private_field_assignment_target(ast);
        self.leave_enum_member_assignment_target_variant_private_field_assignment_target(ast);
    }

    fn enter_enum_member_assignment_target_variant_private_field_assignment_target(
        &mut self,
        ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_member_assignment_target_variant_private_field_assignment_target(
        &mut self,
        ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_enum_member_assignment_target_variant_static_member_assignment_target(
        &mut self,
        ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
    ) {
        self.enter_enum_member_assignment_target_variant_static_member_assignment_target(ast);
        self.visit_static_member_assignment_target(ast);
        self.leave_enum_member_assignment_target_variant_static_member_assignment_target(ast);
    }

    fn enter_enum_member_assignment_target_variant_static_member_assignment_target(
        &mut self,
        ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_member_assignment_target_variant_static_member_assignment_target(
        &mut self,
        ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
    ) {
    }

    fn visit_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
        self.enter_computed_member_assignment_target(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_expression(&ast.expression);
        self.leave_computed_member_assignment_target(ast);
    }

    fn enter_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
    }

    fn leave_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
    }

    fn visit_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
        self.enter_private_field_assignment_target(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_private_identifier(&ast.field);
        self.leave_private_field_assignment_target(ast);
    }

    fn enter_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
    }

    fn leave_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
    }

    fn visit_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
        self.enter_static_member_assignment_target(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_identifier_name(&ast.property);
        self.leave_static_member_assignment_target(ast);
    }

    fn enter_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
    }

    fn leave_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
    }

    fn visit_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
        self.enter_array_binding(ast);
        for item in &ast.elements {
            if let Some(item) = item {
                self.visit_parameter(item);
            }
        }
        if let Some(item) = &ast.rest {
            self.visit_binding(item);
        }
        self.leave_array_binding(ast);
    }

    fn enter_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
    }

    fn leave_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
    }

    fn visit_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
        self.enter_object_binding(ast);
        for item in &ast.properties {
            self.visit_binding_property(item);
        }
        if let Some(item) = &ast.rest {
            self.visit_binding_identifier(item);
        }
        self.leave_object_binding(ast);
    }

    fn enter_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
    }

    fn leave_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
    }

    fn visit_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
        self.enter_binding_property(ast);
        match ast {
            BindingProperty::BindingPropertyIdentifier(ast) => {
                self.visit_enum_binding_property_variant_binding_property_identifier(ast)
            }
            BindingProperty::BindingPropertyProperty(ast) => {
                self.visit_enum_binding_property_variant_binding_property_property(ast)
            }
        }
        self.leave_binding_property(ast);
    }

    fn enter_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
    }

    fn leave_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
    }

    fn visit_enum_binding_property_variant_binding_property_identifier(
        &mut self,
        ast: &'alloc BindingPropertyIdentifier<'alloc>,
    ) {
        self.enter_enum_binding_property_variant_binding_property_identifier(ast);
        self.visit_binding_property_identifier(ast);
        self.leave_enum_binding_property_variant_binding_property_identifier(ast);
    }

    fn enter_enum_binding_property_variant_binding_property_identifier(
        &mut self,
        ast: &'alloc BindingPropertyIdentifier<'alloc>,
    ) {
    }

    fn leave_enum_binding_property_variant_binding_property_identifier(
        &mut self,
        ast: &'alloc BindingPropertyIdentifier<'alloc>,
    ) {
    }

    fn visit_enum_binding_property_variant_binding_property_property(
        &mut self,
        ast: &'alloc BindingPropertyProperty<'alloc>,
    ) {
        self.enter_enum_binding_property_variant_binding_property_property(ast);
        self.visit_binding_property_property(ast);
        self.leave_enum_binding_property_variant_binding_property_property(ast);
    }

    fn enter_enum_binding_property_variant_binding_property_property(
        &mut self,
        ast: &'alloc BindingPropertyProperty<'alloc>,
    ) {
    }

    fn leave_enum_binding_property_variant_binding_property_property(
        &mut self,
        ast: &'alloc BindingPropertyProperty<'alloc>,
    ) {
    }

    fn visit_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
        self.enter_binding_property_identifier(ast);
        self.visit_binding_identifier(&ast.binding);
        if let Some(item) = &ast.init {
            self.visit_expression(item);
        }
        self.leave_binding_property_identifier(ast);
    }

    fn enter_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
    }

    fn leave_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
    }

    fn visit_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
        self.enter_binding_property_property(ast);
        self.visit_property_name(&ast.name);
        self.visit_parameter(&ast.binding);
        self.leave_binding_property_property(ast);
    }

    fn enter_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
    }

    fn leave_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
    }

    fn visit_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
        self.enter_assignment_target_with_default(ast);
        self.visit_assignment_target(&ast.binding);
        self.visit_expression(&ast.init);
        self.leave_assignment_target_with_default(ast);
    }

    fn enter_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
    }

    fn leave_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
    }

    fn visit_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
        self.enter_assignment_target_maybe_default(ast);
        match ast {
            AssignmentTargetMaybeDefault::AssignmentTarget(ast) => {
                self.visit_enum_assignment_target_maybe_default_variant_assignment_target(ast)
            }
            AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(ast) => {
                self.visit_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast)
            }
        }
        self.leave_assignment_target_maybe_default(ast);
    }

    fn enter_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
    }

    fn leave_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
    }

    fn visit_enum_assignment_target_maybe_default_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
        self.enter_enum_assignment_target_maybe_default_variant_assignment_target(ast);
        self.visit_assignment_target(ast);
        self.leave_enum_assignment_target_maybe_default_variant_assignment_target(ast);
    }

    fn enter_enum_assignment_target_maybe_default_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_maybe_default_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
    }

    fn visit_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
        &mut self,
        ast: &'alloc AssignmentTargetWithDefault<'alloc>,
    ) {
        self.enter_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast);
        self.visit_assignment_target_with_default(ast);
        self.leave_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast);
    }

    fn enter_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
        &mut self,
        ast: &'alloc AssignmentTargetWithDefault<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
        &mut self,
        ast: &'alloc AssignmentTargetWithDefault<'alloc>,
    ) {
    }

    fn visit_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
        self.enter_array_assignment_target(ast);
        for item in &ast.elements {
            if let Some(item) = item {
                self.visit_assignment_target_maybe_default(item);
            }
        }
        if let Some(item) = &ast.rest {
            self.visit_assignment_target(item);
        }
        self.leave_array_assignment_target(ast);
    }

    fn enter_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
    }

    fn leave_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
    }

    fn visit_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
        self.enter_object_assignment_target(ast);
        for item in &ast.properties {
            self.visit_assignment_target_property(item);
        }
        if let Some(item) = &ast.rest {
            self.visit_assignment_target(item);
        }
        self.leave_object_assignment_target(ast);
    }

    fn enter_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
    }

    fn leave_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
    }

    fn visit_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
        self.enter_assignment_target_property(ast);
        match ast {
            AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(ast) => {
                self.visit_enum_assignment_target_property_variant_assignment_target_property_identifier(ast)
            }
            AssignmentTargetProperty::AssignmentTargetPropertyProperty(ast) => {
                self.visit_enum_assignment_target_property_variant_assignment_target_property_property(ast)
            }
        }
        self.leave_assignment_target_property(ast);
    }

    fn enter_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
    }

    fn leave_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
    }

    fn visit_enum_assignment_target_property_variant_assignment_target_property_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
    ) {
        self.enter_enum_assignment_target_property_variant_assignment_target_property_identifier(ast);
        self.visit_assignment_target_property_identifier(ast);
        self.leave_enum_assignment_target_property_variant_assignment_target_property_identifier(ast);
    }

    fn enter_enum_assignment_target_property_variant_assignment_target_property_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_property_variant_assignment_target_property_identifier(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
    ) {
    }

    fn visit_enum_assignment_target_property_variant_assignment_target_property_property(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
    ) {
        self.enter_enum_assignment_target_property_variant_assignment_target_property_property(ast);
        self.visit_assignment_target_property_property(ast);
        self.leave_enum_assignment_target_property_variant_assignment_target_property_property(ast);
    }

    fn enter_enum_assignment_target_property_variant_assignment_target_property_property(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
    ) {
    }

    fn leave_enum_assignment_target_property_variant_assignment_target_property_property(
        &mut self,
        ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
    ) {
    }

    fn visit_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
        self.enter_assignment_target_property_identifier(ast);
        self.visit_assignment_target_identifier(&ast.binding);
        if let Some(item) = &ast.init {
            self.visit_expression(item);
        }
        self.leave_assignment_target_property_identifier(ast);
    }

    fn enter_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
    }

    fn leave_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
    }

    fn visit_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
        self.enter_assignment_target_property_property(ast);
        self.visit_property_name(&ast.name);
        self.visit_assignment_target_maybe_default(&ast.binding);
        self.leave_assignment_target_property_property(ast);
    }

    fn enter_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
    }

    fn leave_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
    }

    fn visit_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
        self.enter_class_expression(ast);
        if let Some(item) = &ast.name {
            self.visit_binding_identifier(item);
        }
        if let Some(item) = &ast.super_ {
            self.visit_expression(item);
        }
        for item in &ast.elements {
            self.visit_class_element(item);
        }
        self.leave_class_expression(ast);
    }

    fn enter_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
    }

    fn leave_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
    }

    fn visit_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
        self.enter_class_declaration(ast);
        self.visit_binding_identifier(&ast.name);
        if let Some(item) = &ast.super_ {
            self.visit_expression(item);
        }
        for item in &ast.elements {
            self.visit_class_element(item);
        }
        self.leave_class_declaration(ast);
    }

    fn enter_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
    }

    fn leave_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
    }

    fn visit_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
        self.enter_class_element(ast);
        match ast {
            ClassElement::MethodDefinition { is_static, method, .. } => {
                self.visit_enum_class_element_variant_method_definition(
                    is_static,
                    method,
                )
            }
            ClassElement::FieldDefinition { name, init, .. } => {
                self.visit_enum_class_element_variant_field_definition(
                    name,
                    init,
                )
            }
        }
        self.leave_class_element(ast);
    }

    fn enter_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
    }

    fn leave_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
    }

    fn visit_enum_class_element_variant_method_definition(
        &mut self,
        is_static: &'alloc bool,
        method: &'alloc MethodDefinition<'alloc>,
    ) {
        self.enter_enum_class_element_variant_method_definition(
            is_static,
            method,
        );
        self.visit_method_definition(method);
        self.leave_enum_class_element_variant_method_definition(
            is_static,
            method,
        );
    }

    fn enter_enum_class_element_variant_method_definition(
        &mut self,
        is_static: &'alloc bool,
        method: &'alloc MethodDefinition<'alloc>,
    ) {
    }

    fn leave_enum_class_element_variant_method_definition(
        &mut self,
        is_static: &'alloc bool,
        method: &'alloc MethodDefinition<'alloc>,
    ) {
    }

    fn visit_enum_class_element_variant_field_definition(
        &mut self,
        name: &'alloc ClassElementName<'alloc>,
        init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
        self.enter_enum_class_element_variant_field_definition(
            name,
            init,
        );
        self.visit_class_element_name(name);
        if let Some(item) = init {
            self.visit_expression(item);
        }
        self.leave_enum_class_element_variant_field_definition(
            name,
            init,
        );
    }

    fn enter_enum_class_element_variant_field_definition(
        &mut self,
        name: &'alloc ClassElementName<'alloc>,
        init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn leave_enum_class_element_variant_field_definition(
        &mut self,
        name: &'alloc ClassElementName<'alloc>,
        init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
    ) {
    }

    fn visit_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
        self.enter_module_items(ast);
        match ast {
            ModuleItems::ImportDeclaration(ast) => {
                self.visit_enum_module_items_variant_import_declaration(ast)
            }
            ModuleItems::ExportDeclaration(ast) => {
                self.visit_enum_module_items_variant_export_declaration(ast)
            }
            ModuleItems::Statement(ast) => {
                self.visit_enum_module_items_variant_statement(ast)
            }
        }
        self.leave_module_items(ast);
    }

    fn enter_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
    }

    fn leave_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
    }

    fn visit_enum_module_items_variant_import_declaration(
        &mut self,
        ast: &'alloc ImportDeclaration<'alloc>,
    ) {
        self.enter_enum_module_items_variant_import_declaration(ast);
        self.visit_import_declaration(ast);
        self.leave_enum_module_items_variant_import_declaration(ast);
    }

    fn enter_enum_module_items_variant_import_declaration(
        &mut self,
        ast: &'alloc ImportDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_module_items_variant_import_declaration(
        &mut self,
        ast: &'alloc ImportDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_module_items_variant_export_declaration(
        &mut self,
        ast: &'alloc ExportDeclaration<'alloc>,
    ) {
        self.enter_enum_module_items_variant_export_declaration(ast);
        self.visit_export_declaration(ast);
        self.leave_enum_module_items_variant_export_declaration(ast);
    }

    fn enter_enum_module_items_variant_export_declaration(
        &mut self,
        ast: &'alloc ExportDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_module_items_variant_export_declaration(
        &mut self,
        ast: &'alloc ExportDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_module_items_variant_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
        self.enter_enum_module_items_variant_statement(ast);
        self.visit_statement(ast);
        self.leave_enum_module_items_variant_statement(ast);
    }

    fn enter_enum_module_items_variant_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn leave_enum_module_items_variant_statement(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
    ) {
    }

    fn visit_module(&mut self, ast: &'alloc Module<'alloc>) {
        self.enter_module(ast);
        for item in &ast.directives {
            self.visit_directive(item);
        }
        for item in &ast.items {
            self.visit_module_items(item);
        }
        self.leave_module(ast);
    }

    fn enter_module(&mut self, ast: &'alloc Module<'alloc>) {
    }

    fn leave_module(&mut self, ast: &'alloc Module<'alloc>) {
    }

    fn visit_import(&mut self, ast: &'alloc Import<'alloc>) {
        self.enter_import(ast);
        if let Some(item) = &ast.default_binding {
            self.visit_binding_identifier(item);
        }
        for item in &ast.named_imports {
            self.visit_import_specifier(item);
        }
        self.leave_import(ast);
    }

    fn enter_import(&mut self, ast: &'alloc Import<'alloc>) {
    }

    fn leave_import(&mut self, ast: &'alloc Import<'alloc>) {
    }

    fn visit_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
        self.enter_import_namespace(ast);
        if let Some(item) = &ast.default_binding {
            self.visit_binding_identifier(item);
        }
        self.visit_binding_identifier(&ast.namespace_binding);
        self.leave_import_namespace(ast);
    }

    fn enter_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
    }

    fn leave_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
    }

    fn visit_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
        self.enter_import_specifier(ast);
        if let Some(item) = &ast.name {
            self.visit_identifier_name(item);
        }
        self.visit_binding_identifier(&ast.binding);
        self.leave_import_specifier(ast);
    }

    fn enter_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
    }

    fn leave_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
    }

    fn visit_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
        self.enter_export_all_from(ast);
        self.leave_export_all_from(ast);
    }

    fn enter_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
    }

    fn leave_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
    }

    fn visit_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
        self.enter_export_from(ast);
        for item in &ast.named_exports {
            self.visit_export_from_specifier(item);
        }
        self.leave_export_from(ast);
    }

    fn enter_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
    }

    fn leave_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
    }

    fn visit_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
        self.enter_export_locals(ast);
        for item in &ast.named_exports {
            self.visit_export_local_specifier(item);
        }
        self.leave_export_locals(ast);
    }

    fn enter_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
    }

    fn leave_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
    }

    fn visit_export(&mut self, ast: &'alloc Export<'alloc>) {
        self.enter_export(ast);
        match ast {
            Export::FunctionDeclaration(ast) => {
                self.visit_enum_export_variant_function_declaration(ast)
            }
            Export::ClassDeclaration(ast) => {
                self.visit_enum_export_variant_class_declaration(ast)
            }
            Export::VariableDeclaration(ast) => {
                self.visit_enum_export_variant_variable_declaration(ast)
            }
        }
        self.leave_export(ast);
    }

    fn enter_export(&mut self, ast: &'alloc Export<'alloc>) {
    }

    fn leave_export(&mut self, ast: &'alloc Export<'alloc>) {
    }

    fn visit_enum_export_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
        self.enter_enum_export_variant_function_declaration(ast);
        self.visit_function(ast);
        self.leave_enum_export_variant_function_declaration(ast);
    }

    fn enter_enum_export_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn leave_enum_export_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn visit_enum_export_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
        self.enter_enum_export_variant_class_declaration(ast);
        self.visit_class_declaration(ast);
        self.leave_enum_export_variant_class_declaration(ast);
    }

    fn enter_enum_export_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_export_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_export_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
        self.enter_enum_export_variant_variable_declaration(ast);
        self.visit_variable_declaration(ast);
        self.leave_enum_export_variant_variable_declaration(ast);
    }

    fn enter_enum_export_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_export_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn visit_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
        self.enter_export_default(ast);
        match ast {
            ExportDefault::FunctionDeclaration(ast) => {
                self.visit_enum_export_default_variant_function_declaration(ast)
            }
            ExportDefault::ClassDeclaration(ast) => {
                self.visit_enum_export_default_variant_class_declaration(ast)
            }
            ExportDefault::Expression(ast) => {
                self.visit_enum_export_default_variant_expression(ast)
            }
        }
        self.leave_export_default(ast);
    }

    fn enter_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
    }

    fn leave_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
    }

    fn visit_enum_export_default_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
        self.enter_enum_export_default_variant_function_declaration(ast);
        self.visit_function(ast);
        self.leave_enum_export_default_variant_function_declaration(ast);
    }

    fn enter_enum_export_default_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn leave_enum_export_default_variant_function_declaration(
        &mut self,
        ast: &'alloc Function<'alloc>,
    ) {
    }

    fn visit_enum_export_default_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
        self.enter_enum_export_default_variant_class_declaration(ast);
        self.visit_class_declaration(ast);
        self.leave_enum_export_default_variant_class_declaration(ast);
    }

    fn enter_enum_export_default_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_export_default_variant_class_declaration(
        &mut self,
        ast: &'alloc ClassDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_export_default_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_export_default_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_export_default_variant_expression(ast);
    }

    fn enter_enum_export_default_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_export_default_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
        self.enter_export_from_specifier(ast);
        self.visit_identifier_name(&ast.name);
        if let Some(item) = &ast.exported_name {
            self.visit_identifier_name(item);
        }
        self.leave_export_from_specifier(ast);
    }

    fn enter_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
    }

    fn leave_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
    }

    fn visit_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
        self.enter_export_local_specifier(ast);
        self.visit_identifier_expression(&ast.name);
        if let Some(item) = &ast.exported_name {
            self.visit_identifier_name(item);
        }
        self.leave_export_local_specifier(ast);
    }

    fn enter_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
    }

    fn leave_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
    }

    fn visit_method(&mut self, ast: &'alloc Method<'alloc>) {
        self.enter_method(ast);
        self.visit_class_element_name(&ast.name);
        self.visit_formal_parameters(&ast.params);
        self.visit_function_body(&ast.body);
        self.leave_method(ast);
    }

    fn enter_method(&mut self, ast: &'alloc Method<'alloc>) {
    }

    fn leave_method(&mut self, ast: &'alloc Method<'alloc>) {
    }

    fn visit_getter(&mut self, ast: &'alloc Getter<'alloc>) {
        self.enter_getter(ast);
        self.visit_class_element_name(&ast.property_name);
        self.visit_function_body(&ast.body);
        self.leave_getter(ast);
    }

    fn enter_getter(&mut self, ast: &'alloc Getter<'alloc>) {
    }

    fn leave_getter(&mut self, ast: &'alloc Getter<'alloc>) {
    }

    fn visit_setter(&mut self, ast: &'alloc Setter<'alloc>) {
        self.enter_setter(ast);
        self.visit_class_element_name(&ast.property_name);
        self.visit_parameter(&ast.param);
        self.visit_function_body(&ast.body);
        self.leave_setter(ast);
    }

    fn enter_setter(&mut self, ast: &'alloc Setter<'alloc>) {
    }

    fn leave_setter(&mut self, ast: &'alloc Setter<'alloc>) {
    }

    fn visit_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
        self.enter_data_property(ast);
        self.visit_property_name(&ast.property_name);
        self.visit_expression(&ast.expression);
        self.leave_data_property(ast);
    }

    fn enter_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
    }

    fn leave_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
    }

    fn visit_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
        self.enter_shorthand_property(ast);
        self.visit_identifier_expression(&ast.name);
        self.leave_shorthand_property(ast);
    }

    fn enter_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
    }

    fn leave_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
    }

    fn visit_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
        self.enter_computed_property_name(ast);
        self.visit_expression(&ast.expression);
        self.leave_computed_property_name(ast);
    }

    fn enter_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
    }

    fn leave_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
    }

    fn visit_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
        self.enter_static_property_name(ast);
        self.leave_static_property_name(ast);
    }

    fn enter_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
    }

    fn leave_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
    }

    fn visit_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
        self.enter_numeric_literal(ast);
        self.leave_numeric_literal(ast);
    }

    fn enter_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
    }

    fn leave_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
    }

    fn visit_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
        self.enter_array_expression_element(ast);
        match ast {
            ArrayExpressionElement::SpreadElement(ast) => {
                self.visit_enum_array_expression_element_variant_spread_element(ast)
            }
            ArrayExpressionElement::Expression(ast) => {
                self.visit_enum_array_expression_element_variant_expression(ast)
            }
            ArrayExpressionElement::Elision { .. } => {
                self.visit_enum_array_expression_element_variant_elision()
            }
        }
        self.leave_array_expression_element(ast);
    }

    fn enter_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
    }

    fn leave_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
    }

    fn visit_enum_array_expression_element_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_array_expression_element_variant_spread_element(ast);
        self.visit_expression(ast);
        self.leave_enum_array_expression_element_variant_spread_element(ast);
    }

    fn enter_enum_array_expression_element_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_array_expression_element_variant_spread_element(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_array_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_array_expression_element_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_array_expression_element_variant_expression(ast);
    }

    fn enter_enum_array_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_array_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_array_expression_element_variant_elision(&mut self) {
    }

    fn visit_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
        self.enter_array_expression(ast);
        for item in &ast.elements {
            self.visit_array_expression_element(item);
        }
        self.leave_array_expression(ast);
    }

    fn enter_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
    }

    fn leave_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
    }

    fn visit_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
        self.enter_arrow_expression_body(ast);
        match ast {
            ArrowExpressionBody::FunctionBody(ast) => {
                self.visit_enum_arrow_expression_body_variant_function_body(ast)
            }
            ArrowExpressionBody::Expression(ast) => {
                self.visit_enum_arrow_expression_body_variant_expression(ast)
            }
        }
        self.leave_arrow_expression_body(ast);
    }

    fn enter_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
    }

    fn leave_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
    }

    fn visit_enum_arrow_expression_body_variant_function_body(
        &mut self,
        ast: &'alloc FunctionBody<'alloc>,
    ) {
        self.enter_enum_arrow_expression_body_variant_function_body(ast);
        self.visit_function_body(ast);
        self.leave_enum_arrow_expression_body_variant_function_body(ast);
    }

    fn enter_enum_arrow_expression_body_variant_function_body(
        &mut self,
        ast: &'alloc FunctionBody<'alloc>,
    ) {
    }

    fn leave_enum_arrow_expression_body_variant_function_body(
        &mut self,
        ast: &'alloc FunctionBody<'alloc>,
    ) {
    }

    fn visit_enum_arrow_expression_body_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_arrow_expression_body_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_arrow_expression_body_variant_expression(ast);
    }

    fn enter_enum_arrow_expression_body_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_arrow_expression_body_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
        self.enter_computed_member_expression(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_expression(&ast.expression);
        self.leave_computed_member_expression(ast);
    }

    fn enter_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
    }

    fn leave_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
    }

    fn visit_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
        self.enter_identifier_expression(ast);
        self.visit_identifier(&ast.name);
        self.leave_identifier_expression(ast);
    }

    fn enter_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
    }

    fn leave_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
    }

    fn visit_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
        self.enter_object_expression(ast);
        for item in &ast.properties {
            self.visit_object_property(item);
        }
        self.leave_object_expression(ast);
    }

    fn enter_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
    }

    fn leave_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
    }

    fn visit_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
        self.enter_static_member_expression(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_identifier_name(&ast.property);
        self.leave_static_member_expression(ast);
    }

    fn enter_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
    }

    fn leave_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
    }

    fn visit_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
        self.enter_private_field_expression(ast);
        self.visit_expression_or_super(&ast.object);
        self.visit_private_identifier(&ast.field);
        self.leave_private_field_expression(ast);
    }

    fn enter_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
    }

    fn leave_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
    }

    fn visit_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
        self.enter_template_expression_element(ast);
        match ast {
            TemplateExpressionElement::Expression(ast) => {
                self.visit_enum_template_expression_element_variant_expression(ast)
            }
            TemplateExpressionElement::TemplateElement(ast) => {
                self.visit_enum_template_expression_element_variant_template_element(ast)
            }
        }
        self.leave_template_expression_element(ast);
    }

    fn enter_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
    }

    fn leave_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
    }

    fn visit_enum_template_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_template_expression_element_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_template_expression_element_variant_expression(ast);
    }

    fn enter_enum_template_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_template_expression_element_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_template_expression_element_variant_template_element(
        &mut self,
        ast: &'alloc TemplateElement,
    ) {
        self.enter_enum_template_expression_element_variant_template_element(ast);
        self.visit_template_element(ast);
        self.leave_enum_template_expression_element_variant_template_element(ast);
    }

    fn enter_enum_template_expression_element_variant_template_element(
        &mut self,
        ast: &'alloc TemplateElement,
    ) {
    }

    fn leave_enum_template_expression_element_variant_template_element(
        &mut self,
        ast: &'alloc TemplateElement,
    ) {
    }

    fn visit_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
        self.enter_template_expression(ast);
        if let Some(item) = &ast.tag {
            self.visit_expression(item);
        }
        for item in &ast.elements {
            self.visit_template_expression_element(item);
        }
        self.leave_template_expression(ast);
    }

    fn enter_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
    }

    fn leave_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
    }

    fn visit_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
        self.enter_variable_declaration_or_assignment_target(ast);
        match ast {
            VariableDeclarationOrAssignmentTarget::VariableDeclaration(ast) => {
                self.visit_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast)
            }
            VariableDeclarationOrAssignmentTarget::AssignmentTarget(ast) => {
                self.visit_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast)
            }
        }
        self.leave_variable_declaration_or_assignment_target(ast);
    }

    fn enter_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
    }

    fn leave_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
    }

    fn visit_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
        self.enter_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast);
        self.visit_variable_declaration(ast);
        self.leave_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast);
    }

    fn enter_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_variable_declaration_or_assignment_target_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
        self.enter_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast);
        self.visit_assignment_target(ast);
        self.leave_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast);
    }

    fn enter_enum_variable_declaration_or_assignment_target_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
    }

    fn leave_enum_variable_declaration_or_assignment_target_variant_assignment_target(
        &mut self,
        ast: &'alloc AssignmentTarget<'alloc>,
    ) {
    }

    fn visit_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
        self.enter_variable_declaration_or_expression(ast);
        match ast {
            VariableDeclarationOrExpression::VariableDeclaration(ast) => {
                self.visit_enum_variable_declaration_or_expression_variant_variable_declaration(ast)
            }
            VariableDeclarationOrExpression::Expression(ast) => {
                self.visit_enum_variable_declaration_or_expression_variant_expression(ast)
            }
        }
        self.leave_variable_declaration_or_expression(ast);
    }

    fn enter_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
    }

    fn leave_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
    }

    fn visit_enum_variable_declaration_or_expression_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
        self.enter_enum_variable_declaration_or_expression_variant_variable_declaration(ast);
        self.visit_variable_declaration(ast);
        self.leave_enum_variable_declaration_or_expression_variant_variable_declaration(ast);
    }

    fn enter_enum_variable_declaration_or_expression_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn leave_enum_variable_declaration_or_expression_variant_variable_declaration(
        &mut self,
        ast: &'alloc VariableDeclaration<'alloc>,
    ) {
    }

    fn visit_enum_variable_declaration_or_expression_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_variable_declaration_or_expression_variant_expression(ast);
        self.visit_expression(ast);
        self.leave_enum_variable_declaration_or_expression_variant_expression(ast);
    }

    fn enter_enum_variable_declaration_or_expression_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_variable_declaration_or_expression_variant_expression(
        &mut self,
        ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_block(&mut self, ast: &'alloc Block<'alloc>) {
        self.enter_block(ast);
        for item in &ast.statements {
            self.visit_statement(item);
        }
        if let Some(item) = &ast.declarations {
            for item in item {
            }
        }
        self.leave_block(ast);
    }

    fn enter_block(&mut self, ast: &'alloc Block<'alloc>) {
    }

    fn leave_block(&mut self, ast: &'alloc Block<'alloc>) {
    }

    fn visit_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
        self.enter_catch_clause(ast);
        if let Some(item) = &ast.binding {
            self.visit_binding(item);
        }
        self.visit_block(&ast.body);
        self.leave_catch_clause(ast);
    }

    fn enter_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
    }

    fn leave_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
    }

    fn visit_directive(&mut self, ast: &'alloc Directive) {
        self.enter_directive(ast);
        self.leave_directive(ast);
    }

    fn enter_directive(&mut self, ast: &'alloc Directive) {
    }

    fn leave_directive(&mut self, ast: &'alloc Directive) {
    }

    fn visit_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
        self.enter_formal_parameters(ast);
        for item in &ast.items {
            self.visit_parameter(item);
        }
        if let Some(item) = &ast.rest {
            self.visit_binding(item);
        }
        self.leave_formal_parameters(ast);
    }

    fn enter_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
    }

    fn leave_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
    }

    fn visit_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
        self.enter_function_body(ast);
        for item in &ast.directives {
            self.visit_directive(item);
        }
        for item in &ast.statements {
            self.visit_statement(item);
        }
        self.leave_function_body(ast);
    }

    fn enter_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
    }

    fn leave_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
    }

    fn visit_script(&mut self, ast: &'alloc Script<'alloc>) {
        self.enter_script(ast);
        for item in &ast.directives {
            self.visit_directive(item);
        }
        for item in &ast.statements {
            self.visit_statement(item);
        }
        self.leave_script(ast);
    }

    fn enter_script(&mut self, ast: &'alloc Script<'alloc>) {
    }

    fn leave_script(&mut self, ast: &'alloc Script<'alloc>) {
    }

    fn visit_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
        self.enter_switch_case(ast);
        self.visit_expression(&ast.test);
        for item in &ast.consequent {
            self.visit_statement(item);
        }
        self.leave_switch_case(ast);
    }

    fn enter_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
    }

    fn leave_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
    }

    fn visit_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
        self.enter_switch_default(ast);
        for item in &ast.consequent {
            self.visit_statement(item);
        }
        self.leave_switch_default(ast);
    }

    fn enter_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
    }

    fn leave_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
    }

    fn visit_template_element(&mut self, ast: &'alloc TemplateElement) {
        self.enter_template_element(ast);
        self.leave_template_element(ast);
    }

    fn enter_template_element(&mut self, ast: &'alloc TemplateElement) {
    }

    fn leave_template_element(&mut self, ast: &'alloc TemplateElement) {
    }

    fn visit_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
        self.enter_variable_declaration(ast);
        self.visit_variable_declaration_kind(&ast.kind);
        for item in &ast.declarators {
            self.visit_variable_declarator(item);
        }
        self.leave_variable_declaration(ast);
    }

    fn enter_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
    }

    fn leave_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
    }

    fn visit_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
        self.enter_variable_declarator(ast);
        self.visit_binding(&ast.binding);
        if let Some(item) = &ast.init {
            self.visit_expression(item);
        }
        self.leave_variable_declarator(ast);
    }

    fn enter_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
    }

    fn leave_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
    }

    fn visit_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
        self.enter_cover_parenthesized(ast);
        match ast {
            CoverParenthesized::Expression { expression, .. } => {
                self.visit_enum_cover_parenthesized_variant_expression(
                    expression,
                )
            }
            CoverParenthesized::Parameters(ast) => {
                self.visit_enum_cover_parenthesized_variant_parameters(ast)
            }
        }
        self.leave_cover_parenthesized(ast);
    }

    fn enter_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
    }

    fn leave_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
    }

    fn visit_enum_cover_parenthesized_variant_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
        self.enter_enum_cover_parenthesized_variant_expression(
            expression,
        );
        self.visit_expression(expression);
        self.leave_enum_cover_parenthesized_variant_expression(
            expression,
        );
    }

    fn enter_enum_cover_parenthesized_variant_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn leave_enum_cover_parenthesized_variant_expression(
        &mut self,
        expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
    ) {
    }

    fn visit_enum_cover_parenthesized_variant_parameters(
        &mut self,
        ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
    ) {
        self.enter_enum_cover_parenthesized_variant_parameters(ast);
        self.visit_formal_parameters(ast);
        self.leave_enum_cover_parenthesized_variant_parameters(ast);
    }

    fn enter_enum_cover_parenthesized_variant_parameters(
        &mut self,
        ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
    ) {
    }

    fn leave_enum_cover_parenthesized_variant_parameters(
        &mut self,
        ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
    ) {
    }

}


[Verzeichnis aufwärts0.75unsichere VerbindungÜbersetzung europäischer Sprachen durch Browser2026-04-26]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge