#pragma once #include #include #include #include namespace Pol::Bscript::Compiler { class FlowControlLabel; class UserFunction; class FunctionReferenceDescriptor; class FunctionReferenceRegistrar { public: FunctionReferenceRegistrar(); std::vector take_descriptors( const std::map& class_declaration_indexes, const std::map& user_function_labels ); void lookup_or_register_reference( const UserFunction& node, FlowControlLabel& label, unsigned& index ); bool lookup_reference( const UserFunction& node, unsigned& index ); private: struct EmittedReference { explicit EmittedReference( unsigned index, const UserFunction&, FlowControlLabel& label ); ~EmittedReference(); const unsigned index; const UserFunction& user_function; const FlowControlLabel& label; }; void register_function_reference( const UserFunction&, FlowControlLabel& label ); std::map> registered_references; std::vector reference_names_in_order; }; } // namespace Pol::Bscript::Compiler