diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 3e41a0bc..a4c9d5f9 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -95,6 +95,10 @@ Next (short) - ctx JSON: `{ "caps": { "io|net|env": bool } }` - 例マクロ: `apps/macros/examples/macro_ctx_demo.nyash`(identity、stdoutは使わない) - Docs: guides/macro-system.md にMacroCtx節を追記 + +- Goldens 追加(正規化結果の固定化) + - for_basic / foreach_basic の expanded.json と照合スクリプト + - loop_nonreorder(非整列パス: 代入の後に非代入がある)→ 変換スキップの確認 - LoopForm MVP‑3: break/continue minimal handling (single‑level) - for/foreach pre‑desugaring → LoopForm normalization (limited) - LLVM IR hygiene for LoopForm / If / Match — PHI at block head, no empty PHIs (smoke) diff --git a/apps/tests/macro/loopform/nonreorder.nyash b/apps/tests/macro/loopform/nonreorder.nyash new file mode 100644 index 00000000..d8b1aaed --- /dev/null +++ b/apps/tests/macro/loopform/nonreorder.nyash @@ -0,0 +1,6 @@ +local i = 0 +loop(i < 3) { + i = i + 1 + print(i) +} + diff --git a/tools/test/golden/macro/loop_nonreorder.expanded.json b/tools/test/golden/macro/loop_nonreorder.expanded.json new file mode 100644 index 00000000..f5e2477c --- /dev/null +++ b/tools/test/golden/macro/loop_nonreorder.expanded.json @@ -0,0 +1,8 @@ +{"kind":"Program","statements":[ + {"kind":"Local","variables":["i"],"inits":[{"kind":"Literal","value":{"type":"int","value":0}}]}, + {"kind":"Loop","condition":{"kind":"BinaryOp","op":"<","left":{"kind":"Variable","name":"i"},"right":{"kind":"Literal","value":{"type":"int","value":3}}},"body":[ + {"kind":"Assignment","target":{"kind":"Variable","name":"i"},"value":{"kind":"BinaryOp","op":"+","left":{"kind":"Variable","name":"i"},"right":{"kind":"Literal","value":{"type":"int","value":1}}}}, + {"kind":"Print","expression":{"kind":"Variable","name":"i"}} + ]} +]} + diff --git a/tools/test/golden/macro/loop_nonreorder_user_macro_golden.sh b/tools/test/golden/macro/loop_nonreorder_user_macro_golden.sh new file mode 100644 index 00000000..8bc052de --- /dev/null +++ b/tools/test/golden/macro/loop_nonreorder_user_macro_golden.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "$0")"/../../../.. && pwd) +bin="$root/target/release/nyash" +src="apps/tests/macro/loopform/nonreorder.nyash" +golden="$root/tools/test/golden/macro/loop_nonreorder.expanded.json" + +if [ ! -x "$bin" ]; then + echo "nyash binary not found at $bin; build first (cargo build --release)" >&2 + exit 1 +fi + +normalize_json() { python3 -c 'import sys,json; print(json.dumps(json.loads(sys.stdin.read()), sort_keys=True, separators=(",", ":")))'; } + +out_raw=$("$bin" --dump-expanded-ast-json "$src") +out_norm=$(printf '%s' "$out_raw" | normalize_json) +gold_norm=$(normalize_json < "$golden") + +if [ "$out_norm" != "$gold_norm" ]; then + echo "[FAIL] loop_nonreorder expanded JSON mismatch" >&2 + diff -u <(echo "$out_norm") <(echo "$gold_norm") || true + exit 2 +fi + +echo "[OK] golden loop_nonreorder expansion matched" +