Fixing bugs, prepending all names with context name

This commit is contained in:
Krzosa Karol
2022-06-13 18:07:17 +02:00
parent f9487a2c24
commit 955167ce18
8 changed files with 68 additions and 37 deletions

View File

@@ -18,6 +18,12 @@ gen_line(Ast *node){
genln("#line %d", node->pos->line+1);
}
function void
gen_scope_name(Ast_Scope *scope){
if(scope->parent_scope) gen_scope_name(scope->parent_scope);
if(scope->name.str) gen("%s_", scope->name.str);
}
// @todo: Gen complicated decl
//array 10 ( pointer (pointer array 5 int a))
// int (*(*(a[5])))[10]
@@ -41,7 +47,9 @@ gen_simple_decl_prefix(Ast_Type *ast){
auto name = constant->name;
gen("%s ", name.str);
}break;
default: gen("%s ", name(ast));
default: {
gen("%s ", name(ast));
}
}
}
@@ -62,7 +70,7 @@ gen_simple_decl_postfix(Ast_Type *ast){
}
function void
gen_simple_decl(Ast_Type *ast, Intern_String name = {}){
gen_simple_decl(Ast_Type *ast, Intern_String name = {}, Ast_Scope *scope = 0){
if(ast->kind == TYPE_LAMBDA) {
gen_simple_decl_prefix(ast->func.ret);
gen("(*%s)(", name.str);
@@ -75,6 +83,7 @@ gen_simple_decl(Ast_Type *ast, Intern_String name = {}){
else{
gen_simple_decl_prefix(ast);
if(name.len) {
if(scope) gen_scope_name(scope);
gen("%s", name.str);
}
gen_simple_decl_postfix(ast);
@@ -124,18 +133,18 @@ enum {
};
function void
gen_var(Intern_String name, Ast_Type *type, Ast_Expr *expr, B32 emit_value){
gen_simple_decl(type, name);
gen_var(Ast_Decl *decl, B32 emit_value){
gen_simple_decl(decl->type, decl->name, decl->parent_scope);
if(emit_value == DONT_EMIT_VALUE){
return;
}
if(expr){
if(decl->expr){
gen(" = ");
gen_expr(expr);
gen_expr(decl->expr);
} else { // Default zero
if(is_numeric(type)){
if(is_numeric(decl->type)){
gen(" = 0");
} else {
gen(" = {}");
@@ -145,10 +154,10 @@ gen_var(Intern_String name, Ast_Type *type, Ast_Expr *expr, B32 emit_value){
function void
gen_lambda(Intern_String name, Ast_Lambda *lambda){
gen_simple_decl(lambda->type->func.ret, name);
gen_simple_decl(lambda->type->func.ret, name, lambda->parent_scope);
gen("(");
For(lambda->args){
gen_var(it->name, it->type, 0, DONT_EMIT_VALUE);
gen_var(it, DONT_EMIT_VALUE);
if(&it != (lambda->args.end() - 1)) gen(", ");
}
gen(")");
@@ -163,13 +172,17 @@ function void
gen_expr(Ast_Expr *ast){
switch(ast->kind){
CASE(IDENT, Atom){
gen_scope_name(node->parent_scope);
gen("%s", node->intern_val.str);
BREAK();
}
CASE(VALUE, Atom){
B32 written = gen_value(node->value);
if(!written) gen("%s", node->value.intern_val.str);
if(!written) {
gen_scope_name(node->parent_scope);
gen("%s", node->value.intern_val.str);
}
BREAK();
}
@@ -273,7 +286,7 @@ gen_ast(Ast *ast){
}
CASE(VAR, Decl){
gen_var(node->name, node->type, node->expr, is_inside_struct ? DONT_EMIT_VALUE : ALWAYS_EMIT_VALUE);
gen_var(node, is_inside_struct ? DONT_EMIT_VALUE : ALWAYS_EMIT_VALUE);
if(!is_flag_set(ast->flags, AST_EXPR)) gen(";");
BREAK();
}
@@ -333,7 +346,9 @@ gen_ast(Ast *ast){
}
CASE(STRUCT, Decl){
gen("typedef struct %s{", node->name.str);
gen("typedef struct ");
gen_scope_name(node->parent_scope);
gen("%s{", node->name.str);
global_indent++;
is_inside_struct++;
For(node->scope->decls){
@@ -343,7 +358,9 @@ gen_ast(Ast *ast){
is_inside_struct--;
global_indent--;
genln("}%s;", node->name.str);
genln("}");
gen_scope_name(node->parent_scope);
gen("%s;", node->name.str);
BREAK();
}
@@ -359,10 +376,8 @@ gen_ast(Ast *ast){
global_indent++;
For(node->scope->decls){
genln("%s", it->name.str);
if(it->expr){
gen(" = ");
gen_expr(it->expr);
}
gen(" = ");
gen_value(it->value);
gen(",");
}
global_indent--;
@@ -521,7 +536,7 @@ resolve_everything_in_module(Ast_Module *module){
For_Named(it->decls, jt){
resolve_name(it, jt->pos, jt->name);
if(jt->kind == AST_STRUCT){
type_complete(jt->type);
type_complete(jt->type_val);
}
}
}