aboutsummaryrefslogtreecommitdiff
path: root/src/compile/files.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-09-21 13:38:27 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-09-21 13:38:27 -0400
commit7204970fccd5f1903c38b97c9c0778892c44fdfe (patch)
treedb3e4afa89834c9387ac686f49ab5f777f63ed28 /src/compile/files.c
parente419a527a1212123946e53adaaea01df0c5605c3 (diff)
Got inlne enums working in most places
Diffstat (limited to 'src/compile/files.c')
-rw-r--r--src/compile/files.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/compile/files.c b/src/compile/files.c
index 4d6fb1a8..7ff252c2 100644
--- a/src/compile/files.c
+++ b/src/compile/files.c
@@ -125,8 +125,8 @@ Text_t compile_top_level_code(env_t *env, ast_t *ast) {
}
case EnumDef: {
DeclareMatch(def, ast, EnumDef);
- Text_t code = compile_enum_typeinfo(env, ast);
- code = Texts(code, compile_enum_constructors(env, ast));
+ Text_t code = compile_enum_typeinfo(env, def->name, def->tags);
+ code = Texts(code, compile_enum_constructors(env, def->name, def->tags));
return Texts(code, compile_namespace(env, def->name, def->namespace));
}
case LangDef: {
@@ -162,9 +162,30 @@ Text_t compile_top_level_code(env_t *env, ast_t *ast) {
}
}
+typedef struct {
+ env_t *env;
+ Text_t *code;
+} compile_info_t;
+
+static void add_type_infos(type_ast_t *type_ast, void *userdata) {
+ if (type_ast && type_ast->tag == EnumTypeAST) {
+ compile_info_t *info = (compile_info_t *)userdata;
+ *info->code = Texts(
+ *info->code,
+ compile_enum_typeinfo(info->env, String("enum$", (int64_t)(type_ast->start - type_ast->file->text)),
+ Match(type_ast, EnumTypeAST)->tags),
+ compile_enum_constructors(info->env, String("enum$", (int64_t)(type_ast->start - type_ast->file->text)),
+ Match(type_ast, EnumTypeAST)->tags));
+ }
+}
+
public
Text_t compile_file(env_t *env, ast_t *ast) {
Text_t top_level_code = compile_top_level_code(env, ast);
+
+ compile_info_t info = {.env = env, .code = &top_level_code};
+ type_ast_visit(ast, add_type_infos, &info);
+
Text_t includes = EMPTY_TEXT;
Text_t use_imports = EMPTY_TEXT;