Correctness release: fixes a callback-scoping regression from 0.9.37, collects Kotlin property-initializer calls, resolves Swift attribute/factory receivers, stops SQL CTE names becoming table refs, and captures nested/module-scope dynamic imports.
- Fix: the 0.9.37 callback-body fix (#2552) no longer lets a local declared in one callback suppress a call in a sibling callback (#2568, thanks @imagineers-tyler). Each callback body's local names are now scoped to that body instead of unioned under the shared declaration, so a real
indirect_callin one sibling closure is no longer dropped because another sibling declared a same-named local. This can only restore dropped edges, never fabricate. - Fix: Kotlin calls in a property initializer are now collected (#2565, thanks @kskchaitanya1993). A class property (
val repo = createRepo()), aby lazy { ... }delegate, a companion-object property, and a top-level property initializer now producecallsedges attributed to the enclosing class (or file), including fully-qualified calls. A plain literal initializer produces no edge. - Fix: Swift receiver-type inference now handles
@Environment(Store.self)properties and factory-initialised bindings (#2561, thanks @fakewaffle). A member call on a receiver typed only through an@Environment(Type.self)attribute, or bound to an in-corpus factory whose return type is known (let x = ServiceFactory.make()), now resolves. Ambiguous or non-concrete returns (opaquesome P, arrays, out-of-corpus) stay unresolved rather than guessing. - Fix: the SQL extractor no longer emits a
reads_fromedge to a CTE name (#2577, thanks @wilyan09007). AWITH cte AS (...)name is scoped to its query and is no longer treated as a table, so it no longer mints a bare stub that could bind to an unrelated same-named symbol; an outer real table sharing a subquery-CTE's name still resolves. - Fix: a dynamic
await import('…')inside a nested function or at module scope now produces an edge (#2575, thanks @phudayyy), anddynamic_importedges are now included inaffected. Calls inside a nested named function are also collected now. A dynamic import already captured as a deferredimports_fromis not double-counted.