aboutsummaryrefslogtreecommitdiff
path: root/tomo.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-06-16 16:08:35 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-06-16 16:08:35 -0400
commit9f8be0c5029a69bfa9796ac31866658b9da70390 (patch)
tree5a9b74da9d766921daa78f9f6557f80facd5ef36 /tomo.c
parent7dcb5bea3f32f7f122aea323995fe1da55cb8316 (diff)
Support library name as a separate environment field from namespace
Diffstat (limited to 'tomo.c')
-rw-r--r--tomo.c34
1 files changed, 4 insertions, 30 deletions
diff --git a/tomo.c b/tomo.c
index 392df943..78f665af 100644
--- a/tomo.c
+++ b/tomo.c
@@ -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;