Files
ww/lib/ww/asttest.ww
Hojun-Cho 11e41ecea3 lib/ww/ast: nkname if-ladder -> switch (Wave-2 structural)
Fold the 69-arm `if (k == nkind.N_X) return "..."` ladder in nkname to a
single `switch (k)` with the terminal `return "?"` as the fall-past
default. The other ast.ww ladders stay: pr()'s kind dispatch is
side-effecting (emits output, recurses) and uses ||-grouped multi-kind
predicates, not a pure value->value mapping a switch can express.

Not byte-id-neutral (if-chain -> switch dispatch changes the asm), so
the ladder->switch equivalence is pinned by a new table-driven test:
lib/ww/asttest.ww drives nkname over every nkind plus the out-of-band
"?" fallback, wired as 905_nkname_run (same `ww run` @test shape as
904_tok_run). The 990_selfhost wwdump diff only covers kinds that
appear in its corpus.

Regenerates the w6c + wwdump combined.ww amalgamations (nkname region
only).
2026-06-02 22:18:19 +09:00

111 lines
4.7 KiB
Plaintext

// asttest — functional-equivalence pin for [[nkname]] after the
// if-ladder → switch fold (struct fold S2). Run with
// `ww run lib/ww/asttest.ww`.
//
// nkname is checked against every nkind value (the full ladder the
// switch replaced) plus the out-of-band fallback ("?"). A non-zero
// exit pinpoints the failing row (signalled + 10), same convention as
// toktest. `package main` + bare `import ast` mirrors wwdump (the
// external astprint consumer).
package main;
import os;
import ast;
let signalled: i32 = 0;
fn fail() void = { os.exit(signalled + 10); };
fn checkname(k: nkind, want: str) void = {
if (nkname(k) != want) { fail(); };
};
// One row per nkind value — same string the if-ladder returned. The
// final row pins the unknown-kind fallback ("?").
@test fn nkname_cases() void = {
signalled = 100; checkname(nkind.N_NONE, "none");
signalled = 101; checkname(nkind.N_INTLIT, "int");
signalled = 102; checkname(nkind.N_FLOATLIT, "float");
signalled = 103; checkname(nkind.N_STRLIT, "str");
signalled = 104; checkname(nkind.N_RUNELIT, "rune");
signalled = 105; checkname(nkind.N_TRUE, "true");
signalled = 106; checkname(nkind.N_FALSE, "false");
signalled = 107; checkname(nkind.N_NIL, "nil");
signalled = 108; checkname(nkind.N_IDENT, "id");
signalled = 109; checkname(nkind.N_BIN, "bin");
signalled = 110; checkname(nkind.N_UN, "un");
signalled = 111; checkname(nkind.N_CALL, "call");
signalled = 112; checkname(nkind.N_INDEX, "index");
signalled = 113; checkname(nkind.N_DOT, "dot");
signalled = 114; checkname(nkind.N_CAST, "cast");
signalled = 115; checkname(nkind.N_STRUCTLIT, "structlit");
signalled = 116; checkname(nkind.N_ARRLIT, "arrlit");
signalled = 117; checkname(nkind.N_FIELD, "field");
signalled = 118; checkname(nkind.N_ASSIGN, "assign");
signalled = 119; checkname(nkind.N_ALLOC, "alloc");
signalled = 120; checkname(nkind.N_FREE, "free");
signalled = 121; checkname(nkind.N_RECV, "recv");
signalled = 122; checkname(nkind.N_SLICE, "slice");
signalled = 123; checkname(nkind.N_SPREAD, "spread");
signalled = 124; checkname(nkind.N_BLOCK, "block");
signalled = 125; checkname(nkind.N_EXPRSTMT, "exprstmt");
signalled = 126; checkname(nkind.N_LET, "let");
signalled = 127; checkname(nkind.N_RETURN, "return");
signalled = 128; checkname(nkind.N_IF, "if");
signalled = 129; checkname(nkind.N_FOR, "for");
signalled = 130; checkname(nkind.N_FORRANGE, "forrange");
signalled = 131; checkname(nkind.N_DEFER, "defer");
signalled = 132; checkname(nkind.N_BREAK, "break");
signalled = 133; checkname(nkind.N_CONTINUE, "continue");
signalled = 134; checkname(nkind.N_SWITCH, "switch");
signalled = 135; checkname(nkind.N_CASE, "case");
signalled = 136; checkname(nkind.N_FILE, "file");
signalled = 137; checkname(nkind.N_USE, "use");
signalled = 138; checkname(nkind.N_DEF, "def");
signalled = 139; checkname(nkind.N_TYPEDECL, "typedecl");
signalled = 140; checkname(nkind.N_FNDECL, "fn");
signalled = 141; checkname(nkind.N_PARAM, "param");
signalled = 142; checkname(nkind.N_TNAME, "tname");
signalled = 143; checkname(nkind.N_TPTR, "tptr");
signalled = 144; checkname(nkind.N_TSLICE, "tslice");
signalled = 145; checkname(nkind.N_TARRAY, "tarray");
signalled = 146; checkname(nkind.N_TFN, "tfn");
signalled = 147; checkname(nkind.N_TSTRUCT, "tstruct");
signalled = 148; checkname(nkind.N_TFIELD, "tfield");
signalled = 149; checkname(nkind.N_TCHAN, "tchan");
signalled = 150; checkname(nkind.N_ATTR, "attr");
signalled = 151; checkname(nkind.N_TTUPLE, "ttuple");
signalled = 152; checkname(nkind.N_TTAGGED, "ttagged");
signalled = 153; checkname(nkind.N_TUPLE, "tuple");
signalled = 154; checkname(nkind.N_MATCH, "match");
signalled = 155; checkname(nkind.N_MCASE, "mcase");
signalled = 156; checkname(nkind.N_TRYPROP, "tryprop");
signalled = 157; checkname(nkind.N_TRYUNW, "tryunw");
signalled = 158; checkname(nkind.N_MLET, "mlet");
signalled = 159; checkname(nkind.N_MASSIGN, "massign");
signalled = 160; checkname(nkind.N_TYPETEST, "typetest");
signalled = 161; checkname(nkind.N_TYPEASSERT, "typeassert");
signalled = 162; checkname(nkind.N_VOIDLIT, "voidlit");
signalled = 163; checkname(nkind.N_TBANG, "tbang");
signalled = 164; checkname(nkind.N_YIELD, "yield");
signalled = 165; checkname(nkind.N_TENUM, "tenum");
signalled = 166; checkname(nkind.N_TENUMMEMBER, "tenummember");
signalled = 167; checkname(nkind.N_TPARAM, "tparam");
signalled = 168; checkname(nkind.N_LAST, "last");
// Unknown kind → the post-switch fallback. N_LAST is the highest
// named value (68); 69 is out of band, exercising the "?" tail.
signalled = 169; checkname(69: nkind, "?");
};
export fn main() i32 = {
signalled = 1; nkname_cases();
return 0;
};