aboutsummaryrefslogtreecommitdiff
path: root/src/check_decl.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-06-09 10:08:17 +0100
committergingerBill <bill@gingerbill.org>2018-06-09 10:08:17 +0100
commit49ea9ed7226b68cde2eeea3984d61098df9f22e3 (patch)
treec6c101d298e02f3c0118ccd3dbe1bd1e8bc35953 /src/check_decl.cpp
parentd7108416c9abca6bd9ebd45ad54c3b3af6829345 (diff)
Entity aliasing clean up
Diffstat (limited to 'src/check_decl.cpp')
-rw-r--r--src/check_decl.cpp50
1 files changed, 21 insertions, 29 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 0d7cca3ce..28a3dadce 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -260,6 +260,19 @@ void check_type_decl(CheckerContext *ctx, Entity *e, AstNode *type_expr, Type *d
// }
}
+
+void override_entity_in_scope(Entity *original_entity, Entity *new_entity) {
+ // NOTE(bill): The original_entity's scope may not be same scope that it was inserted into
+ // e.g. file entity inserted into its package scope
+ String original_name = original_entity->token.string;
+ Scope *found_scope = nullptr;
+ Entity *found_entity = nullptr;
+ scope_lookup_parent(original_entity->scope, original_name, &found_scope, &found_entity);
+ GB_ASSERT(found_entity == original_entity);
+
+ map_set(&found_scope->elements, hash_string(original_name), new_entity);
+}
+
void check_const_decl(CheckerContext *ctx, Entity *e, AstNode *type_expr, AstNode *init, Type *named_type) {
GB_ASSERT(e->type == nullptr);
GB_ASSERT(e->kind == Entity_Constant);
@@ -321,40 +334,19 @@ void check_const_decl(CheckerContext *ctx, Entity *e, AstNode *type_expr, AstNod
case Addressing_ProcGroup:
GB_ASSERT(operand.proc_group != nullptr);
GB_ASSERT(operand.proc_group->kind == Entity_ProcGroup);
-
- e->kind = Entity_ProcGroup;
- e->type = t_invalid;
- gb_memmove(&e->ProcGroup, &operand.proc_group->ProcGroup, gb_size_of(e->ProcGroup));
+ override_entity_in_scope(e, operand.proc_group);
return;
}
if (entity != nullptr) {
- // TODO(bill): Clean up aliasing code
+
+ // NOTE(bill): Override aliased entity
switch (entity->kind) {
- case Entity_Alias:
- e->kind = Entity_Alias;
- e->type = entity->type;
- e->Alias.base = entity->Alias.base;
- return;
+ case Entity_ProcGroup:
case Entity_Procedure:
- e->kind = Entity_Alias;
- e->type = entity->type;
- e->Alias.base = entity;
- return;
- case Entity_ImportName:
- e->kind = Entity_ImportName;
- e->type = entity->type;
- e->ImportName.path = entity->ImportName.path;
- e->ImportName.name = entity->ImportName.path;
- e->ImportName.scope = entity->ImportName.scope;
- e->flags &= ~EntityFlag_Used;
- return;
case Entity_LibraryName:
- e->kind = Entity_LibraryName;
- e->type = entity->type;
- e->LibraryName.path = entity->LibraryName.path;
- e->LibraryName.name = entity->LibraryName.path;
- e->flags &= ~EntityFlag_Used;
+ case Entity_ImportName:
+ override_entity_in_scope(e, entity);
return;
}
}
@@ -457,7 +449,7 @@ void init_entity_foreign_library(CheckerContext *ctx, Entity *e) {
error(ident, "foreign library names must be an identifier");
} else {
String name = ident->Ident.token.string;
- Entity *found = scope_lookup_entity(ctx->scope, name);
+ Entity *found = scope_lookup(ctx->scope, name);
if (found == nullptr) {
if (is_blank_ident(name)) {
// NOTE(bill): link against nothing
@@ -992,7 +984,7 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
uvar->Variable.is_immutable = is_immutable;
if (is_value) uvar->flags |= EntityFlag_Value;
- Entity *prev = scope_insert_entity(ctx->scope, uvar);
+ Entity *prev = scope_insert(ctx->scope, uvar);
if (prev != nullptr) {
error(e->token, "Namespace collision while 'using' '%.*s' of: %.*s", LIT(name), LIT(prev->token.string));
break;