Result: partial
Files: crates/nikaia-std/src/tools/check_buildtime.nika crates/nikaia-std/src/tools/check_core_expr.nika crates/nikaia-std/src/tools/check_core_pilot.nika crates/nikaia-std/src/tools/check_facts.nika crates/nikaia-std/src/tools/check_function.nika crates/nikaia-std/src/tools/emit_core_flow.nika crates/nikaia-std/src/tools/emit_core_types.nika crates/nikaia-std/src/tools/emit_expr.nika crates/nikaia-std/src/tools/emit_function.nika crates/nikaia-std/src/tools/emit_misc.nika crates/nikaia-std/src/tools/emit_program.nika crates/nikaia-std/src/tools/lowered.rs crates/nikaia-std/src/tools/lowered/check_buildtime.rs crates/nikaia-std/src/tools/lowered/check_core_expr.rs crates/nikaia-std/src/tools/lowered/check_core_pilot.rs crates/nikaia-std/src/tools/lowered/check_facts.rs crates/nikaia-std/src/tools/lowered/check_function.rs crates/nikaia-std/src/tools/lowered/emit_core_flow.rs crates/nikaia-std/src/tools/lowered/emit_core_types.rs crates/nikaia-std/src/tools/lowered/emit_expr.rs crates/nikaia-std/src/tools/lowered/emit_function.rs crates/nikaia-std/src/tools/lowered/emit_misc.rs crates/nikaia-std/src/tools/lowered/emit_program.rs tests/compiler/tests/type_kind_of_each_type.nika tests/compiler/tests/type_kind_of_each_type.stdout tests/compiler/tests/type_kind_kept_at_run_time.nika tests/compiler/tests/type_kind_kept_at_run_time.stderr
Commit: check: T::kind is a meta::Type; T::name (ADR-330 D2, D3, D6, #859 step 3)
Body: A generic function that asks P::kind or P::name is a copy per type, as a shape walk is (walks_fields), now also for types of no shape (i64, Vec[i64], i64?, HashMap, tuples, fn types); such a copy keeps its type parameter (the language below infers it), a struct’s or enum’s copy still substitutes it. The checker records each type’s kind (facts.type_kinds), T::name paths (reflected_names) and kind comparisons (kind_compares); the emitter writes T::name as the type’s text and T::kind == meta::Type::X as true/false per copy. meta::Type is the compiler’s own (no std declaration); only its type-less cases are paths today. A kind anywhere but beside == / != is NK1231. check_specialised spells a type with parts into a Rust name (Vec[i64] -> Vec_i64_).
Part: #859
Pushed: rejected (committed e3a7612a, local develop, not rebased per brief)
Tests: type_kind_of_each_type and type_kind_kept_at_run_time new, both failed on the unfixed compiler (NK1245/NK1171 for T::kind, T::name, User::name), pass now; tests/compiler –both-settings 415 passed; it attributes:: reflection:: qualified_names:: shape_bounds:: specification:: pass, selfhosting_defects 1 red not mine (below); lower-std fixpoint clean; clippy, fmt, pre-push-check clean
Gate: green
Deviation: step 1 not built (stop rule of the brief: parser). Struct, Enum, List, Maybe, Map, Tuple, Fn cannot be printed by name yet: comparing against them needs a type as argument (step 2) or match (step 4); the test prints T::name for each and the decided kind for I64, Text, F64. An integer literal handed to such a function is an i64 copy
Found: step 1 needs a parser change: the form expr.field::member (field.ty::kind, field.ty::name) is a parse error “Expected } here, but found :” (probe: for field in T::fields { let k = field.ty::kind }). Red on develop not from this change: it selfhosting_defects::a_run_and_a_kept_lambda_in_a_statement_differ expects Kept(std::sync::Arc::new(move |x| Box::pin, the emitter now writes Kept(std::sync::Arc::new(move |x| { let __nikaia_future: ...BoxedIn<'_, i64> = Box::pin( (since 5526aa9, #1024)
Needs: owner decision on the parser form expr.field::member for #859 step 1
Changelog: T::kind and T::name exist: a generic function that asks them is written once per type, T::kind == meta::Type::I64 is decided while building, and a meta::Type that would reach the running program is NK1231.
Owner: none
Disk freed: 0 GB; cache target/nikaia-project-tests 1.3G, 25G free on /; new entries over 100 MB: rlib df8bcfe6 267M, rlib af187e66 265M, run-bundle b2db8b4e 286M, build-time-bundle dc4d30d1 484M
Rs2nika: none