Skip to content

v0.9.75

Latest

Choose a tag to compare

@safishamsi safishamsi released this 04 Oct 01:20

Intra-class call binding across five languages, new language-structure coverage, and a batch of resolution/build/cache fixes.

  • Feature: self/this/super member calls now bind to the caller's own class chain instead of the file-wide last-definition, across Python (self./cls./super(), nearest ancestor in the in-file MRO) (#4011), JavaScript/TypeScript (this.m() to the caller's own class; super.m() fails closed since the extends chain is not known at that pass) (#4012), Swift (self/super, class vs struct/extension aware) (#4030), and Ruby (self-sends within the class chain, complementing the paren-less self-send extraction from 0.9.74) (#4031) — all thanks @Cintu07. Multiple-inheritance ties and unknown/external ancestors fail closed (no fabricated edge).
  • Feature: four more language extractors gained structural coverage from @rajatnagda45 — Zig error-set declarations and their members (case_of) (#4025), PHP enum cases (pure and backed) with case_of edges (#4026), Elixir defmacro/defmacrop/defguard/defguardp definitions (#4027), and Rust macro_rules! definitions with local invocation resolution (std macros like println! fail closed, no fabrication) (#4028).
  • Feature: three Scala type-reference fixes from @Faisal-Fayaz — file-scope val/var type annotations now emit references edges (#4036, #2054), type alias/definition right-hand sides are walked (including opaque type and match types) (#4037, #2049), and context bounds (def f[A: Ordering]) resolve to references edges (#4038, #2046).
  • Feature: single-implementer interface dispatch was lifted into a language-agnostic core (#4034) and reused to dispatch a Swift protocol requirement to its sole conformer (INFERRED), failing closed on 2+ conformers (#4035) — thanks @GAURAV-1313.
  • Feature: Elixir unqualified calls now resolve to functions brought in by import/use, scoped per module and fail-closed when no in-scope module defines the name (fixes a large god-node from corpus-wide bare-name binding) (#4015, thanks @Ayushraj06-bit).
  • Feature: a bash script's invocation of another script through a non-shell interpreter (python3 build.py, node build.js, "$PYTHON" stage.py) is now recorded as an invokes edge; a $VAR/path command word is not mistaken for an interpreter (#4007, thanks @ayushcodes10).
  • Feature: Dart part files keep their own file node linked to the library (#4013, #4008), and a configurable import/export (import 'a.dart' if (...) 'b.dart';) now links every URI branch, not just the default (#4003, #4002) — thanks @brlumen.
  • Fix: C# partial-class merging no longer drops recursive/intra-class calls edges; one split partial class anywhere in a repo used to erase every recursive self-loop graph-wide (#4017, thanks @rohit-jsfreaky).
  • Fix: graphify path (CLI and the MCP shortest_path tool) now routes through a contains edge back out to a symbol's file, so a cross-file dependency that must pass through a shared symbol is found instead of reporting no path (#4004, #3878, thanks @ayushcodes10).
  • Fix: the AST cache rebinds its stat index when a later call names a different cache root, so a multi-project process writes each root's stat-index.json with only its own files instead of pooling them into the first root's file (#4005, #3989, thanks @ayushcodes10).
  • Fix: merge-graphs --previous <merged-graph.json> restores the previous merged community assignment by node id, so cluster/label reuse stays stable across re-merges; a malformed --previous file now errors cleanly instead of crashing (#4006, #3858, thanks @ayushcodes10).
  • Fix: cluster-only/label no longer drop parallel edges (two different relations between the same pair) when reloading and rewriting a graph; preserved links track node-id remaps so none are silently dropped on a legacy graph (#4010, #3999, thanks @ayushcodes10).
  • Fix: the Ollama num_ctx setting is merged into extra_body instead of replacing it, so a GRAPHIFY_DISABLE_THINKING body set on the same backend is no longer silently clobbered (#4029, #3988, thanks @Agnik47).
  • Fix: the hook-guard reminder names the effective graph.json path when GRAPHIFY_OUT is customized, instead of always naming the default graphify-out/graph.json (#4042, #4040, thanks @DeepanshuPal).
  • Fix: graphify extract refuses to overwrite an existing graph with a dedup-shrunk one unless --allow-dedup-shrink is passed; the refusal reports the actual number of nodes dedup merged (#4014, #3774, thanks @SrijanSriv).
  • Feature: extraction warns once when a cleanly-parsed code file yields no symbols beyond its own file node (often a data literal), while staying silent on empty/whitespace-only files, no-extractor languages, and intentionally-skipped data (#4009, #3946, thanks @ayushcodes10).