diff options
Diffstat (limited to 'types_cgen.c')
-rw-r--r-- | types_cgen.c | 83 |
1 files changed, 0 insertions, 83 deletions
diff --git a/types_cgen.c b/types_cgen.c deleted file mode 100644 index 28db722..0000000 --- a/types_cgen.c +++ /dev/null @@ -1,83 +0,0 @@ -static bool cgen_types_stmt(CGenerator *g, Statement *s); -static bool cgen_types_fn(CGenerator *g, FnExpr *f, Location where) { - bool ret = true; - /* assign an ID to the function */ - if (f->name) { - f->id = f->name->c_fn_reps++; - } else { - f->id = g->anon_fn_count++; - } - - if (!cgen_fn_header(g, f)) return false; - cgen_writeln(g, ";"); - Block *prev_block = g->block; - cgen_block_enter(g, &f->body); - arr_foreach(&f->body.stmts, Statement, s) { - if (!cgen_types_stmt(g, s)) - ret = false; - } - cgen_block_exit(g, prev_block); - return ret; -} - - -static bool cgen_types_expr(CGenerator *g, Expression *e) { - switch (e->kind) { - case EXPR_FN: { - if (e->fn.name && g->block == NULL) { /* write named function prototypes in global scope to header file */ - g->writing_to = CGEN_WRITING_TO_H; - } else { - g->writing_to = CGEN_WRITING_TO_C; - } - if (!cgen_types_fn(g, &e->fn, e->where)) - return false; - g->writing_to = CGEN_WRITING_TO_C; - } break; - case EXPR_CALL: - if (!cgen_types_expr(g, e->call.fn)) - return false; - arr_foreach(&e->call.args, Expression, arg) { - if (!cgen_types_expr(g, arg)) - return false; - } - break; - default: /* TODO */ break; - } - return true; -} - - -static bool cgen_types_stmt(CGenerator *g, Statement *s) { - switch (s->kind) { - case STMT_EXPR: - if (!cgen_types_expr(g, &s->expr)) - return false; - break; - case STMT_DECL: { - Declaration *d = &s->decl; - if ((d->flags & DECL_FLAG_HAS_EXPR) && (d->flags & DECL_FLAG_CONST)) { - /* e.g. foo @= fn() {}; (we want to set the function's name to "foo") */ - if (d->expr.kind == EXPR_FN) { - d->expr.fn.name = *(Identifier*)d->idents.data; - if (ident_eq_str(d->expr.fn.name, "main") && g->block != NULL) { - /* TODO (eventually): Consider just renaming the function */ - err_print(d->where, "main function defined in local scope."); - return false; - } - } - } - return cgen_types_expr(g, &d->expr); - } break; - - } - return true; -} - -static bool cgen_types(CGenerator *g, ParsedFile *f) { - arr_foreach(&f->stmts, Statement, s) { - if (!cgen_types_stmt(g, s)) { - return false; - } - } - return true; -} |