#ifndef POLSERVER_MODULEDECLARATIONREGISTRAR_H #define POLSERVER_MODULEDECLARATIONREGISTRAR_H #include #include #include #include namespace Pol::Bscript::Compiler { class ModuleDescriptor; class ModuleFunctionDeclaration; class ModuleFunctionDescriptor; class ModuleDeclarationRegistrar { public: ModuleDeclarationRegistrar(); void register_module( const ModuleFunctionDeclaration& node ); void register_modulefunc( const ModuleFunctionDeclaration& ); std::vector take_module_descriptors(); void lookup_or_register_module_function( const ModuleFunctionDeclaration& node, unsigned& module_index, unsigned& function_index ); private: struct EmittedModule { explicit EmittedModule(unsigned module_index); ~EmittedModule(); const unsigned module_index; std::map function_name_to_index; std::vector function_declarations; }; std::map> registered_modules; std::vector module_names_in_order; }; } // namespace Pol::Bscript::Compiler #endif // POLSERVER_MODULEDECLARATIONREGISTRAR_H