Iterator + start to add core to core codegen
This commit is contained in:
@@ -83,8 +83,9 @@ get_ctype_name_for_type(Ast_Type *type) {
|
||||
|
||||
case TYPE_INCOMPLETE: {
|
||||
// This happens in case where we have a procedure in an away module.
|
||||
// Meaning that it's not resolved fully on purpose (treeshaking).
|
||||
// And that procedure takes a pointer from a struct that is never
|
||||
// use elsewhere. In that case this seems fine.
|
||||
// used elsewhere. In that case this seems fine.
|
||||
return "void";
|
||||
}
|
||||
invalid_default_case;
|
||||
@@ -824,37 +825,144 @@ 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();
|
||||
|
||||
int di = 0;
|
||||
For(pctx->ordered_decls) {
|
||||
for (Ast_Iter iter = iterate_depth_first(pctx->heap, it); iter.ast; next(&iter)) {
|
||||
Ast_Decl *decl = (Ast_Decl *)iter.ast;
|
||||
Ast *ast = iter.ast;
|
||||
Ast_Atom *atom = (Ast_Atom *)iter.ast;
|
||||
|
||||
switch (iter.kind) {
|
||||
case AST_STRUCT: {
|
||||
genln("(struct %s", decl->name.str);
|
||||
genln("%Q :: struct", decl->name);
|
||||
global_indent += 1;
|
||||
} break;
|
||||
case AST_STRUCT + 128: {
|
||||
case AST_STRUCT + AST_NODE_END: {
|
||||
global_indent -= 1;
|
||||
} break;
|
||||
case AST_LAMBDA: {
|
||||
Ast_Lambda *lambda = decl->lambda;
|
||||
genln("%Q :: (", decl->name);
|
||||
For(lambda->args) {
|
||||
gen("%Q: %Q, ", it->name, core_type_to_string(it->type));
|
||||
}
|
||||
gen(")");
|
||||
|
||||
// @cleanup @refactor: return value shouldn't be a array of expressions.
|
||||
// It should be a single expression. So probably need a special type
|
||||
// for that.
|
||||
if (lambda->args.len) {
|
||||
gen(": ");
|
||||
For(lambda->args) {
|
||||
gen("%Q ", core_type_to_string(it->type));
|
||||
}
|
||||
}
|
||||
|
||||
iter.skip_children = true;
|
||||
iter.stack.add(decl);
|
||||
if (lambda->scope) iter.stack.add(lambda->scope);
|
||||
global_indent += 1;
|
||||
} break;
|
||||
case AST_LAMBDA + AST_NODE_END: {
|
||||
global_indent -= 1;
|
||||
genln(")");
|
||||
} break;
|
||||
case AST_VAR: {
|
||||
genln("(var %s: ", decl->name.str);
|
||||
auto typespec = (Ast_Atom *)decl->typespec;
|
||||
Ast_Decl *type = typespec->resolved_decl;
|
||||
assert(typespec);
|
||||
gen("%s", type->name.str);
|
||||
genln("%Q: %Q", decl->name, core_type_to_string(decl->type));
|
||||
} break;
|
||||
case AST_VAR + 128: {
|
||||
gen(")");
|
||||
case AST_VAR + AST_NODE_END: {
|
||||
} break;
|
||||
}
|
||||
}
|
||||
String str = string_flatten(pctx->perm, &pctx->gen);
|
||||
printf("%s", str.str);
|
||||
printf("%s\n", str.str);
|
||||
pctx->gen.reset();
|
||||
di += 1;
|
||||
}
|
||||
|
||||
prefixed_string_type = string_fmt(pctx->perm, "%QString", pctx->symbol_prefix);
|
||||
|
||||
Reference in New Issue
Block a user