aboutsummaryrefslogtreecommitdiff
path: root/src/compile/expressions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compile/expressions.c')
-rw-r--r--src/compile/expressions.c40
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;