about summary refs log tree commit diff
path: root/boot/transpile.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
committerMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
commit2a893246711442dd8407264c05991b44d1d1f66f (patch)
treea0d4a621994ebb259331b7082a977e4ae2861bde /boot/transpile.c
parentf028bc7ef3101facfa004c21f3aa5feb3dc6f107 (diff)
downloadcatskill-2a893246711442dd8407264c05991b44d1d1f66f.tar.zst
catskill-2a893246711442dd8407264c05991b44d1d1f66f.zip
Emit IR/C increment/decrement in expression position
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/transpile.c')
-rw-r--r--boot/transpile.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/boot/transpile.c b/boot/transpile.c
index d5a718a..0627bcb 100644
--- a/boot/transpile.c
+++ b/boot/transpile.c
@@ -505,6 +505,26 @@ transpile_visit_expression_construct(struct Visit* visit, struct Expression* exp
     TRANSPILE_WRITE("}");
 }
 
+void
+transpile_visit_expression_increment_decrement(struct Visit* visit, struct Expression* expression)
+{
+    TRANSPILE_PREAMBLE
+
+    const ascii* op =
+        expression->value.increment_decrement.operation == INCREMENT_DECREMENT_INCREMENT
+            ? "++"
+            : "--";
+    if (expression->value.increment_decrement.prefix) {
+        TRANSPILE_WRITE("%s", op);
+        transpile_emit_expression(
+            visit, expression->value.increment_decrement.subject, TRANSPILE_PRECEDENCE_UNARY);
+    } else {
+        transpile_emit_expression(
+            visit, expression->value.increment_decrement.subject, TRANSPILE_PRECEDENCE_POSTFIX);
+        TRANSPILE_WRITE("%s", op);
+    }
+}
+
 // statements always emit their own indentation and trailing newline.
 // the dispatcher writes the indentation then routes via normal statement apparatus.
 void
@@ -684,6 +704,7 @@ struct Visit_Table transpile_body_visit_functions = {
     .visit_expression_subscript = transpile_visit_expression_subscript,
     .visit_expression_cast = transpile_visit_expression_cast,
     .visit_expression_construct = transpile_visit_expression_construct,
+    .visit_expression_increment_decrement = transpile_visit_expression_increment_decrement,
 };
 
 // walk a lowered translation unit and emit c source into the transpiler's output.