#pragma once #include "interpreter_tree.hpp" #include #include #include #include #include #include // for clangd #include "utils.hpp" namespace interpreter { class Node; } // namespace interpreter namespace info::definition { struct TypeUsage { interpreter::tokens::TypeExpression* node; }; struct Parameter { std::string type; std::vector typeclass_nodes; }; struct AbstractType { enum { Basic, Abstract } modifier; Parameter type; }; struct AliasType { enum {Alias, Type, Let} modifier; std::vector parameters; TypeUsage value; interpreter::tokens::AliasDefinitionStatement* node = nullptr; }; struct AnyType { Parameter type; std::vector parameters; interpreter::tokens::AnyType* value; }; struct Type { std::variant type; }; struct Constructor { std::string name; size_t order; utils::IdType type_id; }; struct FunctionDeclaration { std::vector parameters; std::vector argument_types; interpreter::tokens::FunctionDeclaration* node = nullptr; }; struct FunctionDefinition { std::vector argument_names; interpreter::tokens::FunctionDefinitionStatement* node = nullptr; }; struct Function { size_t argument_count = 0; std::optional declaration; std::optional definition; }; struct Typeclass { std::vector parameters; std::vector requirements; }; struct Import { std::string module_name; std::vector symbols; // size = 0 => all symbols imported }; struct Namespace { enum Modifier { Const, Var }; std::unordered_map types; std::unordered_map functions; std::unordered_map constructors; std::unordered_map namespaces; std::unordered_map variable_namespaces; std::optional modifier; // modifier => variable namespace std::string type_name; }; } // namespace info::definition