Correctness release: fixes an affected gap for in-function dynamic imports, stops a Python name-only member-call fabrication, tightens fuzzy dedup, closes a watcher deletion residual, and fixes three Objective-C resolution bugs.
- Fix:
affectednow traverses a dynamicimport('…')made inside a function or at module scope (#2584, thanks @phudayyy). The 0.9.38 dedupe keyed only on the target, so an in-function dynamic import (whose symbol-level edge is anchored on the enclosing function) suppressed the file-level edgeaffectedfollows; the dedupe now keys on the importing file, emitting one file-leveldynamic_importedge per file/target while keeping the call-site edge. - Fix: a Python member call on an untyped receiver (
x.get(...)) no longer binds by name alone to a same-named module-level function, fabricating a false high-confidencecallsedge and a god node (#2417, #2586, thanks @EZZEASY). Such a call is now resolved only with receiver-type, import, orself/cls/superevidence, matching the TypeScript fix from 0.9.37;super().method()still resolves. - Fix: fuzzy dedup no longer over-merges two distinct entities in the same file whose long labels differ by a content word (#2576, thanks @wilyan09007). A one-token difference is judged on the differing tokens rather than the prefix-weighted whole-label similarity, so
asset contribution flowandasset consumption flowstay separate while genuine typo and whitespace/case variants still collapse. - Fix:
graphify watchnow rebuilds on a documentation-only deletion batch instead of only flagging it (#2580, thanks @angmeng), so a deleted doc's nodes are evicted immediately rather than waiting for the next code-file event. (The general deleted-file leak was already fixed in 0.9.10; this closes the live-watcher residual.) - Fix: Objective-C member-call resolution (#2589, #2590, #2591, thanks @xiongjianxu). A
@protocoldeclaration is no longer treated as a receiver type (it collided with a same-named class); a category or class-extension interface (@interface Foo (Bar)) now folds into the base class instead of minting a duplicate node; and a message send to a@propertyor ivar receiver ([self.svc run],[_svc run]) now resolves through the property/ivar's declared type.