diff options
Diffstat (limited to 'src/checker/entity.cpp')
| -rw-r--r-- | src/checker/entity.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/checker/entity.cpp b/src/checker/entity.cpp new file mode 100644 index 000000000..74ed6780f --- /dev/null +++ b/src/checker/entity.cpp @@ -0,0 +1,66 @@ +struct Scope; +struct Checker; + +enum EntityKind { + Entity_Invalid, + + Entity_Constant, + Entity_Variable, + Entity_TypeName, + Entity_Procedure, + Entity_Builtin, + + Entity_Count, +}; + +typedef i64 EntityGuid; + +struct Entity { + EntityKind kind; + EntityGuid guid; + + Scope *parent; + Token token; + Type *type; + + union { + struct { Value value; } constant; + struct { + b8 visited; + b8 is_field; + b8 used; + } variable; + struct {} type_name; + struct {} procedure; + struct { i32 id; } builtin; + }; +}; + +gb_global gbAtomic64 entity_guid_counter = {0}; + +EntityGuid next_entity_guid(void) { + return cast(EntityGuid)gb_atomic64_fetch_add(&entity_guid_counter, 1); +} + +Entity *alloc_entity(gbAllocator a, EntityKind kind, Scope *parent, Token token, Type *type) { + Entity *entity = gb_alloc_item(a, Entity); + entity->kind = kind; + entity->guid = next_entity_guid(); + entity->parent = parent; + entity->token = token; + entity->type = type; + return entity; +} + + + + +Entity *make_entity_variable (Checker *c, Scope *parent, Token token, Type *type); +Entity *make_entity_constant (Checker *c, Scope *parent, Token token, Type *type, Value value); +Entity *make_entity_type_name(Checker *c, Scope *parent, Token token, Type *type); +Entity *make_entity_param (Checker *c, Scope *parent, Token token, Type *type); +Entity *make_entity_field (Checker *c, Scope *parent, Token token, Type *type); +Entity *make_entity_procedure(Checker *c, Scope *parent, Token token, Type *signature_type); +Entity *make_entity_builtin (Checker *c, Scope *parent, Token token, Type *type, i32 id); + +Entity *make_entity_dummy_variable(Checker *c, Token token); |