aboutsummaryrefslogtreecommitdiff
path: root/typecheck.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-02-19 18:50:50 -0500
committerBruce Hill <bruce@bruce-hill.com>2025-02-19 18:50:50 -0500
commit058a028aef6f056a31d1e9a09fa83d498c553b78 (patch)
tree21f0be237338d13ebc9380aee2a1db5afaad53d6 /typecheck.c
parent29849d145787fac5df454d9314c98570488045ce (diff)
Switch to langs using constructors
Diffstat (limited to 'typecheck.c')
-rw-r--r--typecheck.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/typecheck.c b/typecheck.c
index 7e63396f..cbdbc8cd 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -298,9 +298,16 @@ void bind_statement(env_t *env, ast_t *statement)
case FunctionDef: {
auto def = Match(statement, FunctionDef);
const char *name = Match(def->name, Var)->name;
+ type_t *type = get_function_def_type(env, statement);
+ if (env->namespace && env->namespace->parent && env->namespace->name && streq(name, env->namespace->name)) {
+ CORD code = CORD_asprintf("%r%ld", namespace_prefix(env, env->namespace), get_line_number(statement->file, statement->start));
+ binding_t binding = {.type=type, .code=code};
+ Array$insert(&env->namespace->constructors, &binding, I(0), sizeof(binding));
+ break;
+ }
+
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);
CORD code = CORD_all(namespace_prefix(env, env->namespace), name);
set_binding(env, name, type, code);
break;