diff options
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 94 |
1 files changed, 58 insertions, 36 deletions
diff --git a/src/checker.cpp b/src/checker.cpp index 4d1b2c46a..b4fab10bc 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -258,7 +258,7 @@ Scope *create_scope_from_package(Checker *c, AstPackage *p) { s->is_init = p->kind == Package_Init; } - if (p->kind == Package_Builtin) { + if (p->kind == Package_Runtime) { s->is_global = true; universal_scope->shared = s; } @@ -479,9 +479,21 @@ void add_type_info_dependency(DeclInfo *d, Type *type) { ptr_set_add(&d->type_info_deps, type); } -void add_preload_dependency(Checker *c, char *name) { +AstPackage *get_core_package(CheckerInfo *info, String name) { + gbAllocator a = heap_allocator(); + String path = get_fullpath_core(a, name); + defer (gb_free(a, path.text)); + HashKey key = hash_string(path); + auto found = map_get(&info->packages, key); + GB_ASSERT_MSG(found != nullptr, "Missing core package %.*s", LIT(name)); + return *found; +} + + +void add_package_dependency(Checker *c, char *package_name, char *name) { String n = make_string_c(name); - Entity *e = scope_lookup_entity(c->builtin_package->scope, n); + AstPackage *p = get_core_package(&c->info, make_string_c(package_name)); + Entity *e = scope_lookup_entity(p->scope, n); GB_ASSERT(e != nullptr); ptr_set_add(&c->context.decl->deps, e); // add_type_info_type(c, e->type); @@ -913,6 +925,7 @@ void add_entity_and_decl_info(Checker *c, AstNode *identifier, Entity *e, DeclIn GB_ASSERT(identifier->kind == AstNode_Ident); GB_ASSERT(e != nullptr && d != nullptr); GB_ASSERT(identifier->Ident.token.string == e->token.string); + if (e->scope != nullptr) { Scope *scope = e->scope; if (scope->is_file) { @@ -924,22 +937,21 @@ void add_entity_and_decl_info(Checker *c, AstNode *identifier, Entity *e, DeclIn default: { AstPackage *p = scope->file->package; GB_ASSERT(p->scope == scope->parent); + GB_ASSERT(c->context.package == p); scope = p->scope; - if (e->package != nullptr) { - GB_ASSERT(e->package == p); - } - e->package = p; break; } } } add_entity(c, scope, identifier, e); } + add_entity_definition(&c->info, identifier, e); GB_ASSERT(e->decl_info == nullptr); e->decl_info = d; array_add(&c->info.entities, e); e->order_in_src = c->info.entities.count; + e->package = c->context.package; } @@ -1141,10 +1153,11 @@ void add_curr_ast_file(Checker *c, AstFile *file) { if (file != nullptr) { TokenPos zero_pos = {}; global_error_collector.prev = zero_pos; - c->curr_ast_file = file; - c->context.decl = file->package->decl_info; - c->context.scope = file->scope; - c->context.package_scope = file->package->scope; + c->curr_ast_file = file; + c->context.decl = file->package->decl_info; + c->context.scope = file->scope; + c->context.package = file->package; + c->context.package_scope = file->package->scope; } } @@ -1331,14 +1344,14 @@ void add_dependency_to_set(Checker *c, Entity *entity) { } } + void generate_minimum_dependency_set(Checker *c, Entity *start) { ptr_set_init(&c->info.minimum_dependency_set, heap_allocator()); ptr_set_init(&c->info.minimum_dependency_type_info_set, heap_allocator()); - String required_entities[] = { + String required_builtin_entities[] = { str_lit("__mem_zero"), str_lit("__init_context"), - str_lit("default_allocator"), str_lit("__args__"), str_lit("__type_table"), @@ -1348,8 +1361,16 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("Allocator"), str_lit("Context"), }; - for (isize i = 0; i < gb_count_of(required_entities); i++) { - add_dependency_to_set(c, scope_lookup_entity(c->builtin_package->scope, required_entities[i])); + for (isize i = 0; i < gb_count_of(required_builtin_entities); i++) { + add_dependency_to_set(c, scope_lookup_entity(c->runtime_package->scope, required_builtin_entities[i])); + } + + AstPackage *mem = get_core_package(&c->info, str_lit("mem")); + String required_mem_entities[] = { + str_lit("default_allocator"), + }; + for (isize i = 0; i < gb_count_of(required_mem_entities); i++) { + add_dependency_to_set(c, scope_lookup_entity(mem->scope, required_mem_entities[i])); } if (!build_context.no_bounds_check) { @@ -1359,7 +1380,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("__dynamic_array_expr_error"), }; for (isize i = 0; i < gb_count_of(bounds_check_entities); i++) { - add_dependency_to_set(c, scope_lookup_entity(c->builtin_package->scope, bounds_check_entities[i])); + add_dependency_to_set(c, scope_lookup_entity(c->runtime_package->scope, bounds_check_entities[i])); } } @@ -1479,7 +1500,7 @@ Array<EntityGraphNode *> generate_entity_dependency_graph(CheckerInfo *info) { Entity *find_core_entity(Checker *c, String name) { - Entity *e = current_scope_lookup_entity(c->builtin_package->scope, name); + Entity *e = current_scope_lookup_entity(c->runtime_package->scope, name); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" "Is '_preload.odin' missing from the 'core' directory relative to odin.exe?", LIT(name)); @@ -1489,7 +1510,7 @@ Entity *find_core_entity(Checker *c, String name) { } Type *find_core_type(Checker *c, String name) { - Entity *e = current_scope_lookup_entity(c->builtin_package->scope, name); + Entity *e = current_scope_lookup_entity(c->runtime_package->scope, name); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" "Is '_preload.odin' missing from the 'core' directory relative to odin.exe?", LIT(name)); @@ -1605,7 +1626,8 @@ void init_preload(Checker *c) { } if (t_allocator == nullptr) { - Entity *e = find_core_entity(c, str_lit("Allocator")); + AstPackage *mem = get_core_package(&c->info, str_lit("mem")); + Entity *e = scope_lookup_entity(mem->scope, str_lit("Allocator")); t_allocator = e->type; t_allocator_ptr = alloc_type_pointer(t_allocator); } @@ -2118,6 +2140,8 @@ void check_add_foreign_block_decl(Checker *c, AstNode *decl) { void check_collect_entities(Checker *c, Array<AstNode *> nodes) { for_array(decl_index, nodes) { AstNode *decl = nodes[decl_index]; + if (c->context.scope->is_file) { + } if (!is_ast_node_decl(decl) && !is_ast_node_when_stmt(decl)) { if (c->context.scope->is_file && decl->kind == AstNode_ExprStmt) { @@ -2204,7 +2228,6 @@ void check_all_global_entities(Checker *c) { } - GB_ASSERT(d->scope->is_file); AstFile *file = d->scope->file; add_curr_ast_file(c, file); @@ -2222,7 +2245,6 @@ void check_all_global_entities(Checker *c) { } } - CheckerContext prev_context = c->context; c->context.decl = d; c->context.scope = d->scope; @@ -2394,8 +2416,8 @@ Array<ImportGraphNode *> generate_import_dependency_graph(Checker *c) { // Calculate edges for graph M for_array(i, c->parser->packages) { AstPackage *p = c->parser->packages[i]; - for_array(j, p->files.entries) { - AstFile *f = p->files.entries[j].value; + for_array(j, p->files) { + AstFile *f = p->files[j]; for_array(k, f->decls) { AstNode *decl = f->decls[k]; add_import_dependency_node(c, decl, &M); @@ -2441,8 +2463,8 @@ Array<ImportPathItem> find_import_path(Checker *c, Scope *start, Scope *end, Ptr AstPackage *p = (*found)->package; GB_ASSERT(p != nullptr); - for_array(i, p->files.entries) { - AstFile *f = p->files.entries[i].value; + for_array(i, p->files) { + AstFile *f = p->files[i]; for_array(j, f->imports) { Scope *s = nullptr; AstNode *decl = f->imports[j]; @@ -2707,8 +2729,8 @@ void check_import_entities(Checker *c) { GB_ASSERT(node->scope->is_package); AstPackage *p = node->scope->package; - for_array(i, p->files.entries) { - AstFile *f = p->files.entries[i].value; + for_array(i, p->files) { + AstFile *f = p->files[i]; CheckerContext prev_context = c->context; defer (c->context = prev_context); add_curr_ast_file(c, f); @@ -2719,8 +2741,8 @@ void check_import_entities(Checker *c) { } } - for_array(i, p->files.entries) { - AstFile *f = p->files.entries[i].value; + for_array(i, p->files) { + AstFile *f = p->files[i]; CheckerContext prev_context = c->context; defer (c->context = prev_context); add_curr_ast_file(c, f); @@ -2903,9 +2925,9 @@ void check_parsed_files(Checker *c) { if (scope->is_init) { c->info.init_scope = scope; } - if (p->kind == Package_Builtin) { - GB_ASSERT(c->builtin_package == nullptr); - c->builtin_package = p; + if (p->kind == Package_Runtime) { + GB_ASSERT(c->runtime_package == nullptr); + c->runtime_package = p; } } @@ -2914,8 +2936,8 @@ void check_parsed_files(Checker *c) { for_array(i, c->parser->packages) { AstPackage *p = c->parser->packages[i]; CheckerContext prev_context = c->context; - for_array(j, p->files.entries) { - AstFile *f = p->files.entries[j].value; + for_array(j, p->files) { + AstFile *f = p->files[j]; create_scope_from_file(c, f); HashKey key = hash_string(f->fullpath); map_set(&c->info.files, key, f); @@ -3029,8 +3051,8 @@ void check_parsed_files(Checker *c) { token.pos.file = s->package->fullpath; token.pos.line = 1; token.pos.column = 1; - if (s->package->files.entries.count > 0) { - AstFile *f = s->package->files.entries[0].value; + if (s->package->files.count > 0) { + AstFile *f = s->package->files[0]; if (f->tokens.count > 0) { token = f->tokens[0]; } |