SIGN IN SIGN UP

fix(csharp): resolve receiver call targets to canonical method nodes (#612)

C# receiver calls (Service.StaticCall(), obj.InstanceCall(),
obj?.ConditionalCall()) were extracted since the member_access fix but
every call target stayed a bare unresolved name: using directives import
namespaces rather than files, so neither the parse-time same-file
resolver nor the graph-wide bare-endpoint resolver had evidence to
qualify them. callers_of only found callers through the unresolved
name-match fallback and get_impact_radius reported zero impacted
nodes/files for the callee's file.

Parser: extract receiver/method for C# invocations (member access,
this.field receivers, conditional access via member binding), track
declared/constructed/parameter/field variable types, and record the
receiver class as extra.receiver_scope on the bare CALLS edge - the
same pattern PHP constructed receivers use (#745). Parse-only output
keeps its bare targets, so single-file parsing behavior is unchanged.

Scoped resolver: extend the post-build Class::method pass to csharp.
receiver_scope-annotated bare targets resolve against Class/method
nodes in the graph; multiple same-named candidates are disambiguated
by call-site file and then by namespace visibility (using directives
plus the caller file's declared namespaces, per #310 metadata).
TESTED_BY mirrors stay aligned via the existing sync. Incremental
updates re-run the pass when .cs files change.

Regression tests build a five-file C# fixture end to end (full_build +
run_post_processing) with decoy same-named classes in an unrelated
namespace, asserting built-graph CALLS targets, callers_of,
get_impact_radius (positive and negative), and tests_for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FmPUotoqsNWWt3b41FMjwv
T
Tirth Kanani committed
09033859aeb08439ca4a8d9006fe6bc37cbb4bc3
Parent: f88f26e