aboutsummaryrefslogtreecommitdiff
path: root/typecheck.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-27 14:56:24 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-27 14:56:24 -0400
commitca93e6f3cb78f65f8eb8aac0d6fae81be2c250e8 (patch)
tree426245f7e01d666cdcbdbc4c42766db9d1dcc95d /typecheck.c
parent9b15799e73b2d8342b815de1715c85c3a1bc27d7 (diff)
Simplify code by making `name := use ...` a Use AST instead of a Declare
Diffstat (limited to 'typecheck.c')
-rw-r--r--typecheck.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/typecheck.c b/typecheck.c
index f993604b..fd0b9d63 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -255,11 +255,7 @@ void bind_statement(env_t *env, ast_t *statement)
return;
if (get_binding(env, name))
code_err(decl->var, "A %T called '%s' has already been defined", get_binding(env, name)->type, name);
- if (decl->value->tag == Use) {
- (void)load_module(env, decl->value);
- } else {
- bind_statement(env, decl->value);
- }
+ bind_statement(env, decl->value);
type_t *type = get_type(env, decl->value);
if (!type)
code_err(decl->value, "I couldn't figure out the type of this value");
@@ -394,9 +390,15 @@ void bind_statement(env_t *env, ast_t *statement)
if (Table$str_get(*env->types, entry->name))
continue;
-//code_err(statement, "This module imports a type called '%s', which would clobber another type", entry->name);
Table$str_set(env->types, entry->name, entry->type);
}
+
+ ast_t *var = Match(statement, Use)->var;
+ if (var) {
+ type_t *type = get_type(env, statement);
+ assert(type);
+ set_binding(env, Match(var, Var)->name, new(binding_t, .type=type));
+ }
break;
}
case Extern: {