Skip to content

affected <Class> misses callers bound to the class's method nodes (post-#1634 granularity) — include member methods as reverse-traversal roots #1669

Description

@krishnateja7

Enhancement request, follow-up to #1634 (verified working on 0.9.6 — this is about query-side traversal, not extraction). Generic across languages, though we hit it from Ruby.

Symptom

#1634 correctly binds Service.call to the def self.call method node when one exists — precise and the right choice. But affected <ClassLabel> traverses only:

Relations: calls, indirect_call, references, imports, imports_from, re_exports, inherits, extends, implements, uses, mixes_in, embeds

method / contains are (correctly, for forward noise reasons) not in that list — which means an inbound caller edge that lands on a method node of a class is unreachable when you query blast radius from the class. The more precisely #1634 binds, the fewer callers class-level affected sees.

Measured scale (our graph, 0.9.6)

  • 365 cross-file calls/references edges target Ruby method nodes.
  • For 89 of them, the caller has no parallel edge to the owning class/module node — those callers are invisible to affected <Class>.
  • That 89 is a lower bound on the general case: we run a Rails-truth sidecar that appends class→class edges for exactly this reason, and the pair-dedup means many would-be-missing pairs are already bridged by it. A stock install would miss more.

Concrete shape: Draft::SnapshotService here has a single inbound references edge on its class node, while callers of its class methods bind at method granularity — affected "SnapshotService" reports one node.

Ask

When the query root is a class/module node, include its member method nodes as additional traversal roots for the reverse direction — i.e., one contains/method hop outward from the root at query time, before the normal relation-filtered walk. That keeps method/contains out of the general traversal (no noise change anywhere else) while making affected <Class> see callers that #1634 binds at method level.

An alternative with the same effect: emit a low-weight rollup edge caller --calls--> Class alongside each caller --calls--> Class#method binding. The query-time hop is probably cleaner (no link inflation).

Environment

graphifyy 0.9.6 (uv tool), macOS, Rails repo as in #1666 (~11.8k nodes / ~19.8k links).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions