#ifndef __SPL_SCOPE_H__ #define __SPL_SCOPE_H__ #include "spl_lang_type.h" typedef usize spl_scope_id_t; typedef enum { SPL_SYMBOL_KIND_ERROR, SPL_SYMBOL_KIND_VAR, SPL_SYMBOL_KIND_MEMBER, SPL_SYMBOL_KIND_FN, SPL_SYMBOL_KIND_TYPE, } spl_symbol_kind_t; typedef struct { const char *name; spl_symbol_kind_t kind; spl_def_id_t node; } spl_symbol_t; typedef VEC(const char *) spl_symbol_path_t; typedef struct { spl_scope_id_t parent; MAP(const char *, spl_symbol_t) symbols; } spl_scope_node_t; typedef VEC(spl_scope_node_t) spl_scope_node_vec_t; typedef struct { spl_scope_node_vec_t scopes; spl_scope_id_t root_scope; spl_scope_id_t current_scope; } spl_scope_t; void spl_scope_init(spl_scope_t *scope); void spl_scope_drop(spl_scope_t *scope); spl_scope_id_t spl_scope_alloc(spl_scope_t *scope); bool spl_scope_insert(spl_scope_t *scope, spl_scope_id_t id, spl_symbol_t symbol); bool spl_scope_find(spl_scope_t *scop, const char *symbol_name, spl_symbol_t *out); #endif /* __SPL_SCOPE_H__ */