aboutsummaryrefslogtreecommitdiff
path: root/environment.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-03-03 13:04:50 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-03-03 13:04:50 -0500
commitec7a9e5f107a68072b3a4dd84aa6a4b461657345 (patch)
tree2a03723c2d8060e4503c6b9ecb97baad9432cd3d /environment.c
parent4dc70c84d4226174d44f1b53599d08de7a4e83aa (diff)
Initial pass at namespacing
Diffstat (limited to 'environment.c')
-rw-r--r--environment.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/environment.c b/environment.c
index d76118cc..a702129e 100644
--- a/environment.c
+++ b/environment.c
@@ -72,7 +72,7 @@ env_t *new_compilation_unit(void)
};
for (size_t i = 0; i < sizeof(global_types)/sizeof(global_types[0]); i++) {
- binding_t *binding = new(binding_t, .type=Type(TypeInfoType));
+ binding_t *binding = new(binding_t, .type=Type(TypeInfoType, .name=global_types[i].name, .type=global_types[i].type));
Table_str_set(env->globals, global_types[i].name, binding);
Table_str_set(env->types, global_types[i].name, global_types[i].type);
}
@@ -104,7 +104,7 @@ binding_t *get_binding(env_t *env, const char *name)
return Table_str_get(env->locals, name);
}
-binding_t *get_method_binding(env_t *env, ast_t *self, const char *name)
+binding_t *get_namespace_binding(env_t *env, ast_t *self, const char *name)
{
type_t *self_type = get_type(env, self);
if (!self_type)
@@ -121,11 +121,18 @@ binding_t *get_method_binding(env_t *env, ast_t *self, const char *name)
table_t *ns = Table_str_get(env->type_namespaces, "Str");
return Table_str_get(ns, name);
}
- case StructType: case EnumType: {
- errx(1, "Struct/enum methods not implemented");
- // const char *name = cls_type->tag == StructType ? Match(cls_type, StructType)->name : Match(cls_type, EnumType)->name;
- // table_t *namespace = Table_str_get(env->type_namespaces, name);
- // if (!name)
+ case TypeInfoType: case StructType: case EnumType: {
+ const char *name;
+ switch (cls_type->tag) {
+ case TypeInfoType: name = Match(cls_type, TypeInfoType)->name; break;
+ case StructType: name = Match(cls_type, StructType)->name; break;
+ case EnumType: name = Match(cls_type, EnumType)->name; break;
+ default: errx(1, "Unreachable");
+ }
+
+ table_t *namespace = Table_str_get(env->type_namespaces, name);
+ if (!namespace) return NULL;
+ return Table_str_get(namespace, name);
}
default: break;
}