aboutsummaryrefslogtreecommitdiff
path: root/src/typecheck.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-10-04 23:10:43 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-10-04 23:10:43 -0400
commita4cb5ffafc050b519f806f74f0160ad48f76bee6 (patch)
tree7a55f9b2e7c680eaccfa81c3734efdda71e848a3 /src/typecheck.c
parent4cb2ea78760fabcbf526dee5962a6bf4896639f3 (diff)
Deprecate `extend`
Diffstat (limited to 'src/typecheck.c')
-rw-r--r--src/typecheck.c61
1 files changed, 3 insertions, 58 deletions
diff --git a/src/typecheck.c b/src/typecheck.c
index 21eb7b3f..b21fa40f 100644
--- a/src/typecheck.c
+++ b/src/typecheck.c
@@ -321,31 +321,6 @@ void prebind_statement(env_t *env, ast_t *statement) {
prebind_statement(ns_env, stmt->ast);
break;
}
- case Extend: {
- DeclareMatch(extend, statement, Extend);
- env_t *ns_env = namespace_env(env, extend->name);
- env_t *extended = new (env_t);
- *extended = *ns_env;
- extended->locals = new (Table_t, .fallback = env->locals);
- extended->namespace_bindings = new (Table_t, .fallback = env->namespace_bindings);
- extended->id_suffix = env->id_suffix;
- for (ast_list_t *stmt = extend->body ? Match(extend->body, Block)->statements : NULL; stmt; stmt = stmt->next)
- prebind_statement(extended, stmt->ast);
- List_t new_bindings = extended->locals->entries;
- for (int64_t i = 0; i < (int64_t)new_bindings.length; i++) {
- struct {
- const char *name;
- binding_t *binding;
- } *entry = new_bindings.data + i * new_bindings.stride;
- binding_t *clobbered = Table$str_get(*ns_env->locals, entry->name);
- if (clobbered && !type_eq(clobbered->type, entry->binding->type))
- code_err(statement, "This `extend` block overwrites the binding for ", quoted(entry->name),
- " in the original namespace (with type ", type_to_text(clobbered->type),
- ") with a new binding with type ", type_to_text(entry->binding->type));
- Table$str_set(ns_env->locals, entry->name, entry->binding);
- }
- break;
- }
default: break;
}
}
@@ -551,31 +526,6 @@ void bind_statement(env_t *env, ast_t *statement) {
bind_statement(ns_env, stmt->ast);
break;
}
- case Extend: {
- DeclareMatch(extend, statement, Extend);
- env_t *ns_env = namespace_env(env, extend->name);
- env_t *extended = new (env_t);
- *extended = *ns_env;
- extended->locals = new (Table_t, .fallback = env->locals);
- extended->namespace_bindings = new (Table_t, .fallback = env->namespace_bindings);
- extended->id_suffix = env->id_suffix;
- for (ast_list_t *stmt = extend->body ? Match(extend->body, Block)->statements : NULL; stmt; stmt = stmt->next)
- bind_statement(extended, stmt->ast);
- List_t new_bindings = extended->locals->entries;
- for (int64_t i = 0; i < (int64_t)new_bindings.length; i++) {
- struct {
- const char *name;
- binding_t *binding;
- } *entry = new_bindings.data + i * new_bindings.stride;
- binding_t *clobbered = Table$str_get(*ns_env->locals, entry->name);
- if (clobbered && !type_eq(clobbered->type, entry->binding->type))
- code_err(statement, "This `extend` block overwrites the binding for ", quoted(entry->name),
- " in the original namespace (with type ", type_to_text(clobbered->type),
- ") with a new binding with type ", type_to_text(entry->binding->type));
- Table$str_set(ns_env->locals, entry->name, entry->binding);
- }
- break;
- }
case Use: {
env_t *module_env = load_module(env, statement);
if (!module_env) break;
@@ -1074,8 +1024,7 @@ type_t *get_type(env_t *env, ast_t *ast) {
case ConvertDef:
case StructDef:
case EnumDef:
- case LangDef:
- case Extend: return Type(VoidType);
+ case LangDef: return Type(VoidType);
default: break;
}
@@ -1421,10 +1370,7 @@ type_t *get_type(env_t *env, ast_t *ast) {
case ConvertDef:
case StructDef:
case EnumDef:
- case LangDef:
- case Extend: {
- return Type(VoidType);
- }
+ case LangDef: return Type(VoidType);
case If: {
DeclareMatch(if_, ast, If);
@@ -1580,8 +1526,7 @@ PUREFUNC bool is_discardable(env_t *env, ast_t *ast) {
case StructDef:
case EnumDef:
case LangDef:
- case Use:
- case Extend: return true;
+ case Use: return true;
default: break;
}
type_t *t = get_type(env, ast);