#include "codegen.h" #include extern const struct code_generator unit_generator; extern const struct code_generator block_generator; extern const struct code_generator expr_generator; extern const struct code_generator var_generator; extern const struct code_generator msg_generator; extern const struct code_generator fstring_generator; extern const struct code_generator lambda_generator; static const struct code_generator *code_generators[] = { [CODE_GENERATOR_UNIT] = &unit_generator, [CODE_GENERATOR_BLOCK] = &block_generator, [CODE_GENERATOR_EXPR] = &expr_generator, [CODE_GENERATOR_VAR] = &var_generator, [CODE_GENERATOR_MSG] = &msg_generator, [CODE_GENERATOR_FSTRING] = &fstring_generator, [CODE_GENERATOR_LAMBDA] = &lambda_generator, }; static const size_t nr_code_generators = sizeof code_generators / sizeof code_generators[0]; static const struct code_generator *root_code_generators[] = { [IVY_AST_UNIT] = &unit_generator, [IVY_AST_OP] = &expr_generator, [IVY_AST_INT] = &expr_generator, [IVY_AST_IDENT] = &expr_generator, }; static const size_t nr_root_code_generators = sizeof root_code_generators / sizeof root_code_generators[0]; const struct code_generator *get_code_generator(enum code_generator_type type) { assert(type >= 0 && type < nr_code_generators); return code_generators[type]; } const struct code_generator *get_root_code_generator(enum ivy_ast_node_type type) { if (type >= nr_root_code_generators) { return NULL; } return root_code_generators[type]; }