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