Polymorphs, recursice typespec tagging
This commit is contained in:
44
core_ast.cpp
44
core_ast.cpp
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user