From 26c89b77dbf7fc124a5b57c2d5846d249ab84a1f Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 12 Feb 2024 01:46:32 -0500 Subject: [PATCH] Compile struct constructors and field accesses --- compile.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/compile.c b/compile.c index 3cbd5a5..19a497f 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,