aboutsummaryrefslogtreecommitdiff
path: root/typecheck.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 /typecheck.c
parent7dcb5bea3f32f7f122aea323995fe1da55cb8316 (diff)
Support library name as a separate environment field from namespace
Diffstat (limited to 'typecheck.c')
-rw-r--r--typecheck.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/typecheck.c b/typecheck.c
index 8e4bfd7d..4b4f1038 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -137,7 +137,7 @@ static env_t *load_module(env_t *env, ast_t *module_ast)
if (!isalnum(*c) && *c != '_')
*c = '_';
}
- module_env->namespace = new(namespace_t, .name=libname_id);
+ module_env->libname = (const char**)&libname_id;
for (int64_t i = 1; i <= files_f->num_lines; i++) {
const char *line = get_line(files_f, i);
line = heap_strn(line, strcspn(line, "\r\n"));
@@ -156,7 +156,7 @@ static env_t *load_module(env_t *env, ast_t *module_ast)
if (!isalnum(*p) && *p != '_' && *p != '$')
*p = '_';
}
- module_file_env->namespace = new(namespace_t, .name=file_prefix, .parent=module_env->namespace);
+ module_file_env->namespace = new(namespace_t, .name=file_prefix);
module_file_env->imports = new(table_t);
env_t *subenv = load_module_env(module_file_env, ast);
for (int64_t j = 0; j < subenv->locals->entries.length; j++) {
@@ -188,7 +188,7 @@ void prebind_statement(env_t *env, ast_t *statement)
type_t *type = Type(StructType, .name=def->name, .opaque=true, .env=ns_env); // placeholder
Table$str_set(env->types, def->name, type);
set_binding(env, def->name, new(binding_t, .type=Type(TypeInfoType, .name=def->name, .type=type, .env=ns_env),
- .code=CORD_all(namespace_prefix(env->namespace), def->name)));
+ .code=CORD_all(namespace_prefix(env->libname, env->namespace), def->name)));
for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next)
prebind_statement(ns_env, stmt->ast);
break;
@@ -201,7 +201,8 @@ void prebind_statement(env_t *env, ast_t *statement)
env_t *ns_env = namespace_env(env, def->name);
type_t *type = Type(EnumType, .name=def->name, .opaque=true, .env=ns_env); // placeholder
Table$str_set(env->types, def->name, type);
- set_binding(env, def->name, new(binding_t, .type=Type(TypeInfoType, .name=def->name, .type=type, .env=ns_env), .code=CORD_all(namespace_prefix(env->namespace), def->name)));
+ set_binding(env, def->name, new(binding_t, .type=Type(TypeInfoType, .name=def->name, .type=type, .env=ns_env),
+ .code=CORD_all(namespace_prefix(env->libname, env->namespace), def->name)));
for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next)
prebind_statement(ns_env, stmt->ast);
break;
@@ -214,7 +215,8 @@ void prebind_statement(env_t *env, ast_t *statement)
env_t *ns_env = namespace_env(env, def->name);
type_t *type = Type(TextType, .lang=def->name, .env=ns_env);
Table$str_set(env->types, def->name, type);
- set_binding(env, def->name, new(binding_t, .type=Type(TypeInfoType, .name=def->name, .type=type, .env=ns_env), .code=CORD_all(namespace_prefix(env->namespace), def->name)));
+ set_binding(env, def->name, new(binding_t, .type=Type(TypeInfoType, .name=def->name, .type=type, .env=ns_env),
+ .code=CORD_all(namespace_prefix(env->libname, env->namespace), def->name)));
for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next)
prebind_statement(ns_env, stmt->ast);
break;
@@ -240,7 +242,7 @@ void bind_statement(env_t *env, ast_t *statement)
else
bind_statement(env, decl->value);
type_t *type = get_type(env, decl->value);
- CORD prefix = namespace_prefix(env->namespace);
+ CORD prefix = namespace_prefix(env->libname, env->namespace);
CORD code = CORD_cat(prefix ? prefix : "$", name);
set_binding(env, name, new(binding_t, .type=type, .code=code));
break;
@@ -251,8 +253,7 @@ void bind_statement(env_t *env, ast_t *statement)
if (get_binding(env, name))
code_err(def->name, "A %T called '%s' has already been defined", get_binding(env, name)->type, name);
type_t *type = get_function_def_type(env, statement);
- bool is_private = (name[0] == '_');
- CORD code = is_private ? CORD_cat("$", name) : CORD_all(namespace_prefix(env->namespace), name);
+ CORD code = CORD_all(namespace_prefix(env->libname, env->namespace), name);
set_binding(env, name, new(binding_t, .type=type, .code=code));
break;
}
@@ -318,9 +319,9 @@ void bind_statement(env_t *env, ast_t *statement)
for (tag_t *tag = tags; tag; tag = tag->next) {
if (Match(tag->type, StructType)->fields) { // Constructor:
type_t *constructor_t = Type(FunctionType, .args=Match(tag->type, StructType)->fields, .ret=type);
- set_binding(ns_env, tag->name, new(binding_t, .type=constructor_t, .code=CORD_all(namespace_prefix(env->namespace), def->name, "$tagged$", tag->name)));
+ set_binding(ns_env, tag->name, new(binding_t, .type=constructor_t, .code=CORD_all(namespace_prefix(env->libname, env->namespace), def->name, "$tagged$", tag->name)));
} else { // Empty singleton value:
- CORD code = CORD_all("(", namespace_prefix(env->namespace), def->name, "_t){", namespace_prefix(env->namespace), def->name, "$tag$", tag->name, "}");
+ CORD code = CORD_all("(", namespace_prefix(env->libname, env->namespace), def->name, "_t){", namespace_prefix(env->libname, env->namespace), def->name, "$tag$", tag->name, "}");
set_binding(ns_env, tag->name, new(binding_t, .type=type, .code=code));
}
Table$str_set(env->types, heap_strf("%s$%s", def->name, tag->name), tag->type);
@@ -339,7 +340,7 @@ void bind_statement(env_t *env, ast_t *statement)
set_binding(ns_env, "from_unsafe_text",
new(binding_t, .type=Type(FunctionType, .args=new(arg_t, .name="text", .type=TEXT_TYPE), .ret=type),
- .code=CORD_all("(", namespace_prefix(env->namespace), def->name, "_t)")));
+ .code=CORD_all("(", namespace_prefix(env->libname, env->namespace), def->name, "_t)")));
set_binding(ns_env, "text_content",
new(binding_t, .type=Type(FunctionType, .args=new(arg_t, .name="text", .type=TEXT_TYPE), .ret=type),
.code="(Text_t)"));