fix(extraction): never fabricate an edge from a call-result receiver (#1748)

A member call whose receiver is itself a call — `d.setdefault(k, []).append(v)`,
`make().run()` — used to drop the receiver at extraction time, degrade to the
bare method name, and exact-match any top-level project symbol of that name
(Python and JavaScript/TypeScript). Keep the inner callee encoded as
`<inner>().<method>` in the TS extractor and native kernel; the name-matcher
refuses to guess for that shape (store-accessor exception only). Based on
#1692, rebased onto main after #1746. Fixes #1683.

Co-authored-by: Colby McHenry <colbymchenry@users.noreply.github.com>
This commit is contained in:
Colby Mchenry
2026-09-08 00:23:08 -05:00
committed by GitHub
co-authored by Colby McHenry
parent bffd50e4f1
commit bb1d3093eb
10 changed files with 226 additions and 3 deletions
@@ -73,3 +73,12 @@ export default {
},
},
};
// --- call-expression receivers (#1683) ----------------------------------------
function bucketChains(d, k, v) {
d.setdefault(k, []).append(v);
make().run();
(0, make)().run();
arr[0]().go();
obj.make().run().again();
}
@@ -47,3 +47,12 @@ def shadowed():
handlers = {"recv": target_cb}
callbacks = [target_cb, view]
# --- call receivers (#1683) ---------------------------------------------------
def bucket_chains(d, k, v):
d.setdefault(k, []).append(v)
d.items().get(k)
make().run()
(lambda: make)()().run()
obj.make().run().again()