fix(resolution): resolve this.<field>.<method>() on the fields declared type (#1496) (#1792)

Land the six-file fix from upstream PR #1691 by danusha2345
(pr-1691 at 6d0e80d52ae953b22d615bd20c4a4c7758814e60), preserving
wasm/native extraction parity and exclusive field-type resolution.

Preserve coexistence with the #1566 Map/collection fix merged in #1790,
including nested holder.values.get coverage and the unchanged #1566
Unreleased changelog bullet. EXTRACTION_VERSION remains unchanged.

Align the existing chained-receiver regression with the fix: a declared
service field calls its method, while an anonymous field type does not
bind to unrelated same-named project functions.

Verified on Linux with Node 22.19.0:
- Rebuilt the native kernel and TypeScript/browser distribution.
- Both backends change Outbox::send -> Outbox::send into
  Outbox::send -> Mailer::send, keep Relay::forward -> Mailer::send,
  and store no self-edges in the issue repro.
- Wasm: 224 tests passed; native kernel: 255 tests passed, no skips.
- All 10 #1566 resolution cases pass on each backend, plus all four
  nested-receiver extraction parity cases.

Co-authored-by: Colby McHenry <colbymchenry@users.noreply.github.com>
This commit is contained in:
Colby Mchenry
2026-09-08 14:24:04 -05:00
committed by GitHub
co-authored by Colby McHenry
parent de5adba7ea
commit cece0720e3
7 changed files with 287 additions and 1 deletions
@@ -213,6 +213,14 @@ new NS.Widget(makeArg());
new Map<string, number>();
super_weird?.();
// --- call through a field of the enclosing class (#1496) ---------------------
export class FieldDelegator {
constructor(private readonly mailer: { send(m: string): string }, private items: string[]) {}
send(msg: string): string { return this.mailer.send(msg); }
push(msg: string): void { this.items.push(msg); this.mailer.send(msg).trim(); }
direct(): void { this.send('x'); super.toString(); }
}
// --- const-bound functions inside a body (#1669) -----------------------------
export function NestedHandlers({ items, onPick }: { items: string[]; onPick: (a: unknown, b: unknown) => void }) {
const handleClear = () => { onPick(null, null); };