NodeDB-Lab/code2graph

GitHub: NodeDB-Lab/code2graph

一个基于 tree-sitter 的多语言代码图谱提取库,将源码转为中立的符号、引用与跨文件边结构化数据,供上层开发者工具自由消费。

Stars: 0 | Forks: 0

# code2graph

源文件 → 结构化事实。

一个与目的无关、与语言无关的代码图谱提取库。它将源代码转换为
符号引用跨文件边(调用、导入……)
形式的纯数据——仅此而已。

快速开始 · 语言 · 解析层级 · 贡献

Join the code2graph Discord

License: Apache-2.0 MSRV 1.85 Edition 2024 Status: pre-0.1

code2graph **不涉及存储策略**且**不涉及产品策略**。它不进行嵌入、评分、排名、持久化或评判。它是一个专注的基础组件——就像 tokenizer 或解析器生成器——许多不同的工具都建立在它之上。消费者决定这些事实的含义: - 一个记忆/RAG 工具将符号映射到嵌入条目以进行检索; - 一个代码库质量分析器应用精度优先的策略来发现偏差和风险; - 一个安全扫描器遍历边以寻找污点路径。 ## 为什么需要单独的库 将代码转化为图谱意味着,针对每种语言:需要进行一次 tree-sitter 遍历、节点类型规范化、限定名称和命名空间约定、签名提取,以及跨文件引用解析。大多数需要代码图谱的工具都会从头开始重新实现这些功能。 code2graph 将这些工作一次性完成,隐藏在中立的输出和稳定的身份方案背后,这样消费者就可以构建自己的层(检索、分析、导航),而无需重做解析。更广泛的生态系统可以共享一个底层基础,而不是许多定制的基础。 ## 何时使用 code2graph **当你在构建一个需要理解代码结构的工具,并且希望自己掌握存储和策略决策时使用它。** code2graph 是一个**低级基础组件**,而不是一个最终产品。如果你的工具需要符号、引用图谱和跨文件边,你有两个选择:从头开始重新实现针对特定语言的 tree-sitter 遍历、与 SCIP 对齐的身份标识和跨文件解析(并在语法漂移时维护所有这些内容),或者依赖 code2graph 并开箱即用地获取中立的事实。 它的存在是为了让其他工具不必各自重建相同的转换层。 **设计上与存储和数据库无关。** code2graph 交给你的是纯数据——`{ symbols, references, edges }`——然后就停止工作。它从不持久化任何内容,对图谱存放在_哪里_也没有任何偏见。把它放在图数据库、向量存储、SQLite、内存索引或平面文件中——由你决定。 大多数代码智能工具都内置了存储引擎,并配有固定在解析器上的查询模型;code2graph 刻意将它们分开,这样你就永远不会受到其他人的持久化或查询策略的限制。 在以下情况下使用它: - 你正在构建开发者工具:代码搜索、针对代码的 RAG、重构、依赖或影响分析、安全扫描——并且不想自己拥有解析层; - 你需要一个代码图谱,但希望**选择你自己的存储、索引和查询引擎**; - 你想要诚实、确定的事实,并且每条边都有明确的 `Confidence`。而不是一个为你评分、排名或持久化的黑盒。 如果你想要一个交钥匙的、包含全套功能的代码智能产品,那么它**不**适合你。Code2graph 是位于其下方的_底层基础_,而不是产品本身。 ## 快速开始 该流水线包含两个纯粹、确定性的阶段: ``` source ──[extract]──▶ FileFacts (symbols + references) ──[resolve]──▶ CodeGraph (symbols + edges) ``` ``` use code2graph::{extract_path, resolve::{Resolver, SymbolTableResolver}}; let a = extract_path("src/util.rs", "pub fn helper() {}")?; let b = extract_path("src/main.rs", "pub fn run() { helper() }")?; let graph = SymbolTableResolver.resolve(&[a, b]); // run --calls--> helper ``` 语言是从文件扩展名推断出来的——不需要任何配置。符号携带的是**字节范围**,而不是源文本;消费者可以根据需要自行切片。 ## 范围 **在范围内:** - 多语言符号**定义**(函数、类型、trait/类、常量、模块等)。 - 带有 `file:line:col` 的**引用**(调用点/使用)。 - 通过将引用解析为定义而构建的**跨文件边**(`calls`、`imports`、`inherits`;稍后会有更丰富的引用类型和数据流)。 - 一个中立的 `CodeGraph` 值:`{ symbols, references, edges }`。 **不在范围内**(属于消费者的责任): - 存储、索引、嵌入、排名、评分。 - 召回优先的启发式方法、检索信号、ACL。 - 文档/Markdown 摄取。code2graph 只处理**代码**。 ## 语言 覆盖范围涵盖系统语言、JVM、脚本语言、Web(包括像 Svelte 这样内嵌的单文件组件,其 `