roza/lib/prepass.c

48 lines
1.0 KiB
C
Raw Normal View History

2023-12-11 17:01:22 +00:00
#include "prepass.h"
#include "node.h"
2023-12-11 17:01:22 +00:00
void prepass_init(prepass_t* prepass,
sym_t* sym,
tysolver_t* tysolver,
err_t* err)
2023-12-11 17:01:22 +00:00
{
assert(prepass);
assert(sym);
assert(tysolver);
2023-12-11 17:01:22 +00:00
assert(err);
prepass->sym = sym;
prepass->tysolver = tysolver;
2023-12-11 17:01:22 +00:00
prepass->err = err;
}
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_VARDECL: {
char* name = ((node_t*) node->children.data[0])->value.data;
prepass_run(prepass, (node_t*) node->children.data[1]);
2023-12-15 21:31:01 +00:00
type_t* type = tysolver_try_solve_node(prepass->tysolver,
(node_t*) node->children.data[1]);
sym_declare(prepass->sym, name, type);
} break;
2023-12-16 18:12:20 +00:00
default: {
2023-12-11 17:01:22 +00:00
for (size_t i=0; i<node->children.size; i++)
{
prepass_run(prepass, (node_t*) node->children.data[i]);
}
} break;
}
}