aboutsummaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-12 01:46:32 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-12 01:46:32 -0500
commit26c89b77dbf7fc124a5b57c2d5846d249ab84a1f (patch)
tree6a26f8897144548d6173544e43db30022eb92c7e /compile.c
parent179648b005b980e5c891d953b7c3ddef96f075f1 (diff)
Compile struct constructors and field accesses
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/compile.c b/compile.c
index 3cbd5a5a..19a497fe 100644
--- a/compile.c
+++ b/compile.c
@@ -260,7 +260,10 @@ CORD compile(ast_t *ast)
// Extern,
case StructDef: {
auto def = Match(ast, StructDef);
- CORD code = CORD_asprintf("typedef struct %s_s %s_t;\nstruct %s_s {\n", def->name, def->name, def->name);
+ CORD code = CORD_asprintf(
+ "typedef struct %s_s %s_t;\n"
+ "#define %s(...) ((%s_t){__VA_ARGS__})\n"
+ "struct %s_s {\n", def->name, def->name, def->name, def->name, def->name);
for (arg_ast_t *field = def->fields; field; field = field->next) {
CORD_sprintf(&code, "%r%r %s;\n", code, compile_type(field->type), field->name);
}
@@ -293,6 +296,10 @@ CORD compile(ast_t *ast)
compile(test->expr),
compile(WrapAST(test->expr, StringLiteral, .cord=test->output)));
}
+ case FieldAccess: {
+ auto f = Match(ast, FieldAccess);
+ return CORD_asprintf("(%r).%s", compile(f->fielded), f->field);
+ }
// Index, FieldAccess,
// DocTest,
// Use,