Core printing

This commit is contained in:
Krzosa Karol
2023-03-31 22:28:18 +02:00
parent dd61594794
commit e70d544029
4 changed files with 372 additions and 102 deletions

View File

@@ -1,4 +1,7 @@
// @todo @cleanup
// :PrinterCleanup
// Instead of relying on global state, this probably should
// use a String_Builder or some kind of Builder context + macros
#define gen(...) pctx->gen.addf(__VA_ARGS__)
#define genln(...) \
do { \
@@ -825,92 +828,16 @@ gen_ast(Ast *ast) {
}
}
CORE_Static String
core_type_to_string(Ast_Type *type) {
switch (type->kind) {
case TYPE_NONE: return "<NONE>"_s; break;
case TYPE_S64: return "S64"_s; break;
case TYPE_S32: return "S32"_s; break;
case TYPE_S16: return "S16"_s; break;
case TYPE_S8: return "S8"_s; break;
case TYPE_INT: return "int"_s; break;
case TYPE_CHAR: return "char"_s; break;
case TYPE_U64: return "U64"_s; break;
case TYPE_U32: return "U32"_s; break;
case TYPE_U16: return "U16"_s; break;
case TYPE_U8: return "U8"_s; break;
case TYPE_F32: return "F32"_s; break;
case TYPE_F64: return "F64"_s; break;
case TYPE_BOOL: return "Bool"_s; break;
case TYPE_STRING: return "String"_s; break;
case TYPE_VOID: return "void"_s; break;
case TYPE_POINTER: {
String base = core_type_to_string(type->base);
return pctx->fmt("*%Q", base);
} break;
case TYPE_LAMBDA: {
String_Builder *b = &pctx->helper_builder;
b->addf("(");
Array<Ast_Type *> &args = type->func.args;
For(args) {
String t = core_type_to_string(it);
b->addf("%Q", t);
if (!args.is_last(&it)) b->addf(", ");
}
b->addf(")");
if (type->func.ret) {
String t = core_type_to_string(type->func.ret);
b->addf("%Q", t);
}
String result = string_flatten(pctx->perm, b);
return result;
} break;
case TYPE_STRUCT:
case TYPE_UNION:
case TYPE_ENUM: {
// @fixme: we probably want a string on Ast_Type
// so that we don't have to reach into Ast_Decl
// for Structs Enums etc.
Ast_Decl *decl = (Ast_Decl *)type->ast;
return decl->name.s;
} break;
case TYPE_ARRAY: {
String base = core_type_to_string(type->base);
return pctx->fmt("[%u]%Q", type->arr.size, base);
} break;
case TYPE_SLICE: {
String base = core_type_to_string(type->base);
return pctx->fmt("[]%Q", base);
} break;
case TYPE_TUPLE: {
invalid_codepath;
} break;
case TYPE_TYPE: return "Type"_s; break;
case TYPE_UNTYPED_BOOL: return "UntypedBool"_s; break;
case TYPE_UNTYPED_INT: return "UntypedInt"_s; break;
case TYPE_UNTYPED_FLOAT: return "UntypedFloat"_s; break;
case TYPE_UNTYPED_STRING: return "UntypedString"_s; break;
case TYPE_COMPLETING: invalid_codepath; break;
case TYPE_INCOMPLETE: invalid_codepath; break;
case TYPE_POLYMORPH:
invalid_codepath;
break;
invalid_default_case;
}
invalid_return;
}
CORE_Static String
compile_to_c_code() {
pctx->time.code_generation = os_time();
String core_stringify(Ast *);
For(pctx->ordered_decls) {
String r = core_stringify(it);
printf("%s\n", r.str);
}
#if 0
int di = 0;
For(pctx->ordered_decls) {