25 case eObrVisPrivate:
return eVisiblePrivate;
27 case eObrVisReadOnly:
return eVisiblePublic;
28 default:
CT_NEVER(
"remap-visibility %d", vis);
39 default:
return eLinkModule;
47 .visibility = remap_visibility(vis)
79 static void resolve_const(
tree_t *sema,
tree_t *
self,
void *user)
89 static void resolve_const_type(
tree_t *sema,
tree_t *
self,
void *user)
94 set_const_type(
self, decl, type);
97 static void resolve_var(
tree_t *sema,
tree_t *
self,
void *user)
106 static void resolve_type(
tree_t *sema,
tree_t *
self,
void *user)
116 static void resolve_proc(
tree_t *sema,
tree_t *
self,
void *user)
125 [eObrTagValues] = locals + param_count,
133 for (
size_t i = 0; i < locals; i++)
141 .quals = eQualMutable
149 for (
size_t i = 0; i < param_count; i++)
165 .fn_resolve = resolve_const,
166 .fn_resolve_type = resolve_const_type
179 .fn_resolve = resolve_var
190 .quals = eQualMutable
203 .fn_resolve = resolve_type
215 for (
size_t i = 0; i < len; i++)
227 if (decl->
body == NULL)
235 .fn_resolve = resolve_proc
247 .
tag = eObrTagValues,
248 .decl = forward_const(sema, decl)
255 .
tag = eObrTagValues,
256 .decl = forward_var(sema, decl)
264 .decl = forward_type(sema, decl)
277 tree_t *inner = forward_proc(sema, decl);
283 set_attribs(fwd.
decl, decl->
visibility, decl->
body == NULL ? eLinkImport : eLinkModule);
292 static void obr_resolve_init(
tree_t *sema,
tree_t *
self,
void *user)
301 .
link = eLinkEntryCli
306 if (mod->
init == NULL) {
return NULL; }
311 .fn_resolve = obr_resolve_init
CT_PUREFN CT_TREE_API const tree_t * tree_get_type(const tree_t *tree)
CT_TREE_API void tree_set_storage(tree_t *tree, tree_storage_t storage)
CT_PUREFN CT_TREE_API const vector_t * tree_fn_get_params(const tree_t *self)
CT_MEMORY_API arena_t * get_global_arena(void)
get the global memory arena
#define CT_UNUSED(x)
mark a variable as unused
CT_NODISCARD CT_ARENA_API void * arena_memdup(STA_READS(size) const void *ptr, size_t size, arena_t *arena)
duplicate a memory region from a custom allocator duplicate a region of memory and return a pointer t...
#define CT_NEVER(...)
assert that a code path is never reached
#define CTASSERTF(expr,...)
assert a condition with a message and optional format arguments
tree_t * tree_open_decl(const node_t *node, const char *name, tree_resolve_info_t resolve)
tree_t * tree_open_function(const node_t *node, const char *name, const tree_t *signature, tree_resolve_info_t resolve)
CT_TREE_API tree_t * tree_type_reference(const node_t *node, const char *name, const tree_t *reference)
create a reference type
CT_TREE_API tree_t * tree_type_closure(const node_t *node, const char *name, const tree_t *result, const vector_t *params, tree_arity_t arity)
create a function pointer type
CT_TREE_API tree_t * tree_module(tree_t *parent, const node_t *node, const char *name, size_t decls, const size_t *sizes)
create a new module
tree_t * tree_open_global(const node_t *node, const char *name, const tree_t *type, tree_resolve_info_t resolve)
void tree_close_function(tree_t *self, tree_t *body)
tree_visibility_t
symbol visibility
CT_TREE_API tree_cookie_t * tree_get_cookie(tree_t *sema)
return a resolution cookie
tree_t * tree_decl_param(const node_t *node, const char *name, const tree_t *type)
void tree_close_global(tree_t *self, tree_t *value)
tree_linkage_t
the linkage of a declaration
CT_TREE_API void tree_set_type(tree_t *self, const tree_t *type)
void tree_add_local(tree_t *self, tree_t *decl)
tree_t * tree_alias(const tree_t *tree, const char *name)
void tree_close_decl(tree_t *self, const tree_t *other)
tree_t * tree_resolve(tree_cookie_t *cookie, const tree_t *decl)
void tree_set_attrib(tree_t *self, const tree_attribs_t *attrib)
tree_t * tree_decl_function(const node_t *node, const char *name, const tree_t *signature, const vector_t *params, vector_t *locals, tree_t *body)
tree_t * tree_decl_local(const node_t *node, const char *name, tree_storage_t storage, const tree_t *type)
CT_NODISCARD CT_PUREFN CT_STD_API void * vector_get(const vector_t *vector, size_t index)
get a value from a vector
CT_NODISCARD CT_STD_API vector_t * vector_of(size_t len, arena_t *arena)
create a new vector with a specified length
CT_STD_API const vector_t kEmptyVector
a global empty vector used to avoid allocating alot of empty vectors
CT_STD_API void vector_set(vector_t *vector, size_t index, void *value)
set a value in a vector
CT_STD_API vector_t gEmptyVector
a global empty vector used to avoid allocating alot of empty vectors
CT_NODISCARD CT_PUREFN CT_STD_API size_t vector_len(const vector_t *vector)
get the length of a vector
obr_forward_t obr_forward_decl(tree_t *sema, obr_t *decl)
tree_t * obr_add_init(tree_t *sema, obr_t *mod)
tree_t * obr_default_value(const node_t *node, const tree_t *type)
tree_t * obr_sema_rvalue(tree_t *sema, obr_t *expr, const tree_t *implicit_type)
tree_t * obr_sema_stmts(tree_t *sema, const node_t *node, vector_t *stmts)
void obr_add_decl(tree_t *sema, obr_tag_t tag, const char *name, tree_t *decl)
add decls
tree_t * obr_get_void_type(void)
tree_t * obr_sema_type(tree_t *sema, obr_t *type, const char *name)
ctu_t * begin_resolve(tree_t *sema, tree_t *self, void *user, ctu_kind_t kind)
obr_visibility_t visibility
tree_linkage_t link
the link type of the declaration
const tree_t * storage
the underlying storage type
const char * name
the name of the declaration
a generic vector of pointers