Accessing constant values in structs

This commit is contained in:
Krzosa Karol
2022-05-31 13:27:21 +02:00
parent 437a776d78
commit 1168965ba4
4 changed files with 64 additions and 15 deletions

View File

@@ -78,7 +78,20 @@ function void
gen_expr(Ast_Expr *ast){
switch(ast->kind){
CASE(IDENT, Atom){
gen("%s", node->intern_val.str);
Sym *sym = resolved_get(node);
if(sym){
if(sym->kind == SYM_CONST){
if(sym->type == type_int){
gen("%lld", sym->int_val);
}
else if(sym->type == type_string){
gen("LIT(\"%s\")", sym->intern_val.str);
}
else gen("%s", node->intern_val.str);
}
else gen("%s", node->intern_val.str);
}
else gen("%s", node->intern_val.str);
BREAK();
}
@@ -305,13 +318,10 @@ gen_ast(Ast *ast){
}
}
else if(sym->type == type_int){
gen("enum { %s = %lld };", node->name.str, sym->int_val);
gen("// constant int %s = %lld;", node->name.str, sym->int_val);
}
else if(sym->type == type_string){
gen("String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
}
else if(sym->type->kind == TYPE_ENUM){
gen("enum { %s = %lld };", node->name.str, sym->int_val);
gen("// String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
}
else if(sym->type == type_type){
if(sym->type_val->kind == TYPE_STRUCT){
@@ -339,7 +349,7 @@ gen_ast(Ast *ast){
Ast_Enum *enu = (Ast_Enum *)sym->type_val->ast;
assert(enu->kind == AST_ENUM);
if(node->value->kind == AST_ENUM){
gen("enum %s{", node->name.str);
gen("/*enum %s{", node->name.str);
// @todo add typespec
global_indent++;
For(enu->members){
@@ -350,7 +360,7 @@ gen_ast(Ast *ast){
gen(",");
}
global_indent--;
genln("};");
genln("};*/");
}
else{
// Type alias