src/resolution — 解析層

把「引用」變成「連結」:import、名稱比對、框架模式
檔案:src/resolution/ · import-resolver.ts · name-matcher.ts · frameworks/

大方向

抽取存的是「未解析引用」(unresolved references)。ReferenceResolver 把這些引用解析成真正的邊:function call → 定義、import → 來源檔、class 繼承、以及框架特定模式。它也做 dynamic-dispatch 合成(callback、React re-render、interface→impl)與 chained-call 第二輪(receiver 的 supertype 上的方法)。


1. 解析策略

ReferenceResolver src/resolution/調度三種策略:import → 名稱比對 → 框架模式。
  • import-resolver.ts:import/require → 來源檔;path-aliases.ts 處理 tsconfig path aliases + cargo workspace member globs。
  • name-matcher.ts:依符號名比對(同名定義取決於…見下面 rebind 討論)。
  • frameworks/index.ts 註冊 17 個框架 resolver,產 route 節點 + references 邊。
教學重點:resolver 是「圖譜品質」的所在——cross-file coverage 的高低(95.8% TypeScript、100% Python…)就是 resolver 比 import/名稱多做了多少的證據。
resolveChainedCallsViaConformance / resolveDeferredThisMemberRefs src/resolution/第二輪解析:需要第一輪的 implements/extends 邊。

第一輪建好繼承/實作邊後,第二輪才能解析「receiver 是 protocol-extension / inherited / default-interface 方法」的 chained call(#750),以及「this.<member> callback 註冊指向 supertype 成員」(#808)。順序依賴:必須在第一輪之後

resolveAndPersistBatched src/resolution/分批解析保持記憶體有界;多輪 pass 直到不再改善。

大 repo 的 refs 可能 25 萬條——分批解析、每批持久化、多輪 pass(linking),並在 pool idle 邊界接上 WAL valve 的 backpressure(避免 WAL 在解析期無限成長;實測 4.6GB DB 解析期曾到 22GB WAL)。cooperative-yield.ts 讓解析可以在 daemon 的 liveness-watchdog 執行緒上乖乖讓出。

2. 框架 resolver

frameworks/(17 個) src/resolution/frameworks/Express、Laravel、Rails、FastAPI、Django、Flask、Spring、Gin、Axum、ASP.NET、Vapor、React Router、SvelteKit、Vue/Nuxt、Cargo workspaces…

每個框架一個 resolver,辨識路由寫法並產 route 節點。注意 detect() 在「檔案存在前」就跑一次(createResolver 建在 index 之前),所以 indexAll 在 populate 後會 resolver.initialize() + runPostExtract() 重跑偵測——否則依檔案清單的 detect(UIKit/SwiftUI import 掃描、swift-objc-bridge)會全 return false 靜默棄權。跨檔 finalization(如 NestJS RouterModule prefixes)也在 runPostExtract。

3. 品質:rebind 與 coverage

resurrectStaleResolutionEdges(rebind) src/extraction/(sync 用)修復「沒被 sync 碰到卻該失效」的邊。

長壽索引會 drift:檔案增刪符號時,未變動檔裡指向「舊定義」的引用會留在原地,兩個同名定義的勝負會變成檔案寫入順序問題。codegraph 自己 repo 上:重播 80 個 commit 透過 sync 後,5.7% 的連接是錯的 → 現在 1.3%,且「仍被斷言的錯誤答案」降 99.7%。這就是 docs/benchmarks 之外,sync 品質的核心。詳見 自動同步

4. 本站實測對照

codegraph status 的 Nodes by Kind(節錄)
route           16     ← 框架 resolver 產出的 route 節點
class           206
interface       768
type_alias      540

codegraph 自己的 repo 有 16 個 route 節點——框架偵測在自己身上也在運作。

看完這頁你應該能說出:三種解析策略、chained-call 為何要第二輪、框架 detect 為何要在 populate 後重跑、rebind(#CG-33)修的是哪種 drift、以及 route 節點在 status 上長什麼樣。