Skip to content

fix(hy-emit): resolve foreign MethodZero and nested struct shapes on assignment Place targets - #2131

Merged
limitlessprojects merged 2 commits into
limitlessprojects:mainfrom
RPMFAN:cursor/place-foreign-member-shapes-6c44
Oct 31, 2026
Merged

limitlessprojects merged 2 commits into
limitlessprojects:mainfrom
RPMFAN:cursor/place-foreign-member-shapes-6c44

Conversation

@RPMFAN

@RPMFAN RPMFAN commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

Closes #2128

Summary

Fixes GUARANTEES.md Row 13 BUILDABLE when an assignment target (Place) accesses a foreign stdlib shape (MethodZero or a foreign struct field nested inside a user-defined struct):

  • Added Emitter::type_of_place in compiler/crates/hy-emit/src/stmt.rs mirroring type_of_expr (ForeignTy, var_ty, var_struct + struct_fields, and chained lookup_member shapes).
  • Updated place_member_name to consult lookup_member on self.type_of_place(base) and emit () when MemberKind::MethodZero is returned (e.g., w.header["X-Mode"] = ... -> w.Header()["X-Mode"] = ..., and c.req.host = ... -> c.req.Host = ...).
  • Added regression tests in compiler/crates/hy-emit/tests/place_foreign_member_shapes.rs.

Verification

  • cargo test -p hy-emit: 232 passed, 0 failed.

Payout Wallet (USDC on Base / EVM): 0x26AB46a0309C3ab8F2f59754B3066e77E8154A34

place_member_name only renamed package roots and Foreign bindings, so
MethodZero targets emitted without call parentheses and foreign fields
nested in user structs stayed lowercase. Resolve assignment places
through the same shape table expressions already use.

Co-authored-by: RPMFAN <RPMFAN@users.noreply.github.com>
@limitlessprojects
limitlessprojects merged commit d1d99e1 into limitlessprojects:main Oct 31, 2026
@limitlessprojects

Copy link
Copy Markdown
Owner

Landed — Merge PR #2131 (d1d99e1)

Thank you @RPMFAN — assignment-target member normalization now resolves foreign shapes, including MethodZero and nested user structs.

What landed

hy-emit/src/stmt.rs: place_member_name only handled foreign package roots and Foreign bindings — a place like w.header[k] = v (http.writer MethodZero header) or ctx.req.host (foreign field nested in a user struct) stayed verbatim and go build rejected it.

New type_of_place resolver:

  • Ident: ForeignTy binding or var_ty hitting the SHAPES table.
  • Field: base shape → lookup_member result; or a user-struct field whose declared type hits SHAPES (nested foreign fields).
  • AddrOf recurses; Index yields None.

place_member_name consults it first: Field/Method members emit the Go name; MethodZero emits go() (w.header[k] = v → w.Header()[k] = v); ctx.req.host → ctx.req.Host. Our own struct members stay verbatim. New suite place_foreign_member_shapes.rs.

Verification evidence (pr-2131, merge-gate vs main e2ed94c)

  • merge gate: CLEAN
  • cargo test --workspace: OK — 198 suites (+1: yours)
  • tools/corpus_harness.py: OK — tripwire not fired (130 programs)
  • tools/differential_loop.py --bin $HYB FULL: accept 42/42, reject 88/88 — FULL AGREEMENT (no side-shifts)

Merge

d1d99e1 on main (merge commit carries CREDIT: @RPMFAN). git ls-remote origin main == local HEAD asserted post-push.

Bounty rail

Per BOUNTY.md / discussion #295: eligible for the merged-fix bounty (foreign-shape line).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:land-candidate Shepherd: fresh, gate-clean, verifiable (set from classify()) bot:stale-base Shepherd: behind main beyond threshold

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[buildable] hy-emit: assignment target Place receiver misses foreign MethodZero () and nested struct foreign shapes

3 participants