js-on-sx: spread ... in array literals and call args

Parser: jp-array-loop and jp-call-args-loop detect punct "..."
and emit (js-spread inner).

Transpile: when any element is spread, build array/args via
js-array-spread-build with (list "js-value" v) and (list
"js-spread" xs) tags.

Runtime: js-array-spread-build walks items, appending values or
splicing spreads via js-iterable-to-list (handles list/string/dict).

Works in arrays, call args, variadic fns (Math.max(...arr)),
and string spread ([...'abc']).

414/416 unit (+5), 148/148 slice unchanged.
This commit is contained in:
2026-04-23 22:10:15 +00:00
parent b502b8f58e
commit 4800246b23
5 changed files with 137 additions and 24 deletions

View File

@@ -1059,6 +1059,18 @@ cat > "$TMPFILE" << 'EPOCHS'
(epoch 2401)
(eval "(js-eval \"'abcd'.slice('1', '3')\")")
;; ── Phase 11.spread: ... in arrays and calls ───────────────────
(epoch 2500)
(eval "(js-eval \"var a=[1,2]; var b=[...a,3,4]; b.length\")")
(epoch 2501)
(eval "(js-eval \"var a=[1,2]; var b=[0,...a,3]; b.join(',')\")")
(epoch 2502)
(eval "(js-eval \"function f(a,b,c){ return a+b+c; } var args=[1,2,3]; f(...args)\")")
(epoch 2503)
(eval "(js-eval \"Math.max(...[1,5,3])\")")
(epoch 2504)
(eval "(js-eval \"var a=[...'abc']; a.length\")")
EPOCHS
@@ -1629,6 +1641,13 @@ check 2307 "Array.from w/ map" '"2,4,6"'
check 2400 "charAt coerces string" '"c"'
check 2401 "slice coerces strings" '"bc"'
# ── Phase 11.spread ───────────────────────────────────────────
check 2500 "spread in array length" '4'
check 2501 "spread middle of array" '"0,1,2,3"'
check 2502 "spread in call args" '6'
check 2503 "spread Math.max" '5'
check 2504 "spread string" '3'
TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
echo "$PASS/$TOTAL JS-on-SX tests passed"