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:01:38 +0200
committerMel <mel@rnrd.eu>2026-05-24 20:01:38 +0200
commitf028bc7ef3101facfa004c21f3aa5feb3dc6f107 (patch)
tree3458a0ec69c9552354cb7d3dde38d8f6edd0ad14 /boot/transpile.c
parent99d57398863ab1734a9f81c2d336f82dab556383 (diff)
downloadcatskill-f028bc7ef3101facfa004c21f3aa5feb3dc6f107.tar.zst
catskill-f028bc7ef3101facfa004c21f3aa5feb3dc6f107.zip
Support named-unnamed call and construction arguments and fields with final resolved order
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/transpile.c')
-rw-r--r--boot/transpile.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/boot/transpile.c b/boot/transpile.c
index 9d910b3..d5a718a 100644
--- a/boot/transpile.c
+++ b/boot/transpile.c
@@ -437,12 +437,19 @@ transpile_visit_expression_call(struct Visit* visit, struct Expression* expressi
 
     transpile_emit_expression(visit, expression->value.call.subject, TRANSPILE_PRECEDENCE_POSTFIX);
     TRANSPILE_WRITE("(");
+    Array(struct Call_Argument) args = expression->value.call.arguments;
+    uint max_slot = 0;
+    FOR_EACH_ARRAY (struct Call_Argument, a, &args) {
+        if (a->slot > max_slot) max_slot = a->slot;
+    }
     bool first = true;
-    FOR_EACH_ARRAY (struct Expression*, argument, &expression->value.call.arguments) {
-        if (!first) TRANSPILE_WRITE(", ");
-        // call arguments are comma-separated, each fresh from precedence 0.
-        transpile_emit_expression(visit, *argument, 0);
-        first = false;
+    for (uint s = 0; s <= max_slot; ++s) {
+        FOR_EACH_ARRAY (struct Call_Argument, a, &args) {
+            if (a->slot != s) continue;
+            if (!first) TRANSPILE_WRITE(", ");
+            transpile_emit_expression(visit, a->value, 0);
+            first = false;
+        }
     }
     TRANSPILE_WRITE(")");
 }