Polymorphs, recursice typespec tagging

This commit is contained in:
Krzosa Karol
2023-04-01 10:11:12 +02:00
parent 5fb4999ca8
commit db3790016d
4 changed files with 137 additions and 63 deletions

View File

@@ -20,6 +20,39 @@ _ast_new(size_t size, Ast_Kind kind, Token *pos, Ast_Flag flags = 0) {
return result;
}
CORE_Static void
set_flag_typespec(Ast_Expr *expr) {
if (!expr) return;
set_flag(expr->flags, AST_TYPESPEC);
switch (expr->kind) {
case AST_UNARY: {
Ast_Unary *n = (Ast_Unary *)expr;
set_flag_typespec(n->expr);
} break;
case AST_ARRAY: {
Ast_Array *n = (Ast_Array *)expr;
set_flag_typespec(n->base);
set_flag_typespec(n->expr);
} break;
case AST_CALL: {
Ast_Call *n = (Ast_Call *)expr;
For(n->exprs) set_flag_typespec(it);
set_flag_typespec(n->name);
} break;
case AST_CALL_ITEM: {
Ast_Call_Item *n = (Ast_Call_Item *)expr;
set_flag_typespec(n->item);
set_flag_typespec(n->index);
} break;
case AST_IDENT:
break;
invalid_default_case;
}
}
CORE_Static void
propagate_polymorphic(Ast *to, Ast *from) {
if (is_flag_set(from->flags, AST_IDENT_POLYMORPH)) set_flag(to->flags, AST_IDENT_POLYMORPH);
@@ -230,8 +263,11 @@ ast_struct(Token *pos, Ast_Scope *scope, Ast_Kind kind, Array<Ast_Decl *> polymo
AST_NEW(Decl, STRUCT, pos, AST_DECL | AST_AGGREGATE);
result->kind = kind;
result->scope = scope;
result->polymorph_parameters = polymorph_parameters;
if (polymorph_parameters.len) set_flag(result->flags, AST_POLYMORPH);
if (polymorph_parameters.len) {
result->polymorph_parameters = polymorph_parameters;
set_flag(result->flags, AST_POLYMORPH);
result->polymorphs.allocator = pctx->heap;
}
return result;
}
@@ -240,7 +276,7 @@ ast_enum(Token *pos, Ast_Expr *typespec, Ast_Scope *scope) {
AST_NEW(Decl, ENUM, pos, AST_DECL);
result->scope = scope;
result->typespec = typespec;
if (typespec) set_flag(typespec->flags, AST_TYPESPEC);
set_flag_typespec(typespec);
return result;
}
@@ -249,7 +285,7 @@ ast_var(Token *pos, Ast_Expr *typespec, Intern_String name, Ast_Expr *expr) {
AST_NEW(Decl, VAR, pos, AST_DECL);
result->name = name;
result->typespec = typespec;
if (typespec) set_flag(typespec->flags, AST_TYPESPEC);
set_flag_typespec(typespec);
result->expr = expr;
return result;
}