callgraph

Rust call graph és hatáselemzés AI agenteknek

A callgraph a syn-nel elemzi a .rs fájlokat, és megadja az agentnek a modulokat, structokat, traiteket és impl-blokkokat pontos sortartománnyal, minden hívást kategóriánként, és hogy ki hív egy függvényt a crate-ben — a fájl beolvasása nélkül.

Mit nyer ki a callgraph a Rust-kódból

  • A fájl-modul, az inline mod-ok, a struct-ok, enum-ok, union-ok és trait-ek (a supertraitekkel).
  • Az impl-blokkok metódusai a típusukhoz kerülnek; a trait-implementációk az implements alatt látszanak.
  • Függvények láthatósággal (pub, pub(crate)…), async-kal, paraméterekkel és visszatérési típussal; macro_rules! makrók.
  • Mezők, const / static elemek, típus-aliasok és enum-variánsok.
  • Kilapított use-fák, út- / metódus- / makróhívások, if / match ágak, string-literálok (az attribútumokban is, pl. #[get("/users/{id}")]).

Framework-ismeret: axum, actix-web, tokio…

A framework a fájl fölötti legközelebbi Cargo.toml-ból jön: az első ismert függőség, ebben a sorrendben — bevy, tauri, leptos, dioxus, yew, axum, actix-web, rocket, warp, poem, diesel, sqlx, sea-orm, clap, tokio, async-std, serde. Az ismert framework-crate-ek hívásai framework_use címkét kapnak, a profile pedig felismeri a Rust webes architektúrát.

KategóriaMikor
internal_helpera fájl saját típusai, függvényei és metódusai (self.x(), Self::x())
module_usea crate másik modulja (crate::, super::), modul::fn / Típus::fn alakban
native_ruststd / core / alloc, a prelude és a gyakori std-metódusok
framework_useismert framework-crate (axum, tower, hyper, actix_web, rocket, tokio, serde, clap, diesel, sqlx, bevy…)
package_usemás crate (külső függőség)
macro_useminden makróhívás; a makró nincs kibontva
external_callhelyi változó vagy closure, illetve ismeretlen fogadójú metódus (?::név)

Parancsok

CG=~/.claude/skills/callgraph/callgraph.sh
bash $CG --project myapp src/api/users.rs              # outline: struct/impl/trait, fn-ek sortartománnyal
bash $CG --project myapp src/api/users.rs --format api # pub elemek, az impl-blokkok pub fn-jei is
bash $CG --project myapp src --const MAX_ITEMS         # const / static (Típus::CONST is): definíció + használat

A --const azt is megmutatja, hol adnak tovább egy nevet: a pub use state::{CheckState, STATE_FILE}; például [re-export] state::STATE_FILE sorként jelenik meg.

Ki hívja ezt a Rust-függvényt?

bash $CG --project myapp src --grep 'Repo::find'                # crate-belső: Típus::fn / modul::fn
bash $CG --project myapp src --grep '(^|::|\.|->)find$'         # a név minden hívása
bash $CG --project myapp src --grep 'Repo::find' --depth 3      # a hívók hívói

Az értéken hívott metódusnál (x.load()) a callgraph az egyszerű, megbízható esetekben kikövetkezteti az x típusát: paraméter-típus (x: &Repo, Box / Rc / Arc, extractor, mint a State(s): State<App>), let x = Repo::new(), struct-literál, self, vagy a saját struct mezője (self.repo.load()). Ilyenkor a hívás Repo::load lesz. Ha a típus nem következtethető ki, ?::load marad, és a Repo::load keresés bizonytalanként ezt is listázza — nem esik ki csendben.

Korlátok

  • A makrók nincsenek kibontva: a derive-, attribútum- és függvényszerű makrók által generált kód nem látszik.
  • A típus-következtetés szándékosan egyszerű: a visszatérési típusok és a láncolt hívások (a.b().c()) nem kapnak típust.
  • A cfg-attribútumok nem értékelődnek ki: minden ág bekerül, pl. a #[cfg(test)] mod tests is.
  • Szintaktikai hibás fájlból csak a fájl-container és egy figyelmeztetés készül.
  • A bejáró nem hagyja ki a target/ mappát; a callgraph-ot a src mappára indítsd.