diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-06-16 16:08:35 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-06-16 16:08:35 -0400 |
| commit | 9f8be0c5029a69bfa9796ac31866658b9da70390 (patch) | |
| tree | 5a9b74da9d766921daa78f9f6557f80facd5ef36 /tomo.c | |
| parent | 7dcb5bea3f32f7f122aea323995fe1da55cb8316 (diff) | |
Support library name as a separate environment field from namespace
Diffstat (limited to 'tomo.c')
| -rw-r--r-- | tomo.c | 34 |
1 files changed, 4 insertions, 30 deletions
@@ -120,7 +120,8 @@ int main(int argc, char *argv[]) cc = ENV_CORD("CC"); if (!cc) cc = "cc"; - env_t *env = new_compilation_unit(); + CORD compilation_library_name = CORD_EMPTY; + env_t *env = new_compilation_unit(&compilation_library_name); table_t dependency_files = {}; table_t to_link = {}; @@ -187,34 +188,7 @@ int main(int argc, char *argv[]) if (!isalnum(*p) && *p != '_' && *p != '$') *p = '_'; } - - // Each type's namespace now exists within the library's namespace, on top of whatever - // other namespace it was already in: - namespace_t *lib_ns = new(namespace_t, .name=libname_id); - for (int64_t i = 1; i <= Table$length(*env->types); i++) { - struct {const char *name; type_t *type; } *entry = Table$entry(*env->types, i); - env_t *type_env = NULL; - switch (entry->type->tag) { - case TextType: type_env = Match(entry->type, TextType)->env; break; - case StructType: type_env = Match(entry->type, StructType)->env; break; - case EnumType: type_env = Match(entry->type, EnumType)->env; break; - case TypeInfoType: type_env = Match(entry->type, TypeInfoType)->env; break; - default: break; - } - - if (type_env) { - // Find the topmost namespace, and if it's not already `lib_ns`, then - // set it to that: - for (namespace_t **ns = &type_env->namespace; ; ns = &((*ns)->parent)) { - if (*ns == lib_ns) { - break; - } else if (*ns == NULL) { - *ns = lib_ns; - break; - } - } - } - } + compilation_library_name = libname_id; // Build a "libwhatever.h" header that loads all the headers: const char *h_filename = heap_strf("lib%s.h", libname); @@ -226,7 +200,7 @@ int main(int argc, char *argv[]) if (!f) errx(1, "No such file: %s", filename); ast_t *ast = parse_file(f, NULL); if (!ast) errx(1, "Could not parse %s", f); - env->namespace = new(namespace_t, .name=file_base_name(filename), .parent=lib_ns); + env->namespace = new(namespace_t, .name=file_base_name(filename)); for (ast_list_t *stmt = Match(ast, Block)->statements; stmt; stmt = stmt->next) { if (stmt->ast->tag == Import || (stmt->ast->tag == Declare && Match(stmt->ast, Declare)->value->tag == Import)) continue; |
