#ifndef __SPL_ATTR_H__ #define __SPL_ATTR_H__ #include "../stage0/include/utils.h" typedef enum { SPL_ATTR_STAGE_SEMA, SPL_ATTR_STAGE_LAYOUT, SPL_ATTR_STAGE_IR, SPL_ATTR_STAGE_OPT, SPL_ATTR_STAGE_BACKEND, } spl_attr_stage_t; typedef enum { SPL_ATTR_TARGET_DECL, SPL_ATTR_TARGET_TYPE, SPL_ATTR_TARGET_EXPR, SPL_ATTR_TARGET_STMT, } spl_attr_target_t; typedef enum { SPL_ATTR_OPTIONAL, SPL_ATTR_REQUIRED, } spl_attr_demand_t; typedef struct { const char *ns; const char *name; spl_attr_stage_t stage; spl_attr_target_t target; spl_attr_demand_t demand; int min_args; int max_args; } spl_attr_info_t; typedef enum { SPL_ATTR_ARG_INT, SPL_ATTR_ARG_STR, SPL_ATTR_ARG_DEF, SPL_ATTR_ARG_TYPE, } spl_attr_arg_kind_t; typedef struct { spl_attr_arg_kind_t kind; union { isize i; const char *s; usize d; usize t; } value; } spl_attr_arg_t; typedef VEC(spl_attr_arg_t) spl_attr_arg_vec_t; typedef usize spl_attr_id_t; typedef struct { spl_attr_info_t *info; spl_attr_arg_vec_t args; uint32_t consumed_mask; } spl_attr_node_t; typedef VEC(spl_attr_node_t) spl_attr_node_vec_t; typedef VEC(spl_attr_id_t) spl_attr_id_vec_t; typedef VEC(spl_attr_info_t *) spl_attr_registry_t; typedef struct { spl_attr_node_vec_t table; spl_attr_registry_t registry; } spl_attr_t; void spl_attr_init(spl_attr_t *ctx); void spl_attr_drop(spl_attr_t *ctx); spl_attr_id_t spl_attr_alloc(spl_attr_t *ctx, spl_attr_info_t *info, spl_attr_arg_vec_t args); spl_attr_node_t *spl_attr_node(const spl_attr_t *ctx, spl_attr_id_t id); void spl_attr_registry_add(spl_attr_t *ctx, spl_attr_info_t *info); spl_attr_info_t *spl_attr_lookup(spl_attr_t *ctx, const char *ns, const char *name); void spl_attr_register_builtins(spl_attr_t *ctx); void spl_attr_dump(const spl_attr_t *ctx); void spl_attr_dump_id(const spl_attr_t *ctx, spl_attr_id_t id); #endif /* __SPL_ATTR_H__ */