#ifndef __SPL_SEMA_H__ #define __SPL_SEMA_H__ #include "spl_ast.h" #include "spl_attr.h" #include "spl_diag.h" #include "spl_mpa.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); bool spl_scope_find(spl_scope_t *scop, const char *symbol_name, spl_symbol_t *out); typedef VEC(const char *) spl_symbol_path_t; typedef struct { spl_ast_t *ast; spl_type_t *type; spl_scope_t *scope; spl_symbol_t root; spl_attr_t *attr; spl_lang_type_id_t current_aggregate_lang; spl_lang_type_id_t current_fn_ret_tid; spl_lang_type_id_t current_loop_break_tid; spl_symbol_path_t label_stack; spl_diag_t *diag; } spl_sema_t; void spl_sema_init(spl_sema_t *sema, spl_ast_t *ast, spl_type_t *type, spl_scope_t *scope, spl_attr_t *attr); void spl_sema_drop(spl_sema_t *sema); void spl_sema_run_module(spl_sema_t *sema, spl_ast_node_ref_t module_ref); void spl_sema_run(spl_sema_t *sema); void spl_sema_dump(spl_sema_t *sema); #endif /* __SPL_SEMA_H__ */