You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
LANG: \Mod::fn(x)\ value call unwired in expression position (\.\-form fixed by #253; \::\ residual) #249
Updated 2026-05-19 — scope narrowed. The originally-reported .-form
is fixed; this issue now tracks only the distinct :: residual.
Fixed (not this issue any more)
use Mod; (or use Mod as M;) + .-qualified value call Mod.fn(x) / M.fn(x) now resolves + typechecks — wired by #253 (merged): the pure
parse-boundary lowering Resolve.lower_qualified_value_paths rewrites ExprField(ExprVar m, fld) → ExprVar fld when m is an ImportSimple
qualifier. Regression-locked by the "E2E Qualified Value #178" suite.
Remaining (this issue)
Mod::fn(x) in expression position is a parse error: :: is
reserved for Type::Variant in expressions, so the ::-qualified value call form never parses (the .-form is what the lowering
handles). ADR-014 makes :: the canonical type/effect separator; the
value-expression :: path is the matching surface gap.
Options: (a) accept Pkg::fn in expression position in the grammar and
fold it into the same lowering; (b) doctrine: .-form is the canonical
value-qualifier surface and :: stays type/effect-only.
changed the title [-]Qualified-value resolution unwired post-#228: `use Mod;` + `Mod.fn(x)` value call fails before codegen[/-][+]LANG: \Mod::fn(x)\ value call unwired in expression position (\.\-form fixed by #253; \::\ residual)[/+]on May 19, 2026
Codegen: emits a bare reference (no JS-side module access required), so the runtime call lands on the imported binding directly.
Remaining adjacent gap (NOT this issue)
Multi-segment qualified value paths like Mod::Sub::fn(x) still parse-error:
pub fn f() -> Int { Mod::Sub::fn(1) } # parse error at col 26
use Mod::Sub; ... # parse error at col 8 (the second ::)
That's the same adjacency tracked in #448 items 2-3 (multi-segment use, brace-list at multi-segment depth), which was closed earlier as a deferred-by-design slice. If multi-segment value paths become a blocker for a real consumer port, file a fresh issue scoped to that specifically.
Separately observed during the probe: math::min_int resolved-error because min_int isn't pub-marked on the current HEAD of stdlib/math.affine. That gap is what affinescript#546 (the pub-mark sweep for io/math/option/result/testing) closes — orthogonal to #249.
Recommendation
Close #249. The single-segment Mod::fn(x) value-call form this issue tracks is fully wired and regression-locked by the "E2E Qualified Value #178" suite.
Closing — verified delivered, and this issue's own thread already recommended it.
The 2026-06-11 comment on this issue is titled "Verification 2026-06-11 — closing recommended" and carries a probe table: use Mod; Mod::fn(x) → Type checking passed; the lowercase-head variant (post-#523) parses and type-checks; end-to-end use math; math::abs(-5) compiles to Deno-ESM and runs. The close was never actioned.
Re-verified today on main:
lib/resolve.ml:975 — lower_qualified_value_paths, the lowering this issue tracks.
Both options the issue weighed were settled in favour of (a) accept Pkg::fn in expression position and fold it into the same lowering — that is what shipped. The .-form was fixed in #253 and the :: residual is now closed with it.
Activity
[-]Qualified-value resolution unwired post-#228: `use Mod;` + `Mod.fn(x)` value call fails before codegen[/-][+]LANG: \Mod::fn(x)\ value call unwired in expression position (\.\-form fixed by #253; \::\ residual)[/+]hyperpolymath commentedon Jun 11, 2026
Verification 2026-06-11 — closing recommended
Re-probed against affinescript HEAD (post-#523):
use Mod; Mod::fn(x)(UpperCase head)Type checking passeduse mod; mod::fn(x)(lowercase head — covered by #523 / #448 item 1)use math; math::abs(-5)+ Deno-ESM compile +deno runconst x = abs(-5);)Int::to_string(n)/String::len(s)(builtin-type qualified)parser.mly)The
::value-call form is wired end-to-end:parser.mly:909INT-01 follow-up):upper_ident COLONCOLON lower_ident → ExprField (ExprVar Mod, lower_ident), plus the builtin-type variants at lines 920-948 and the lowercase-head extension from feat(parser): accept lower_ident head in qualified_type_name (closes #448 item 1) #523.Resolve.lower_qualified_value_paths, INT-01: cross-module WASM import emission (substrate) #178/feat(resolve): INT-01 — wire qualified-value path use Mod; Mod.fn(x) #253): rewritesExprField(ExprVar m, fld) → ExprVar fldwhenmis anImportSimplequalifier — handles both.-form and::-form identically.Remaining adjacent gap (NOT this issue)
Multi-segment qualified value paths like
Mod::Sub::fn(x)still parse-error:That's the same adjacency tracked in #448 items 2-3 (multi-segment
use, brace-list at multi-segment depth), which was closed earlier as a deferred-by-design slice. If multi-segment value paths become a blocker for a real consumer port, file a fresh issue scoped to that specifically.Separately observed during the probe:
math::min_intresolved-error becausemin_intisn'tpub-marked on the current HEAD of stdlib/math.affine. That gap is whataffinescript#546(the pub-mark sweep forio/math/option/result/testing) closes — orthogonal to #249.Recommendation
Close #249. The single-segment
Mod::fn(x)value-call form this issue tracks is fully wired and regression-locked by the "E2E Qualified Value #178" suite.🤖 Cross-estate AS-status sweep on 2026-06-11.
hyperpolymath commentedon Sep 19, 2026
Closing — verified delivered, and this issue's own thread already recommended it.
The 2026-06-11 comment on this issue is titled "Verification 2026-06-11 — closing recommended" and carries a probe table:
use Mod; Mod::fn(x)→ Type checking passed; the lowercase-head variant (post-#523) parses and type-checks; end-to-enduse math; math::abs(-5)compiles to Deno-ESM and runs. The close was never actioned.Re-verified today on
main:lib/resolve.ml:975—lower_qualified_value_paths, the lowering this issue tracks.test/test_e2e.ml— the suite is present and wired: "use Mod; Mod::fn(x) resolves (INT-01: cross-module WASM import emission (substrate) #178 follow-up)" and "use Mod as M; M::fn(x) resolves (INT-01: cross-module WASM import emission (substrate) #178 follow-up)", plustest/e2e/fixtures/cross_caller_qualified_colon.affinecarrying the::form explicitly.Both options the issue weighed were settled in favour of (a) accept
Pkg::fnin expression position and fold it into the same lowering — that is what shipped. The.-form was fixed in #253 and the::residual is now closed with it.