#include "prepass.h" #include "lib/sym.h" #include "node.h" void prepass_init(prepass_t* prepass, sym_t* sym, tysolver_t* tysolver, err_t* err) { assert(prepass); assert(sym); assert(tysolver); assert(err); prepass->sym = sym; prepass->tysolver = tysolver; prepass->err = err; prepass->scope = 0; } void prepass_free(prepass_t* prepass) { assert(prepass); } void prepass_run(prepass_t* prepass, node_t* node) { assert(prepass); assert(node); switch (node->type) { case NODE_BLOCK: { prepass->scope++; for (size_t i=0; ichildren.size; i++) { node_t* child = (node_t*) node->children.data[i]; prepass_run(prepass, child); } prepass->scope--; } break; case NODE_VARDECL: { char* name = ((node_t*) node->children.data[0])->value.data; node_t* block = node_try_find_parent(node, NODE_BLOCK); prepass_run(prepass, (node_t*) node->children.data[1]); type_t* type = tysolver_try_solve_node(prepass->tysolver, (node_t*) node->children.data[1]); sym_declare(prepass->sym, name, type, prepass->scope, SYM_PRE, block); } break; default: { for (size_t i=0; ichildren.size; i++) { prepass_run(prepass, (node_t*) node->children.data[i]); } } break; } }