#ifndef __SPL_SEMA_H__ #define __SPL_SEMA_H__ #include "spl_ast.h" #include "spl_type.h" 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 usize spl_scope_id_t; /* 0 is error */ 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); typedef VEC(const char *) spl_symbol_path_t; bool spl_scope_find(spl_scope_t *scop, const char *symbol_name, spl_symbol_t *out); typedef struct { spl_ast_t *ast; spl_type_t *type; spl_scope_t *scope; spl_symbol_t root; int error_count; spl_scope_id_t store_scope; spl_type_id_t current_fn_ret_tid; // TODO } spl_sema_t; void spl_sema_init(spl_sema_t *sema, spl_ast_t *ast, spl_type_t *type, spl_scope_t *scope); void spl_sema_drop(spl_sema_t *sema); void spl_sema_run(spl_sema_t *sema); void spl_sema_dump(spl_sema_t *sema); #endif /* __SPL_SEMA_H__ */