diff options
Diffstat (limited to 'src/compile/expressions.c')
| -rw-r--r-- | src/compile/expressions.c | 40 |
1 files changed, 4 insertions, 36 deletions
diff --git a/src/compile/expressions.c b/src/compile/expressions.c index e485e450..404beff2 100644 --- a/src/compile/expressions.c +++ b/src/compile/expressions.c @@ -10,6 +10,7 @@ #include "../typecheck.h" #include "binops.h" #include "blocks.h" +#include "conditionals.h" #include "declarations.h" #include "enums.h" #include "functions.h" @@ -24,6 +25,7 @@ #include "tables.h" #include "text.h" #include "types.h" +#include "whens.h" public Text_t compile_maybe_incref(env_t *env, ast_t *ast, type_t *t) { @@ -320,42 +322,8 @@ Text_t compile(env_t *env, ast_t *ast) { case ExplicitlyTyped: { return compile_to_type(env, Match(ast, ExplicitlyTyped)->ast, get_type(env, ast)); } - case When: { - DeclareMatch(original, ast, When); - ast_t *when_var = WrapAST(ast, Var, .name = "when"); - when_clause_t *new_clauses = NULL; - type_t *subject_t = get_type(env, original->subject); - for (when_clause_t *clause = original->clauses; clause; clause = clause->next) { - type_t *clause_type = get_clause_type(env, subject_t, clause); - if (clause_type->tag == AbortType || clause_type->tag == ReturnType) { - new_clauses = - new (when_clause_t, .pattern = clause->pattern, .body = clause->body, .next = new_clauses); - } else { - ast_t *assign = WrapAST(clause->body, Assign, .targets = new (ast_list_t, .ast = when_var), - .values = new (ast_list_t, .ast = clause->body)); - new_clauses = new (when_clause_t, .pattern = clause->pattern, .body = assign, .next = new_clauses); - } - } - REVERSE_LIST(new_clauses); - ast_t *else_body = original->else_body; - if (else_body) { - type_t *clause_type = get_type(env, else_body); - if (clause_type->tag != AbortType && clause_type->tag != ReturnType) { - else_body = WrapAST(else_body, Assign, .targets = new (ast_list_t, .ast = when_var), - .values = new (ast_list_t, .ast = else_body)); - } - } - - type_t *t = get_type(env, ast); - env_t *when_env = fresh_scope(env); - set_binding(when_env, "when", t, Text("when")); - return Texts("({ ", compile_declaration(t, Text("when")), ";\n", - compile_statement(when_env, WrapAST(ast, When, .subject = original->subject, - .clauses = new_clauses, .else_body = else_body)), - "when; })"); - } - case If: { - } + case When: return compile_when_statement(env, ast); + case If: return compile_if_expression(env, ast); case Reduction: { DeclareMatch(reduction, ast, Reduction); ast_e op = reduction->op; |
