VB.NET's resolver guessed a receiver call's target from the receiver's
name whenever no class matched it, without any of the guards C# has.
Indexing Structure members (#2345) gave those guesses new targets: 23
SCrawler `xxxFile.Delete()` calls on PersonalUtilities' SFile went to a
nested struct's `TempFileConversion::Delete`, and staxrip's main app
sent 90 calls to its AutoCrop tool's duplicate `ColorHSL`.
- Declared types (new src/resolution/vbnet-receivers.ts): a receiver's
`As` type decides the call (local, parameter, field, property,
`For Each`, `As New`, ...). The candidates are that type's member, one
it inherits, or an extension method written for it. A type from
outside the project gets no link.
- .NET standard method names (`Add`, `Contains`, `Clear`, `Dispose`,
`ToString`, ...) on an untyped receiver need a receiver named after
the owner, as in C#. VB.NET matches them case-insensitively.
- A bare call, or one on `Me`, reaches the enclosing class, what it
inherits, or a Module. A nested type is matched by its bare name only
from inside its owner. Types resolve through enclosing namespaces,
`Imports` (aliases included) and the caller's project. A tie between
equally good guesses goes to the caller's file, then its project, then
the nearer directory, or gets no link.
- vbReceiverOf reads the name at or after the reference's column, so
`Me.Size = New System.Drawing.Size(...)` is read through
`System.Drawing`, not `Me`.
Before/after on main (nodes unchanged): SCrawler 15,092 -> 14,893
edges, staxrip 28,002 -> 26,647. Of the non-containment edges removed,
855 / 2,802 are the same link with new resolver metadata. The rest:
- .NET names on untyped receivers no longer guessed: 196 / 1,378.
731 of staxrip's are StringBuilder `sb.Append` calls that had gone to
`LogBuilder::Append`.
- Other receiver guesses dropped: 86 / 103, including the SFile.Delete
calls.
- Bare calls out of scope: 38 / 834. 590 of staxrip's are
`New Point(...)` that had gone to a class nested in `ButtonEx`; others
are WinForms `Refresh()`, `Focus()` and `Activate()`.
- Retargeted: 227 / 532, e.g. 208 bare `Add(...)` calls in encoder
classes now reach the inherited `CommandLineParams::Add`.
121 / 958 call sites resolve that did not before, e.g. `cms.Add` ->
ContextMenuStripEx and `td.AddButton` -> TaskDialog. Designer -> Size
links fall from 5 / 1 to 0; designer -> Add stays 0.
Known trade-off, shared with C#'s guard: about 31 staxrip calls like
`switches.Join(BR)` that may be the project's own `MiscExtensions`
extension methods are no longer linked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>