// 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) {}

    /**
     * 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::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::BuiltInFunction*) {}
    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* n) {}
    virtual void operator()(hilti::operator_::address::Unequal* n) {}
    virtual void operator()(hilti::operator_::address::Family* n) {}
    virtual void operator()(hilti::operator_::bitfield::Member* n) {}
    virtual void operator()(hilti::operator_::bitfield::HasMember* n) {}
    virtual void operator()(hilti::operator_::bool_::Equal* n) {}
    virtual void operator()(hilti::operator_::bool_::Unequal* n) {}
    virtual void operator()(hilti::operator_::bool_::BitAnd* n) {}
    virtual void operator()(hilti::operator_::bool_::BitOr* n) {}
    virtual void operator()(hilti::operator_::bool_::BitXor* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Lower* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Greater* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Difference* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::Sum* n) {}
    virtual void operator()(hilti::operator_::bytes::iterator::SumAssign* n) {}
    virtual void operator()(hilti::operator_::bytes::Size* n) {}
    virtual void operator()(hilti::operator_::bytes::Equal* n) {}
    virtual void operator()(hilti::operator_::bytes::Unequal* n) {}
    virtual void operator()(hilti::operator_::bytes::Greater* n) {}
    virtual void operator()(hilti::operator_::bytes::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::bytes::In* n) {}
    virtual void operator()(hilti::operator_::bytes::Lower* n) {}
    virtual void operator()(hilti::operator_::bytes::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::bytes::Sum* n) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignBytes* n) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignStreamView* n) {}
    virtual void operator()(hilti::operator_::bytes::SumAssignUInt8* n) {}
    virtual void operator()(hilti::operator_::bytes::Find* n) {}
    virtual void operator()(hilti::operator_::bytes::LowerCase* n) {}
    virtual void operator()(hilti::operator_::bytes::UpperCase* n) {}
    virtual void operator()(hilti::operator_::bytes::At* n) {}
    virtual void operator()(hilti::operator_::bytes::Split* n) {}
    virtual void operator()(hilti::operator_::bytes::Split1* n) {}
    virtual void operator()(hilti::operator_::bytes::StartsWith* n) {}
    virtual void operator()(hilti::operator_::bytes::EndsWith*) {}
    virtual void operator()(hilti::operator_::bytes::Strip* n) {}
    virtual void operator()(hilti::operator_::bytes::SubIterators* n) {}
    virtual void operator()(hilti::operator_::bytes::SubIterator* n) {}
    virtual void operator()(hilti::operator_::bytes::SubOffsets* n) {}
    virtual void operator()(hilti::operator_::bytes::Join* n) {}
    virtual void operator()(hilti::operator_::bytes::ToIntAscii* n) {}
    virtual void operator()(hilti::operator_::bytes::ToUIntAscii* n) {}
    virtual void operator()(hilti::operator_::bytes::ToIntBinary* n) {}
    virtual void operator()(hilti::operator_::bytes::ToUIntBinary* n) {}
    virtual void operator()(hilti::operator_::bytes::ToRealAscii* n) {}
    virtual void operator()(hilti::operator_::bytes::ToTimeAscii* n) {}
    virtual void operator()(hilti::operator_::bytes::ToTimeBinary* n) {}
    virtual void operator()(hilti::operator_::bytes::Decode* n) {}
    virtual void operator()(hilti::operator_::bytes::Match* n) {}
    virtual void operator()(hilti::operator_::enum_::Equal* n) {}
    virtual void operator()(hilti::operator_::enum_::Unequal* n) {}
    virtual void operator()(hilti::operator_::enum_::CastToSignedInteger* n) {}
    virtual void operator()(hilti::operator_::enum_::CastToUnsignedInteger* n) {}
    virtual void operator()(hilti::operator_::enum_::CtorSigned* n) {}
    virtual void operator()(hilti::operator_::enum_::CtorUnsigned* n) {}
    virtual void operator()(hilti::operator_::enum_::HasLabel* n) {}
    virtual void operator()(hilti::operator_::error::Ctor* n) {}
    virtual void operator()(hilti::operator_::error::Equal* n) {}
    virtual void operator()(hilti::operator_::error::Unequal* n) {}
    virtual void operator()(hilti::operator_::error::Description* n) {}
    virtual void operator()(hilti::operator_::exception::Ctor* n) {}
    virtual void operator()(hilti::operator_::exception::Description* n) {}
    virtual void operator()(hilti::operator_::generic::Pack* n) {}
    virtual void operator()(hilti::operator_::generic::Unpack* n) {}
    virtual void operator()(hilti::operator_::generic::Begin* n) {}
    virtual void operator()(hilti::operator_::generic::End* n) {}
    virtual void operator()(hilti::operator_::generic::New* n) {}
    virtual void operator()(hilti::operator_::interval::Equal* n) {}
    virtual void operator()(hilti::operator_::interval::Unequal* n) {}
    virtual void operator()(hilti::operator_::interval::Sum* n) {}
    virtual void operator()(hilti::operator_::interval::Difference* n) {}
    virtual void operator()(hilti::operator_::interval::Greater* n) {}
    virtual void operator()(hilti::operator_::interval::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::interval::Lower* n) {}
    virtual void operator()(hilti::operator_::interval::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::interval::MultipleUnsignedInteger* n) {}
    virtual void operator()(hilti::operator_::interval::MultipleReal* n) {}
    virtual void operator()(hilti::operator_::interval::CtorSignedIntegerNs* n) {}
    virtual void operator()(hilti::operator_::interval::CtorSignedIntegerSecs* n) {}
    virtual void operator()(hilti::operator_::interval::CtorUnsignedIntegerNs* n) {}
    virtual void operator()(hilti::operator_::interval::CtorUnsignedIntegerSecs* n) {}
    virtual void operator()(hilti::operator_::interval::CtorRealSecs* n) {}
    virtual void operator()(hilti::operator_::interval::Seconds* n) {}
    virtual void operator()(hilti::operator_::interval::Nanoseconds* n) {}
    virtual void operator()(hilti::operator_::list::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::list::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::list::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::list::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::list::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::list::Size* n) {}
    virtual void operator()(hilti::operator_::list::Equal* n) {}
    virtual void operator()(hilti::operator_::list::Unequal* n) {}
    virtual void operator()(hilti::operator_::map::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::map::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::map::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::map::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::map::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::map::Size* n) {}
    virtual void operator()(hilti::operator_::map::Equal* n) {}
    virtual void operator()(hilti::operator_::map::Unequal* n) {}
    virtual void operator()(hilti::operator_::map::In* n) {}
    virtual void operator()(hilti::operator_::map::Delete* n) {}
    virtual void operator()(hilti::operator_::map::IndexConst* n) {}
    virtual void operator()(hilti::operator_::map::IndexNonConst* n) {}
    virtual void operator()(hilti::operator_::map::IndexAssign* n) {}
    virtual void operator()(hilti::operator_::map::Get* n) {}
    virtual void operator()(hilti::operator_::map::GetOptional* n) {}
    virtual void operator()(hilti::operator_::map::Clear* n) {}
    virtual void operator()(hilti::operator_::network::Equal* n) {}
    virtual void operator()(hilti::operator_::network::Unequal* n) {}
    virtual void operator()(hilti::operator_::network::In* n) {}
    virtual void operator()(hilti::operator_::network::Family* n) {}
    virtual void operator()(hilti::operator_::network::Prefix* n) {}
    virtual void operator()(hilti::operator_::network::Length* n) {}
    virtual void operator()(hilti::operator_::optional::Deref* n) {}
    virtual void operator()(hilti::operator_::port::Equal* n) {}
    virtual void operator()(hilti::operator_::port::Unequal* n) {}
    virtual void operator()(hilti::operator_::port::Ctor* n) {}
    virtual void operator()(hilti::operator_::port::Protocol* n) {}
    virtual void operator()(hilti::operator_::real::SignNeg* n) {}
    virtual void operator()(hilti::operator_::real::Difference* n) {}
    virtual void operator()(hilti::operator_::real::DifferenceAssign* n) {}
    virtual void operator()(hilti::operator_::real::Division* n) {}
    virtual void operator()(hilti::operator_::real::DivisionAssign* n) {}
    virtual void operator()(hilti::operator_::real::Equal* n) {}
    virtual void operator()(hilti::operator_::real::Greater* n) {}
    virtual void operator()(hilti::operator_::real::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::real::Lower* n) {}
    virtual void operator()(hilti::operator_::real::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::real::Modulo* n) {}
    virtual void operator()(hilti::operator_::real::Multiple* n) {}
    virtual void operator()(hilti::operator_::real::MultipleAssign* n) {}
    virtual void operator()(hilti::operator_::real::Power* n) {}
    virtual void operator()(hilti::operator_::real::Sum* n) {}
    virtual void operator()(hilti::operator_::real::SumAssign* n) {}
    virtual void operator()(hilti::operator_::real::Unequal* n) {}
    virtual void operator()(hilti::operator_::real::CastToUnsignedInteger* n) {}
    virtual void operator()(hilti::operator_::real::CastToSignedInteger* n) {}
    virtual void operator()(hilti::operator_::real::CastToTime* n) {}
    virtual void operator()(hilti::operator_::real::CastToInterval* n) {}
    virtual void operator()(hilti::operator_::strong_reference::Deref* n) {}
    virtual void operator()(hilti::operator_::strong_reference::Equal* n) {}
    virtual void operator()(hilti::operator_::strong_reference::Unequal* n) {}
    virtual void operator()(hilti::operator_::weak_reference::Deref* n) {}
    virtual void operator()(hilti::operator_::weak_reference::Equal* n) {}
    virtual void operator()(hilti::operator_::weak_reference::Unequal* n) {}
    virtual void operator()(hilti::operator_::value_reference::Deref* n) {}
    virtual void operator()(hilti::operator_::value_reference::Equal* n) {}
    virtual void operator()(hilti::operator_::value_reference::Unequal* n) {}
    virtual void operator()(hilti::operator_::regexp::Match* n) {}
    virtual void operator()(hilti::operator_::regexp::Find* n) {}
    virtual void operator()(hilti::operator_::regexp::MatchGroups* n) {}
    virtual void operator()(hilti::operator_::regexp::TokenMatcher* n) {}
    virtual void operator()(hilti::operator_::regexp_match_state::AdvanceBytes* n) {}
    virtual void operator()(hilti::operator_::regexp_match_state::AdvanceView* n) {}
    virtual void operator()(hilti::operator_::result::Deref* n) {}
    virtual void operator()(hilti::operator_::result::Error* n) {}
    virtual void operator()(hilti::operator_::set::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::set::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::set::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::set::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::set::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::set::Size* n) {}
    virtual void operator()(hilti::operator_::set::Equal* n) {}
    virtual void operator()(hilti::operator_::set::Unequal* n) {}
    virtual void operator()(hilti::operator_::set::In* n) {}
    virtual void operator()(hilti::operator_::set::Add* n) {}
    virtual void operator()(hilti::operator_::set::Delete* n) {}
    virtual void operator()(hilti::operator_::set::Clear* n) {}
    virtual void operator()(hilti::operator_::signed_integer::DecrPostfix* n) {}
    virtual void operator()(hilti::operator_::signed_integer::DecrPrefix* n) {}
    virtual void operator()(hilti::operator_::signed_integer::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::signed_integer::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::signed_integer::SignNeg* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Difference* n) {}
    virtual void operator()(hilti::operator_::signed_integer::DifferenceAssign* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Division* n) {}
    virtual void operator()(hilti::operator_::signed_integer::DivisionAssign* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Equal* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Greater* n) {}
    virtual void operator()(hilti::operator_::signed_integer::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Lower* n) {}
    virtual void operator()(hilti::operator_::signed_integer::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Modulo* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Multiple* n) {}
    virtual void operator()(hilti::operator_::signed_integer::MultipleAssign* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Power* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Sum* n) {}
    virtual void operator()(hilti::operator_::signed_integer::SumAssign* n) {}
    virtual void operator()(hilti::operator_::signed_integer::Unequal* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToSigned* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToUnsigned* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToReal* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToEnum* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToInterval* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CastToBool* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned8* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned16* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned32* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorSigned64* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned8* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned16* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned32* n) {}
    virtual void operator()(hilti::operator_::signed_integer::CtorUnsigned64* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Lower* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Greater* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Difference* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Sum* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::SumAssign* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::Offset* n) {}
    virtual void operator()(hilti::operator_::stream::iterator::IsFrozen* n) {}
    virtual void operator()(hilti::operator_::stream::view::Size* n) {}
    virtual void operator()(hilti::operator_::stream::view::InBytes* n) {}
    virtual void operator()(hilti::operator_::stream::view::InView* n) {}
    virtual void operator()(hilti::operator_::stream::view::EqualView* n) {}
    virtual void operator()(hilti::operator_::stream::view::EqualBytes* n) {}
    virtual void operator()(hilti::operator_::stream::view::UnequalView* n) {}
    virtual void operator()(hilti::operator_::stream::view::UnequalBytes* n) {}
    virtual void operator()(hilti::operator_::stream::view::Offset* n) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceBy* n) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceToNextData* n) {}
    virtual void operator()(hilti::operator_::stream::view::Limit* n) {}
    virtual void operator()(hilti::operator_::stream::view::AdvanceTo* n) {}
    virtual void operator()(hilti::operator_::stream::view::Find* n) {}
    virtual void operator()(hilti::operator_::stream::view::At* n) {}
    virtual void operator()(hilti::operator_::stream::view::StartsWith* n) {}
    virtual void operator()(hilti::operator_::stream::view::SubIterators* n) {}
    virtual void operator()(hilti::operator_::stream::view::SubIterator* n) {}
    virtual void operator()(hilti::operator_::stream::view::SubOffsets* n) {}
    virtual void operator()(hilti::operator_::stream::Ctor* n) {}
    virtual void operator()(hilti::operator_::stream::Size* n) {}
    virtual void operator()(hilti::operator_::stream::Unequal* n) {}
    virtual void operator()(hilti::operator_::stream::SumAssignView* n) {}
    virtual void operator()(hilti::operator_::stream::SumAssignBytes* n) {}
    virtual void operator()(hilti::operator_::stream::Freeze* n) {}
    virtual void operator()(hilti::operator_::stream::Unfreeze* n) {}
    virtual void operator()(hilti::operator_::stream::IsFrozen* n) {}
    virtual void operator()(hilti::operator_::stream::At* n) {}
    virtual void operator()(hilti::operator_::stream::Trim* n) {}
    virtual void operator()(hilti::operator_::stream::Statistics* n) {}
    virtual void operator()(hilti::operator_::string::Equal* n) {}
    virtual void operator()(hilti::operator_::string::Unequal* n) {}
    virtual void operator()(hilti::operator_::string::Size* n) {}
    virtual void operator()(hilti::operator_::string::Sum* n) {}
    virtual void operator()(hilti::operator_::string::SumAssign* n) {}
    virtual void operator()(hilti::operator_::string::Modulo* n) {}
    virtual void operator()(hilti::operator_::string::Encode* n) {}
    virtual void operator()(hilti::operator_::string::Split* n) {}
    virtual void operator()(hilti::operator_::string::Split1* n) {}
    virtual void operator()(hilti::operator_::string::StartsWith* n) {}
    virtual void operator()(hilti::operator_::string::EndsWith* n) {}
    virtual void operator()(hilti::operator_::string::LowerCase* n) {}
    virtual void operator()(hilti::operator_::string::UpperCase* n) {}
    virtual void operator()(hilti::operator_::struct_::Unset* n) {}
    virtual void operator()(hilti::operator_::struct_::MemberNonConst* n) {}
    virtual void operator()(hilti::operator_::struct_::MemberConst* n) {}
    virtual void operator()(hilti::operator_::struct_::TryMember* n) {}
    virtual void operator()(hilti::operator_::struct_::HasMember* n) {}
    virtual void operator()(hilti::operator_::time::Equal* n) {}
    virtual void operator()(hilti::operator_::time::Unequal* n) {}
    virtual void operator()(hilti::operator_::time::SumInterval* n) {}
    virtual void operator()(hilti::operator_::time::DifferenceTime* n) {}
    virtual void operator()(hilti::operator_::time::DifferenceInterval* n) {}
    virtual void operator()(hilti::operator_::time::Greater* n) {}
    virtual void operator()(hilti::operator_::time::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::time::Lower* n) {}
    virtual void operator()(hilti::operator_::time::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::time::CtorSignedIntegerNs* n) {}
    virtual void operator()(hilti::operator_::time::CtorSignedIntegerSecs* n) {}
    virtual void operator()(hilti::operator_::time::CtorUnsignedIntegerNs* n) {}
    virtual void operator()(hilti::operator_::time::CtorUnsignedIntegerSecs* n) {}
    virtual void operator()(hilti::operator_::time::CtorRealSecs* n) {}
    virtual void operator()(hilti::operator_::time::Seconds* n) {}
    virtual void operator()(hilti::operator_::time::Nanoseconds* n) {}
    virtual void operator()(hilti::operator_::tuple::Equal* n) {}
    virtual void operator()(hilti::operator_::tuple::Unequal* n) {}
    virtual void operator()(hilti::operator_::tuple::Index* n) {}
    virtual void operator()(hilti::operator_::tuple::Member* n) {}
    virtual void operator()(hilti::operator_::tuple::CustomAssign* n) {}
    virtual void operator()(hilti::operator_::union_::Equal* n) {}
    virtual void operator()(hilti::operator_::union_::Unequal* n) {}
    virtual void operator()(hilti::operator_::union_::MemberConst* n) {}
    virtual void operator()(hilti::operator_::union_::MemberNonConst* n) {}
    virtual void operator()(hilti::operator_::union_::HasMember* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DecrPostfix* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DecrPrefix* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::SignNeg* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Difference* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DifferenceAssign* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Division* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::DivisionAssign* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Equal* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Greater* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::GreaterEqual* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Lower* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::LowerEqual* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Modulo* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Multiple* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::MultipleAssign* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Power* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Sum* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::SumAssign* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Unequal* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::Negate* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitAnd* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitOr* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::BitXor* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::ShiftLeft* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::ShiftRight* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToUnsigned* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToSigned* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToReal* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToEnum* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToInterval* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToTime* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CastToBool* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned8* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned16* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned32* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorSigned64* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned8* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned16* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned32* n) {}
    virtual void operator()(hilti::operator_::unsigned_integer::CtorUnsigned64* n) {}
    virtual void operator()(hilti::operator_::vector::iterator::Deref* n) {}
    virtual void operator()(hilti::operator_::vector::iterator::IncrPostfix* n) {}
    virtual void operator()(hilti::operator_::vector::iterator::IncrPrefix* n) {}
    virtual void operator()(hilti::operator_::vector::iterator::Equal* n) {}
    virtual void operator()(hilti::operator_::vector::iterator::Unequal* n) {}
    virtual void operator()(hilti::operator_::vector::Size* n) {}
    virtual void operator()(hilti::operator_::vector::Equal* n) {}
    virtual void operator()(hilti::operator_::vector::Unequal* n) {}
    virtual void operator()(hilti::operator_::vector::IndexConst* n) {}
    virtual void operator()(hilti::operator_::vector::IndexNonConst* n) {}
    virtual void operator()(hilti::operator_::vector::Sum* n) {}
    virtual void operator()(hilti::operator_::vector::SumAssign* n) {}
    virtual void operator()(hilti::operator_::vector::Assign* n) {}
    virtual void operator()(hilti::operator_::vector::PushBack* n) {}
    virtual void operator()(hilti::operator_::vector::PopBack* n) {}
    virtual void operator()(hilti::operator_::vector::Front* n) {}
    virtual void operator()(hilti::operator_::vector::Back* n) {}
    virtual void operator()(hilti::operator_::vector::Reserve* n) {}
    virtual void operator()(hilti::operator_::vector::Resize* n) {}
    virtual void operator()(hilti::operator_::vector::At* n) {}
    virtual void operator()(hilti::operator_::vector::SubRange* n) {}
    virtual void operator()(hilti::operator_::vector::SubEnd* n) {}
    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* n) {}
    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
