// Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.

#pragma once

#include <hilti/ast/forward.h>

namespace hilti::visitor {

class Dispatcher {
public:
    /** Numerical tag identifying a type of dispatcher. */
    using Tag = unsigned int;

    /** Tag for the HILTI dispatcher. */
    static constexpr unsigned int HILTI = 1;

    /**
     * Constructor.
     *
     * @param tag tag identifying the type of dispatcher; derived classes can
     * pick a value of their choice
     */
    Dispatcher(Tag tag = HILTI) : _tag(tag) {}

    /**
     * Destructor. Only defined so it's marked virtual.
     */
    virtual ~Dispatcher() = default;

    /**
     * Returns a tag identifying the dispatcher. By default, this returns
     * `dispatcher::HILTI`. A derived class can have it return a different tag
     * of its choice by passing the desired value into the constructor.
     */
    unsigned int dispatcherTag() const { return _tag; }

    virtual void operator()(hilti::ASTRoot*) {}
    virtual void operator()(hilti::Attribute*) {}
    virtual void operator()(hilti::AttributeSet*) {}
    virtual void operator()(hilti::Ctor*) {}
    virtual void operator()(hilti::Declaration*) {}
    virtual void operator()(hilti::Expression*) {}
    virtual void operator()(hilti::Function*) {}
    virtual void operator()(hilti::QualifiedType*) {}
    virtual void operator()(hilti::Statement*) {}
    virtual void operator()(hilti::UnqualifiedType*) {}
    virtual void operator()(hilti::ctor::Address*) {}
    virtual void operator()(hilti::ctor::bitfield::BitRange*) {}
    virtual void operator()(hilti::ctor::Bitfield*) {}
    virtual void operator()(hilti::ctor::Bool*) {}
    virtual void operator()(hilti::ctor::Bytes*) {}
    virtual void operator()(hilti::ctor::Coerced*) {}
    virtual void operator()(hilti::ctor::Default*) {}
    virtual void operator()(hilti::ctor::Enum*) {}
    virtual void operator()(hilti::ctor::Error*) {}
    virtual void operator()(hilti::ctor::Exception*) {}
    virtual void operator()(hilti::ctor::Interval*) {}
    virtual void operator()(hilti::ctor::Library*) {}
    virtual void operator()(hilti::ctor::List*) {}
    virtual void operator()(hilti::ctor::Map*) {}
    virtual void operator()(hilti::ctor::Network*) {}
    virtual void operator()(hilti::Node*) {}
    virtual void operator()(hilti::ctor::Null*) {}
    virtual void operator()(hilti::ctor::Optional*) {}
    virtual void operator()(hilti::ctor::Port*) {}
    virtual void operator()(hilti::ctor::Real*) {}
    virtual void operator()(hilti::ctor::RegExp*) {}
    virtual void operator()(hilti::ctor::Result*) {}
    virtual void operator()(hilti::ctor::Set*) {}
    virtual void operator()(hilti::ctor::SignedInteger*) {}
    virtual void operator()(hilti::ctor::Stream*) {}
    virtual void operator()(hilti::ctor::String*) {}
    virtual void operator()(hilti::ctor::StrongReference*) {}
    virtual void operator()(hilti::ctor::Struct*) {}
    virtual void operator()(hilti::ctor::Time*) {}
    virtual void operator()(hilti::ctor::Tuple*) {}
    virtual void operator()(hilti::ctor::Union*) {}
    virtual void operator()(hilti::ctor::UnsignedInteger*) {}
    virtual void operator()(hilti::ctor::ValueReference*) {}
    virtual void operator()(hilti::ctor::Vector*) {}
    virtual void operator()(hilti::ctor::WeakReference*) {}
    virtual void operator()(hilti::ctor::map::Element*) {}
    virtual void operator()(hilti::ctor::struct_::Field*) {}
    virtual void operator()(hilti::declaration::Constant*) {}
    virtual void operator()(hilti::declaration::Export*) {}
    virtual void operator()(hilti::declaration::Expression*) {}
    virtual void operator()(hilti::declaration::Field*) {}
    virtual void operator()(hilti::declaration::Function*) {}
    virtual void operator()(hilti::declaration::GlobalVariable*) {}
    virtual void operator()(hilti::declaration::ImportedModule*) {}
    virtual void operator()(hilti::declaration::LocalVariable*) {}
    virtual void operator()(hilti::declaration::Module*) {}
    virtual void operator()(hilti::declaration::Property*) {}
    virtual void operator()(hilti::declaration::Type*) {}
    virtual void operator()(hilti::expression::Assign*) {}
    virtual void operator()(hilti::expression::Coerced*) {}
    virtual void operator()(hilti::expression::Ctor*) {}
    virtual void operator()(hilti::expression::Grouping*) {}
    virtual void operator()(hilti::expression::Keyword*) {}
    virtual void operator()(hilti::expression::ListComprehension*) {}
    virtual void operator()(hilti::expression::LogicalAnd*) {}
    virtual void operator()(hilti::expression::LogicalNot*) {}
    virtual void operator()(hilti::expression::LogicalOr*) {}
    virtual void operator()(hilti::expression::Member*) {}
    virtual void operator()(hilti::expression::Move*) {}
    virtual void operator()(hilti::expression::Name*) {}
    virtual void operator()(hilti::expression::ConditionTest*) {}
    virtual void operator()(hilti::expression::PendingCoerced*) {}
    virtual void operator()(hilti::expression::ResolvedOperator*) {}
    virtual void operator()(hilti::expression::Ternary*) {}
    virtual void operator()(hilti::expression::TypeInfo*) {}
    virtual void operator()(hilti::expression::TypeWrapped*) {}
    virtual void operator()(hilti::expression::Type_*) {}
    virtual void operator()(hilti::expression::UnresolvedOperator*) {}
    virtual void operator()(hilti::expression::Void*) {}
    virtual void operator()(hilti::operator_::function::Call*) {}
    virtual void operator()(hilti::operator_::struct_::MemberCall*) {}
    virtual void operator()(hilti::operator_::generic::CastedCoercion*) {}
    virtual void operator()(hilti::operator_::address::Equal*) {}
    virtual void operator()(hilti::operator_::address::Unequal*) {}
    virtual void operator()(hilti::operator_::address::Family*) {}
    virtual void operator()(hilti::operator_::bitfield::Member*) {}
    virtual void operator()(hilti::operator_::bitfield::HasMember*) {}
    virtual void operator()(hilti::operator_::bool_::Equal*) {}
    virtual void operator()(hilti::operator_::bool_::Unequal*) {}
    virtual void operator()(hilti::operator_::bool_::BitAnd*) {}
    virtual void operator()(hilti::operator_::bool_::BitOr*) {}
    virtual void operator()(hilti::operator_::bool_::BitXor*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Lower*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::LowerEqual*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Greater*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Difference*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Sum*) {}
    virtual void operator()(hilti::operator_::bytes::iterator::SumAssign*) {}
    virtual void operator()(hilti::operator_::bytes::Size*) {}
    virtual void operator()(hilti::operator_::bytes::Equal*) {}
    virtual void operator()(hilti::operator_::bytes::Unequal*) {}
    virtual void operator()(hilti::operator_::bytes::Greater*) {}
    virtual void operator()(hilti::operator_::bytes::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::bytes::In*) {}
    virtual void operator()(hilti::operator_::bytes::Lower*) {}
    virtual void operator()(hilti::operator_::bytes::LowerEqual*) {}
    virtual void operator()(hilti::operator_::bytes::Sum*) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignBytes*) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignStreamView*) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignUInt8*) {}
    virtual void operator()(hilti::operator_::bytes::Find*) {}
    virtual void operator()(hilti::operator_::bytes::LowerCase*) {}
    virtual void operator()(hilti::operator_::bytes::UpperCase*) {}
    virtual void operator()(hilti::operator_::bytes::At*) {}
    virtual void operator()(hilti::operator_::bytes::Split*) {}
    virtual void operator()(hilti::operator_::bytes::Split1*) {}
    virtual void operator()(hilti::operator_::bytes::StartsWith*) {}
    virtual void operator()(hilti::operator_::bytes::EndsWith*) {}
    virtual void operator()(hilti::operator_::bytes::Strip*) {}
    virtual void operator()(hilti::operator_::bytes::SubIterators*) {}
    virtual void operator()(hilti::operator_::bytes::SubIterator*) {}
    virtual void operator()(hilti::operator_::bytes::SubOffsets*) {}
    virtual void operator()(hilti::operator_::bytes::Join*) {}
    virtual void operator()(hilti::operator_::bytes::ToIntAscii*) {}
    virtual void operator()(hilti::operator_::bytes::ToUIntAscii*) {}
    virtual void operator()(hilti::operator_::bytes::ToIntBinary*) {}
    virtual void operator()(hilti::operator_::bytes::ToUIntBinary*) {}
    virtual void operator()(hilti::operator_::bytes::ToRealAscii*) {}
    virtual void operator()(hilti::operator_::bytes::ToTimeAscii*) {}
    virtual void operator()(hilti::operator_::bytes::ToTimeBinary*) {}
    virtual void operator()(hilti::operator_::bytes::Decode*) {}
    virtual void operator()(hilti::operator_::bytes::Match*) {}
    virtual void operator()(hilti::operator_::enum_::Equal*) {}
    virtual void operator()(hilti::operator_::enum_::Unequal*) {}
    virtual void operator()(hilti::operator_::enum_::CastToSignedInteger*) {}
    virtual void operator()(hilti::operator_::enum_::CastToUnsignedInteger*) {}
    virtual void operator()(hilti::operator_::enum_::CtorSigned*) {}
    virtual void operator()(hilti::operator_::enum_::CtorUnsigned*) {}
    virtual void operator()(hilti::operator_::enum_::HasLabel*) {}
    virtual void operator()(hilti::operator_::error::Ctor*) {}
    virtual void operator()(hilti::operator_::error::Equal*) {}
    virtual void operator()(hilti::operator_::error::Unequal*) {}
    virtual void operator()(hilti::operator_::error::Description*) {}
    virtual void operator()(hilti::operator_::exception::Ctor*) {}
    virtual void operator()(hilti::operator_::exception::Description*) {}
    virtual void operator()(hilti::operator_::generic::Pack*) {}
    virtual void operator()(hilti::operator_::generic::Unpack*) {}
    virtual void operator()(hilti::operator_::generic::Begin*) {}
    virtual void operator()(hilti::operator_::generic::End*) {}
    virtual void operator()(hilti::operator_::generic::New*) {}
    virtual void operator()(hilti::operator_::interval::Equal*) {}
    virtual void operator()(hilti::operator_::interval::Unequal*) {}
    virtual void operator()(hilti::operator_::interval::Sum*) {}
    virtual void operator()(hilti::operator_::interval::Difference*) {}
    virtual void operator()(hilti::operator_::interval::Greater*) {}
    virtual void operator()(hilti::operator_::interval::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::interval::Lower*) {}
    virtual void operator()(hilti::operator_::interval::LowerEqual*) {}
    virtual void operator()(hilti::operator_::interval::MultipleUnsignedInteger*) {}
    virtual void operator()(hilti::operator_::interval::MultipleReal*) {}
    virtual void operator()(hilti::operator_::interval::CtorSignedIntegerNs*) {}
    virtual void operator()(hilti::operator_::interval::CtorSignedIntegerSecs*) {}
    virtual void operator()(hilti::operator_::interval::CtorUnsignedIntegerNs*) {}
    virtual void operator()(hilti::operator_::interval::CtorUnsignedIntegerSecs*) {}
    virtual void operator()(hilti::operator_::interval::CtorRealSecs*) {}
    virtual void operator()(hilti::operator_::interval::Seconds*) {}
    virtual void operator()(hilti::operator_::interval::Nanoseconds*) {}
    virtual void operator()(hilti::operator_::list::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::list::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::list::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::list::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::list::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::list::Size*) {}
    virtual void operator()(hilti::operator_::list::Equal*) {}
    virtual void operator()(hilti::operator_::list::Unequal*) {}
    virtual void operator()(hilti::operator_::map::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::map::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::map::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::map::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::map::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::map::Size*) {}
    virtual void operator()(hilti::operator_::map::Equal*) {}
    virtual void operator()(hilti::operator_::map::Unequal*) {}
    virtual void operator()(hilti::operator_::map::In*) {}
    virtual void operator()(hilti::operator_::map::Delete*) {}
    virtual void operator()(hilti::operator_::map::IndexConst*) {}
    virtual void operator()(hilti::operator_::map::IndexNonConst*) {}
    virtual void operator()(hilti::operator_::map::IndexAssign*) {}
    virtual void operator()(hilti::operator_::map::Get*) {}
    virtual void operator()(hilti::operator_::map::GetOptional*) {}
    virtual void operator()(hilti::operator_::map::Clear*) {}
    virtual void operator()(hilti::operator_::network::Equal*) {}
    virtual void operator()(hilti::operator_::network::Unequal*) {}
    virtual void operator()(hilti::operator_::network::In*) {}
    virtual void operator()(hilti::operator_::network::Family*) {}
    virtual void operator()(hilti::operator_::network::Prefix*) {}
    virtual void operator()(hilti::operator_::network::Length*) {}
    virtual void operator()(hilti::operator_::optional::Deref*) {}
    virtual void operator()(hilti::operator_::port::Equal*) {}
    virtual void operator()(hilti::operator_::port::Unequal*) {}
    virtual void operator()(hilti::operator_::port::Ctor*) {}
    virtual void operator()(hilti::operator_::port::Protocol*) {}
    virtual void operator()(hilti::operator_::real::SignNeg*) {}
    virtual void operator()(hilti::operator_::real::Difference*) {}
    virtual void operator()(hilti::operator_::real::DifferenceAssign*) {}
    virtual void operator()(hilti::operator_::real::Division*) {}
    virtual void operator()(hilti::operator_::real::DivisionAssign*) {}
    virtual void operator()(hilti::operator_::real::Equal*) {}
    virtual void operator()(hilti::operator_::real::Greater*) {}
    virtual void operator()(hilti::operator_::real::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::real::Lower*) {}
    virtual void operator()(hilti::operator_::real::LowerEqual*) {}
    virtual void operator()(hilti::operator_::real::Modulo*) {}
    virtual void operator()(hilti::operator_::real::Multiple*) {}
    virtual void operator()(hilti::operator_::real::MultipleAssign*) {}
    virtual void operator()(hilti::operator_::real::Power*) {}
    virtual void operator()(hilti::operator_::real::Sum*) {}
    virtual void operator()(hilti::operator_::real::SumAssign*) {}
    virtual void operator()(hilti::operator_::real::Unequal*) {}
    virtual void operator()(hilti::operator_::real::CastToUnsignedInteger*) {}
    virtual void operator()(hilti::operator_::real::CastToSignedInteger*) {}
    virtual void operator()(hilti::operator_::real::CastToTime*) {}
    virtual void operator()(hilti::operator_::real::CastToInterval*) {}
    virtual void operator()(hilti::operator_::strong_reference::Deref*) {}
    virtual void operator()(hilti::operator_::strong_reference::Equal*) {}
    virtual void operator()(hilti::operator_::strong_reference::Unequal*) {}
    virtual void operator()(hilti::operator_::weak_reference::Deref*) {}
    virtual void operator()(hilti::operator_::weak_reference::Equal*) {}
    virtual void operator()(hilti::operator_::weak_reference::Unequal*) {}
    virtual void operator()(hilti::operator_::value_reference::Deref*) {}
    virtual void operator()(hilti::operator_::value_reference::Equal*) {}
    virtual void operator()(hilti::operator_::value_reference::Unequal*) {}
    virtual void operator()(hilti::operator_::regexp::Match*) {}
    virtual void operator()(hilti::operator_::regexp::Find*) {}
    virtual void operator()(hilti::operator_::regexp::MatchGroups*) {}
    virtual void operator()(hilti::operator_::regexp::TokenMatcher*) {}
    virtual void operator()(hilti::operator_::regexp_match_state::AdvanceBytes*) {}
    virtual void operator()(hilti::operator_::regexp_match_state::AdvanceView*) {}
    virtual void operator()(hilti::operator_::result::Deref*) {}
    virtual void operator()(hilti::operator_::result::Error*) {}
    virtual void operator()(hilti::operator_::set::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::set::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::set::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::set::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::set::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::set::Size*) {}
    virtual void operator()(hilti::operator_::set::Equal*) {}
    virtual void operator()(hilti::operator_::set::Unequal*) {}
    virtual void operator()(hilti::operator_::set::In*) {}
    virtual void operator()(hilti::operator_::set::Add*) {}
    virtual void operator()(hilti::operator_::set::Delete*) {}
    virtual void operator()(hilti::operator_::set::Clear*) {}
    virtual void operator()(hilti::operator_::signed_integer::DecrPostfix*) {}
    virtual void operator()(hilti::operator_::signed_integer::DecrPrefix*) {}
    virtual void operator()(hilti::operator_::signed_integer::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::signed_integer::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::signed_integer::SignNeg*) {}
    virtual void operator()(hilti::operator_::signed_integer::Difference*) {}
    virtual void operator()(hilti::operator_::signed_integer::DifferenceAssign*) {}
    virtual void operator()(hilti::operator_::signed_integer::Division*) {}
    virtual void operator()(hilti::operator_::signed_integer::DivisionAssign*) {}
    virtual void operator()(hilti::operator_::signed_integer::Equal*) {}
    virtual void operator()(hilti::operator_::signed_integer::Greater*) {}
    virtual void operator()(hilti::operator_::signed_integer::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::signed_integer::Lower*) {}
    virtual void operator()(hilti::operator_::signed_integer::LowerEqual*) {}
    virtual void operator()(hilti::operator_::signed_integer::Modulo*) {}
    virtual void operator()(hilti::operator_::signed_integer::Multiple*) {}
    virtual void operator()(hilti::operator_::signed_integer::MultipleAssign*) {}
    virtual void operator()(hilti::operator_::signed_integer::Power*) {}
    virtual void operator()(hilti::operator_::signed_integer::Sum*) {}
    virtual void operator()(hilti::operator_::signed_integer::SumAssign*) {}
    virtual void operator()(hilti::operator_::signed_integer::Unequal*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToSigned*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToUnsigned*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToReal*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToEnum*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToInterval*) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToBool*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned8*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned16*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned32*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned64*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned8*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned16*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned32*) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned64*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::stream::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::stream::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Lower*) {}
    virtual void operator()(hilti::operator_::stream::iterator::LowerEqual*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Greater*) {}
    virtual void operator()(hilti::operator_::stream::iterator::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Difference*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Sum*) {}
    virtual void operator()(hilti::operator_::stream::iterator::SumAssign*) {}
    virtual void operator()(hilti::operator_::stream::iterator::Offset*) {}
    virtual void operator()(hilti::operator_::stream::iterator::IsFrozen*) {}
    virtual void operator()(hilti::operator_::stream::view::Size*) {}
    virtual void operator()(hilti::operator_::stream::view::InBytes*) {}
    virtual void operator()(hilti::operator_::stream::view::InView*) {}
    virtual void operator()(hilti::operator_::stream::view::EqualView*) {}
    virtual void operator()(hilti::operator_::stream::view::EqualBytes*) {}
    virtual void operator()(hilti::operator_::stream::view::UnequalView*) {}
    virtual void operator()(hilti::operator_::stream::view::UnequalBytes*) {}
    virtual void operator()(hilti::operator_::stream::view::Offset*) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceBy*) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceToNextData*) {}
    virtual void operator()(hilti::operator_::stream::view::Limit*) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceTo*) {}
    virtual void operator()(hilti::operator_::stream::view::Find*) {}
    virtual void operator()(hilti::operator_::stream::view::At*) {}
    virtual void operator()(hilti::operator_::stream::view::StartsWith*) {}
    virtual void operator()(hilti::operator_::stream::view::SubIterators*) {}
    virtual void operator()(hilti::operator_::stream::view::SubIterator*) {}
    virtual void operator()(hilti::operator_::stream::view::SubOffsets*) {}
    virtual void operator()(hilti::operator_::stream::Ctor*) {}
    virtual void operator()(hilti::operator_::stream::Size*) {}
    virtual void operator()(hilti::operator_::stream::Unequal*) {}
    virtual void operator()(hilti::operator_::stream::SumAssignView*) {}
    virtual void operator()(hilti::operator_::stream::SumAssignBytes*) {}
    virtual void operator()(hilti::operator_::stream::Freeze*) {}
    virtual void operator()(hilti::operator_::stream::Unfreeze*) {}
    virtual void operator()(hilti::operator_::stream::IsFrozen*) {}
    virtual void operator()(hilti::operator_::stream::At*) {}
    virtual void operator()(hilti::operator_::stream::Trim*) {}
    virtual void operator()(hilti::operator_::stream::Statistics*) {}
    virtual void operator()(hilti::operator_::string::Equal*) {}
    virtual void operator()(hilti::operator_::string::Unequal*) {}
    virtual void operator()(hilti::operator_::string::Size*) {}
    virtual void operator()(hilti::operator_::string::Sum*) {}
    virtual void operator()(hilti::operator_::string::SumAssign*) {}
    virtual void operator()(hilti::operator_::string::Modulo*) {}
    virtual void operator()(hilti::operator_::string::Encode*) {}
    virtual void operator()(hilti::operator_::string::Split*) {}
    virtual void operator()(hilti::operator_::string::Split1*) {}
    virtual void operator()(hilti::operator_::string::StartsWith*) {}
    virtual void operator()(hilti::operator_::string::EndsWith*) {}
    virtual void operator()(hilti::operator_::string::LowerCase*) {}
    virtual void operator()(hilti::operator_::string::UpperCase*) {}
    virtual void operator()(hilti::operator_::struct_::Unset*) {}
    virtual void operator()(hilti::operator_::struct_::MemberNonConst*) {}
    virtual void operator()(hilti::operator_::struct_::MemberConst*) {}
    virtual void operator()(hilti::operator_::struct_::TryMember*) {}
    virtual void operator()(hilti::operator_::struct_::HasMember*) {}
    virtual void operator()(hilti::operator_::time::Equal*) {}
    virtual void operator()(hilti::operator_::time::Unequal*) {}
    virtual void operator()(hilti::operator_::time::SumInterval*) {}
    virtual void operator()(hilti::operator_::time::DifferenceTime*) {}
    virtual void operator()(hilti::operator_::time::DifferenceInterval*) {}
    virtual void operator()(hilti::operator_::time::Greater*) {}
    virtual void operator()(hilti::operator_::time::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::time::Lower*) {}
    virtual void operator()(hilti::operator_::time::LowerEqual*) {}
    virtual void operator()(hilti::operator_::time::CtorSignedIntegerNs*) {}
    virtual void operator()(hilti::operator_::time::CtorSignedIntegerSecs*) {}
    virtual void operator()(hilti::operator_::time::CtorUnsignedIntegerNs*) {}
    virtual void operator()(hilti::operator_::time::CtorUnsignedIntegerSecs*) {}
    virtual void operator()(hilti::operator_::time::CtorRealSecs*) {}
    virtual void operator()(hilti::operator_::time::Seconds*) {}
    virtual void operator()(hilti::operator_::time::Nanoseconds*) {}
    virtual void operator()(hilti::operator_::tuple::Equal*) {}
    virtual void operator()(hilti::operator_::tuple::Unequal*) {}
    virtual void operator()(hilti::operator_::tuple::Index*) {}
    virtual void operator()(hilti::operator_::tuple::Member*) {}
    virtual void operator()(hilti::operator_::tuple::CustomAssign*) {}
    virtual void operator()(hilti::operator_::union_::Equal*) {}
    virtual void operator()(hilti::operator_::union_::Unequal*) {}
    virtual void operator()(hilti::operator_::union_::MemberConst*) {}
    virtual void operator()(hilti::operator_::union_::MemberNonConst*) {}
    virtual void operator()(hilti::operator_::union_::HasMember*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DecrPostfix*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DecrPrefix*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::SignNeg*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Difference*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DifferenceAssign*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Division*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DivisionAssign*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Equal*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Greater*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::GreaterEqual*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Lower*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::LowerEqual*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Modulo*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Multiple*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::MultipleAssign*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Power*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Sum*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::SumAssign*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Unequal*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Negate*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitAnd*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitOr*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitXor*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::ShiftLeft*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::ShiftRight*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToUnsigned*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToSigned*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToReal*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToEnum*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToInterval*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToTime*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToBool*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned8*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned16*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned32*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned64*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned8*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned16*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned32*) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned64*) {}
    virtual void operator()(hilti::operator_::vector::iterator::Deref*) {}
    virtual void operator()(hilti::operator_::vector::iterator::IncrPostfix*) {}
    virtual void operator()(hilti::operator_::vector::iterator::IncrPrefix*) {}
    virtual void operator()(hilti::operator_::vector::iterator::Equal*) {}
    virtual void operator()(hilti::operator_::vector::iterator::Unequal*) {}
    virtual void operator()(hilti::operator_::vector::Size*) {}
    virtual void operator()(hilti::operator_::vector::Equal*) {}
    virtual void operator()(hilti::operator_::vector::Unequal*) {}
    virtual void operator()(hilti::operator_::vector::IndexConst*) {}
    virtual void operator()(hilti::operator_::vector::IndexNonConst*) {}
    virtual void operator()(hilti::operator_::vector::Sum*) {}
    virtual void operator()(hilti::operator_::vector::SumAssign*) {}
    virtual void operator()(hilti::operator_::vector::Assign*) {}
    virtual void operator()(hilti::operator_::vector::PushBack*) {}
    virtual void operator()(hilti::operator_::vector::PopBack*) {}
    virtual void operator()(hilti::operator_::vector::Front*) {}
    virtual void operator()(hilti::operator_::vector::Back*) {}
    virtual void operator()(hilti::operator_::vector::Reserve*) {}
    virtual void operator()(hilti::operator_::vector::Resize*) {}
    virtual void operator()(hilti::operator_::vector::At*) {}
    virtual void operator()(hilti::operator_::vector::SubRange*) {}
    virtual void operator()(hilti::operator_::vector::SubEnd*) {}
    virtual void operator()(hilti::statement::Assert*) {}
    virtual void operator()(hilti::statement::Block*) {}
    virtual void operator()(hilti::statement::Break*) {}
    virtual void operator()(hilti::statement::Comment*) {}
    virtual void operator()(hilti::statement::Continue*) {}
    virtual void operator()(hilti::statement::Declaration*) {}
    virtual void operator()(hilti::statement::Expression*) {}
    virtual void operator()(hilti::statement::For*) {}
    virtual void operator()(hilti::statement::If*) {}
    virtual void operator()(hilti::statement::Return*) {}
    virtual void operator()(hilti::statement::SetLocation*) {}
    virtual void operator()(hilti::statement::Switch*) {}
    virtual void operator()(hilti::statement::Throw*) {}
    virtual void operator()(hilti::statement::Try*) {}
    virtual void operator()(hilti::statement::While*) {}
    virtual void operator()(hilti::statement::Yield*) {}
    virtual void operator()(hilti::statement::switch_::Case*) {}
    virtual void operator()(hilti::statement::try_::Catch*) {}
    virtual void operator()(hilti::type::Address*) {}
    virtual void operator()(hilti::type::Any*) {}
    virtual void operator()(hilti::type::Auto*) {}
    virtual void operator()(hilti::type::bitfield::BitRange*) {}
    virtual void operator()(hilti::type::Bitfield*) {}
    virtual void operator()(hilti::type::Bool*) {}
    virtual void operator()(hilti::type::Bytes*) {}
    virtual void operator()(hilti::type::DocOnly*) {}
    virtual void operator()(hilti::type::Enum*) {}
    virtual void operator()(hilti::type::Error*) {}
    virtual void operator()(hilti::type::Exception*) {}
    virtual void operator()(hilti::type::Function*) {}
    virtual void operator()(hilti::type::Interval*) {}
    virtual void operator()(hilti::type::Library*) {}
    virtual void operator()(hilti::type::List*) {}
    virtual void operator()(hilti::type::Map*) {}
    virtual void operator()(hilti::type::Member*) {}
    virtual void operator()(hilti::type::Name*) {}
    virtual void operator()(hilti::type::Network*) {}
    virtual void operator()(hilti::type::Null*) {}
    virtual void operator()(hilti::type::OperandList*) {}
    virtual void operator()(hilti::type::operand_list::Operand*) {}
    virtual void operator()(hilti::type::Optional*) {}
    virtual void operator()(hilti::type::Port*) {}
    virtual void operator()(hilti::type::Real*) {}
    virtual void operator()(hilti::type::RegExp*) {}
    virtual void operator()(hilti::type::Result*) {}
    virtual void operator()(hilti::type::Set*) {}
    virtual void operator()(hilti::type::SignedInteger*) {}
    virtual void operator()(hilti::type::Stream*) {}
    virtual void operator()(hilti::type::String*) {}
    virtual void operator()(hilti::type::StrongReference*) {}
    virtual void operator()(hilti::type::Struct*) {}
    virtual void operator()(hilti::type::Time*) {}
    virtual void operator()(hilti::type::Tuple*) {}
    virtual void operator()(hilti::type::Type_*) {}
    virtual void operator()(hilti::type::Union*) {}
    virtual void operator()(hilti::type::Unknown*) {}
    virtual void operator()(hilti::type::UnsignedInteger*) {}
    virtual void operator()(hilti::type::ValueReference*) {}
    virtual void operator()(hilti::type::Vector*) {}
    virtual void operator()(hilti::type::Void*) {}
    virtual void operator()(hilti::type::WeakReference*) {}
    virtual void operator()(hilti::type::bytes::Iterator*) {}
    virtual void operator()(hilti::type::enum_::Label*) {}
    virtual void operator()(hilti::type::function::Parameter*) {}
    virtual void operator()(hilti::type::list::Iterator*) {}
    virtual void operator()(hilti::type::map::Iterator*) {}
    virtual void operator()(hilti::type::set::Iterator*) {}
    virtual void operator()(hilti::type::stream::Iterator*) {}
    virtual void operator()(hilti::type::stream::View*) {}
    virtual void operator()(hilti::type::tuple::Element*) {}
    virtual void operator()(hilti::type::vector::Iterator*) {}

private:
    const Tag _tag = HILTI;
};

} // namespace hilti::visitor
