Replace set_flag_typespec with iterator!
This commit is contained in:
84
core_ast.cpp
84
core_ast.cpp
@@ -1,4 +1,4 @@
|
||||
|
||||
void set_flag_typespec(Ast_Expr *expr);
|
||||
|
||||
#define AST_NEW(T, ikind, ipos, iflags) \
|
||||
Ast_##T *result = allocate_struct(pctx->perm, Ast_##T); \
|
||||
@@ -20,39 +20,6 @@ _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);
|
||||
@@ -450,19 +417,20 @@ struct Ast_Iter {
|
||||
Array<Ast *> stack;
|
||||
Ast *ast;
|
||||
Ast_Kind kind;
|
||||
bool skip_end_blocks;
|
||||
bool skip_children;
|
||||
uint32_t visit_id;
|
||||
uint32_t di;
|
||||
};
|
||||
|
||||
uint32_t Ast_Iter_VisitIDGen;
|
||||
Ast_Iter iterate_depth_first(Allocator *a, Ast *ast) {
|
||||
assert(ast);
|
||||
Ast_Iter iterate_depth_first(Allocator *a, Ast *ast, bool skip_end_blocks = false) {
|
||||
Ast_Iter result = {};
|
||||
result.stack = {a};
|
||||
result.ast = ast;
|
||||
result.kind = ast->kind;
|
||||
if (ast) result.kind = ast->kind;
|
||||
result.visit_id = ++Ast_Iter_VisitIDGen;
|
||||
result.skip_end_blocks = skip_end_blocks;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -478,7 +446,7 @@ void next(Ast_Iter *iter) {
|
||||
switch (iter->kind) {
|
||||
case AST_SCOPE: {
|
||||
Ast_Scope *node = (Ast_Scope *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
For(node->stmts) iter->stack.add(it);
|
||||
For(node->decls) iter->stack.add(it);
|
||||
} break;
|
||||
@@ -493,7 +461,7 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_INDEX: {
|
||||
Ast_Index *node = (Ast_Index *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->index);
|
||||
iter->stack.add(node->expr);
|
||||
assert(node->index);
|
||||
@@ -502,14 +470,14 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_UNARY: {
|
||||
Ast_Unary *node = (Ast_Unary *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
assert(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_BINARY: {
|
||||
Ast_Binary *node = (Ast_Binary *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->right);
|
||||
iter->stack.add(node->left);
|
||||
assert(node->right);
|
||||
@@ -518,7 +486,7 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_CALL_ITEM: {
|
||||
Ast_Call_Item *node = (Ast_Call_Item *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->item);
|
||||
assert(node->item);
|
||||
if (node->call_flags & CALL_INDEX) {
|
||||
@@ -534,7 +502,7 @@ void next(Ast_Iter *iter) {
|
||||
case AST_COMPOUND:
|
||||
case AST_CALL: {
|
||||
Ast_Call *node = (Ast_Call *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
For(node->exprs) iter->stack.add(it);
|
||||
if (node->name) iter->stack.add(node->name);
|
||||
} break;
|
||||
@@ -546,14 +514,14 @@ void next(Ast_Iter *iter) {
|
||||
case AST_RUNTIME_ASSERT:
|
||||
case AST_CONSTANT_ASSERT: {
|
||||
Ast_Builtin *node = (Ast_Builtin *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
assert(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_SWITCH: {
|
||||
Ast_Switch *node = (Ast_Switch *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
if (node->default_scope) iter->stack.add(node->default_scope);
|
||||
For(node->cases) iter->stack.add(it);
|
||||
iter->stack.add(node->value);
|
||||
@@ -562,7 +530,7 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_SWITCH_CASE: {
|
||||
Ast_Switch_Case *node = (Ast_Switch_Case *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
assert(node->scope);
|
||||
For(node->labels) iter->stack.add(it);
|
||||
@@ -570,7 +538,7 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_VAR_UNPACK: {
|
||||
Ast_Var_Unpack *node = (Ast_Var_Unpack *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->expr);
|
||||
assert(node->expr);
|
||||
For(node->vars) iter->stack.add(it);
|
||||
@@ -591,7 +559,7 @@ void next(Ast_Iter *iter) {
|
||||
case AST_VAR: {
|
||||
Ast_Decl *node = (Ast_Decl *)ast;
|
||||
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
if (node->scope) iter->stack.add(node->scope);
|
||||
if (node->expr) iter->stack.add(node->expr);
|
||||
if (node->typespec) iter->stack.add(node->typespec);
|
||||
@@ -602,13 +570,13 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_ARRAY: {
|
||||
Ast_Array *node = (Ast_Array *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
if (node->expr) iter->stack.add(node->expr);
|
||||
} break;
|
||||
|
||||
case AST_FOR: {
|
||||
Ast_For *node = (Ast_For *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
assert(node->scope);
|
||||
if (node->iter) iter->stack.add(node->iter);
|
||||
@@ -618,13 +586,13 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_IF: {
|
||||
Ast_If *node = (Ast_If *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
For(node->ifs) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_IF_NODE: {
|
||||
Ast_If_Node *node = (Ast_If_Node *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
iter->stack.add(node->scope);
|
||||
assert(node->scope);
|
||||
if (node->expr) iter->stack.add(node->expr);
|
||||
@@ -633,13 +601,13 @@ void next(Ast_Iter *iter) {
|
||||
|
||||
case AST_RETURN: {
|
||||
Ast_Return *node = (Ast_Return *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
For(node->expr) iter->stack.add(it);
|
||||
} break;
|
||||
|
||||
case AST_LAMBDA_EXPR: {
|
||||
Ast_Lambda *node = (Ast_Lambda *)ast;
|
||||
iter->stack.add(node);
|
||||
if (!iter->skip_end_blocks) iter->stack.add(node);
|
||||
if (node->scope) iter->stack.add(node->scope);
|
||||
For(node->ret) iter->stack.add(it);
|
||||
For(node->args) iter->stack.add(it);
|
||||
@@ -664,3 +632,11 @@ end_of_switch:
|
||||
iter->kind = (Ast_Kind)((unsigned)iter->kind + AST_NODE_END);
|
||||
}
|
||||
}
|
||||
|
||||
CORE_Static void
|
||||
set_flag_typespec(Ast_Expr *expr) {
|
||||
for (Ast_Iter iter = iterate_depth_first(pctx->heap, expr, true); iter.ast; next(&iter)) {
|
||||
assert(iter.kind == AST_UNARY || iter.kind == AST_ARRAY || iter.kind == AST_CALL || iter.kind == AST_CALL_ITEM || iter.kind == AST_IDENT);
|
||||
set_flag(iter.ast->flags, AST_TYPESPEC);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user