graphify 0.9.101
Resolution-accuracy and cache-correctness release across C++, Rust, Python, Go, the build write guard, and incremental rebuilds.
C++
- A member call
x.m()binds by the receiver's type, now typed from function parameters and class fields and not only locals (void render(Base* b){ b->draw(); }resolves toBase::draw); an untyped or ambiguous receiver keeps its in-file binding (#3215, #4946). - An out-of-line or split-header definition attaches to the unique owner whose class file is in its include set, instead of cross-binding to an unrelated same-named function; ambiguous owners fail closed (#4916, #4920).
- A local callable value (a lambda or
std::function) is kept out of global call resolution by byte-range binding lifetimes, so it no longer mints a spuriousINFERREDcall to a same-named global; a later legitimate global call survives (#4917, #4921). - A type-alias reference (
using Foo = Bar;thenFoo x;) binds by exact spelling and a salted alias keeps its owncontainsedge (#4951).
Rust
- A module-qualified call (
crate::b::helper(),super::m::f()) resolves through qualifier-verified cross-file resolution, staying inside the caller's crate (#2135, #4944). - A call written inside an expression macro's arguments (
println!("{}", f()),vec![g()]) is linked, gated to an allowlist somacro_rules!bodies and custom DSLs are left alone (#4945).
Python / Go
- A bare call inside a method no longer self-binds to a same-named method; it resolves to the imported or module-level function it names (#4933).
- Imports resolve across PEP 420 namespace packages split over multiple
src/roots (#4929). - A Go method value reached through a receiver field is linked as an
indirect_call(#1566, #4931). - A Go package-level
varinitialiser references the types it names (#2360, #4932).
Build / cache / rebuild / watch
- The write guard no longer refuses a healthy graph when entity dedup folds a saved node into a surviving twin; a genuine loss is still refused (#4940, #4952).
- Independently sourced semantic file evidence survives a fold into an AST file-self node; ordinary
INFERREDmention ghosts still fold so graphs do not accumulate duplicates (#4896, #4927). - The file-stem alias index only rebinds an edge when the edge's file and the alias target share a language family (#4949).
- Cache keys keep their written case so
README.mdandreadme.mdno longer collide, and hashed/word-count files are opened throughos_long_path(#4925, #4937). - A
--code-onlygraph stays code-only across hook,updateand watch rebuilds (#4923, #4939). - A rebuild no longer waits forever when
msvcrt.lockingis unsupported (#4924, #4926). - A full reconcile evicts source records for an excluded linked git worktree (#4919).
- AST-only updates preserve cross-file semantic evidence whose node id collides with a code definition (#4950).
- A sliced file is cached only once every slice has succeeded and is assembled in chunk order (#4943, #4947).
The AST cache schema is bumped to 36; warm caches re-run the affected extractions.
Thanks to @nothariharan, @Deepjyoti-Sarmah, @azizur100389, @andrebrait, @ayushcodes10, @madhusudanpatnaik, @Ethan-Ethan-Ethan and @AndresDiagoM.