v0.24.0 Explicit Value Subjects Review
Status: complete (2026-08-31). This review covers the complete language, compiler, tooling, standard-library, example, and documentation migration for the v0.24.0 import and constant-name contract.
Contract and Authority Review
ExportedEntity::is_selectable_typeis the sole semantic classification for authored selected imports. Declaration lowering and body name resolution consume it; neither carries a duplicate declaration-kind list.- Syntax owns only the
ModuleAliasshape. Top-level lowering and block name resolution bind its identifier to the resolved module identity. Source projection therefore gives hover, navigation, references, rename, and semantic tokens the ordinary module fact instead of an editor-only alias interpretation. - Constant spelling is checked once while declaration names are lowered. Constant evaluation, checking, code generation, and LSP presentation consume the accepted declaration identity and do not repeat the character policy.
- Analysis emits one compiler-owned completion plan: selected imports for types, namespace imports for values, and deterministic aliases for namespace collisions. Code actions consume that label and edit plan; the language server serializes it without rebuilding import semantics.
std/, examples, compiler fixtures, and generated project templates use ordinary v0.24.0 source. There is no compatibility lookup for selected values or lowercase constants.
Findings Closed During Review
- 1. Automatic imports initially suppressed
module.memberwhen an unrelated localmemberwas visible. Type-name collision filtering now applies only to unqualified type candidates, and an end-to-end test preserves the qualified value candidate. - The first selected-value diagnostic reused discovery code
E0263. Top-level non-type selection now ownsE0264, block selection ownsE0349, and namespace-alias re-export ownsE0265. - One parser test still asserted that namespace aliases were invalid. It now tests only the still invalid empty selection; dedicated alias parsing covers top-level, block, and package-root forms.
pub use module as aliasbecame parseable without the retained semantic prohibition. Lowering now rejects it explicitly and has a focused rule test.- One accepted syntax snapshot still described a selected function import and unqualified calls. The fixture and exact syntax-tree snapshot now use the namespace form.
Residue and Failure-Mode Audit
The review searched current public documentation, standard source, examples, compiler fixtures, embedded Nocter programs, diagnostics, parser snapshots, automatic imports, and generated project templates. Remaining selected lowercase names occur only in deliberate rejection tests or parser inputs whose semantic invalidity is the tested boundary. Historical release records were not rewritten as current contracts.
No remaining implementation requires a caller to distinguish value and type declarations itself, guess a namespace alias, preserve an undocumented ordering, or re-run module resolution from source text. Top-level and block imports have separate phase-local diagnostics but consume the same declaration-owned classification.
Qualification
- locked full-workspace tests pass;
- warnings-denied workspace Clippy passes;
- Rust formatting and repository whitespace checks pass;
- all standalone and package examples check offline against an isolated current Nocter home;
- public documentation generation and packaging-manifest validation pass.
No finding with current user impact or an evident near-term failure mode remains.