#pragma once #include #include #include // for clangd #include "symbols_info.hpp" #include "type_manager.hpp" #include "utils.hpp" namespace info { // TODO: partitions class GlobalInfo { friend class NamespaceVisitor; public: class NamespaceVisitor { friend GlobalInfo; NamespaceVisitor() = delete; public: void AddImport(ImportInfo&& import_info, const std::optional& name = std::nullopt); void AddEnterNamespace(const std::string& name, const std::optional& modifier = std::nullopt, const std::optional& variable = std::nullopt); void EnterNamespace(const std::string& name); void ExitNamespace(); void ToGlobalNamespace(); utils::IdType AddFunctionDeclaration(const std::string& name, FunctionDeclarationInfo&& function_declaration_info); utils::IdType AddFunctionDefinition(const std::string& name, FunctionDefinitionInfo&& function_definition_info); utils::IdType AddType(const std::string& type, TypeInfo&& type_info); utils::IdType AddTypeclass(const std::string& typeclass, TypeclassInfo&& typeclass_info); std::optional FindNamespace(const std::optional>& path); std::optional FindFunction(const std::optional>& path, const std::string& name); std::optional FindMethod(const std::optional>& path, const std::string& type, const std::string& name); std::optional FindType(const std::optional>& path, const std::string type); std::optional FindTypeclass(const std::optional>& path, const std::string typeclass); NamespaceVisitor CreateVisitor() { return global_info_.CreateVisitor(); } type::TypeManager* GetTypeManager() { return global_info_.GetTypeManager(); } GlobalInfo* GetGlobalInfo() { return &global_info_; } const std::vector& GetCurrentPath() { return current_path_; } private: NamespaceVisitor(GlobalInfo& global_info) : global_info_(global_info), namespace_stack_({&global_info.global_namespace_}) {} template std::optional FindSomething(const std::optional>& path, std::function(NamespaceInfo*)> search_func); std::optional FindNamespaceIn(NamespaceInfo* current_namespace, const std::vector& path); private: std::vector namespace_stack_; std::vector current_path_; GlobalInfo& global_info_; }; NamespaceVisitor CreateVisitor() { return NamespaceVisitor(*this); } type::TypeManager* GetTypeManager() { return &type_manager_; } // TODO: remember about vector realloc FunctionInfo* GetFunctionInfo(utils::IdType id) { return &functions_[id]; } // TODO: remember about vector realloc TypeInfo* GetTypeInfo(utils::IdType id) { return &types_[id]; } // TODO: remember about vector realloc TypeclassInfo* GetTypeclassInfo(utils::IdType id) { return &typeclasses_[id]; } private: std::vector functions_; std::vector types_; std::vector typeclasses_; type::TypeManager type_manager_; NamespaceInfo global_namespace_; std::vector imports_; std::unordered_map usages_; }; } // namespace info