尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

graphify跨文件符号解析全解:从import语句到calls边的旅程

graphify跨文件符号解析全解:从import语句到calls边的旅程 graphify跨文件符号解析全解从import语句到calls边的旅程【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphifygraphify是一个把代码库变成知识图谱的开源工具它对代码做本地 AST 解析不依赖 LLM、不用向量库把每个import语句和函数调用解析成图谱里的imports边与calls边。本文带你走一遍 graphify 的跨文件符号解析机制——一条裸调用如何从源码出发最终变成一条带置信度标签的calls边。30秒上手graphify是什么graphify 通过/graphify技能接入 Claude Code、Cursor、Codex、Gemini CLI 等 AI 编程助手。安装只需两条命令uv tool install graphifyy # 安装 CLI或 pipx install graphifyy graphify install # 把技能注册到你的 AI 助手然后在 AI 助手里输入/graphify .得到三个产物graph.html— 浏览器里可点击、可搜索的交互图谱GRAPH_REPORT.md— 高亮报告关键概念、 surprising 连接、建议问题graph.json— 完整图谱随时查询无需重读源码它的第一遍处理Pass 1完全本地运行tree-sitter 解析代码提取类、函数、导入和调用关系不花一分钱 token。整个过程详见 docs/how-it-works.md。旅程第一站import 语句变成图谱的 imports 边代码解析阶段每个文件的import/from ... import ...语句会被确定性提取生成文件级imports/imports_from边置信度直接标记为EXTRACTED源码中明确存在confidence 恒为 1.0。这些边不只是文件依赖记录它们还是后续解析calls边的关键证据——这正是从 import 语句到 calls 边这条旅程的核心线索。旅程第二站裸调用如何被保守解析成 calls 边单文件解析时graphify 先把每个调用点记为raw_calls只记录被调用的名字、调用者和位置先不判断它指向哪个文件。所有文件解析完毕后跨文件解析才开始。核心逻辑在 graphify/symbol_resolution.py 中保守标签索引宁可少连不错连build_label_index 先把所有代码节点建索引标签归一化去括号、去点、转小写且只允许file_type code的节点参与匹配——文档标题恰好和函数同名时绝不会被误认为调用目标。然后 resolve_cross_file_raw_calls 对每个裸调用按规则处理情况处理结果同名候选恰好 1 个直接连线INFERRED边置信度 0.8同名候选多个走消歧优先排除测试目录 mock再看路径邻近度唯一幸存才连线否则跳过成员调用obj.method()跳过交给语言专属解析器—这种保守哲学是 graphify 图谱可信的来源没有把握的连接宁可不建而不是猜一个。import 证据引导把 INFERRED 升级为 EXTRACTED如果调用名来自显式导入解析会更精确。parse_python_import_aliases 会解析文件顶层的from helper import transform as tx形式刻意忽略函数内局部导入——作用域信息不足以安全匹配再结合(模块名, 符号名)二维索引定位目标。命中后resolve_python_import_guided_calls 发出的calls边置信度直接是EXTRACTED1.0——因为 import 语句本身就是白纸黑字的证据。TypeScript/JS 的import { foo }、Kotlin 的 FQN 导入同理导入边越明确calls边越可信。旅程第三站成员调用交给语言专属解析器ClassName.method()这类带接收者的调用裸标签索引无法处理同名方法太多graphify 用注册器模式解决graphify/resolver_registry.py 定义了LanguageResolver名称 文件后缀 解析函数run_language_resolvers 按语料里出现了哪些后缀决定激活哪些解析器且单个解析器出错只记警告、不中断整体构建。在 graphify/extract.py 尾部各语言依次注册自己的一等公民python_member_calls、typescript_member_calls、ruby_member_callsswift_member_calls、csharp_member_calls、java_member_callscpp_member_calls、objc_member_calls、pascal_inherited_calls、kotlin_qualified_calls想为新语言加跨文件解析只需注册一个LanguageResolver不用改动提取主流程——这就是注册器模式的扩展点设计。如何验证解析质量explain 与 path图谱建好后不用读文件直接问图谱真实输出示例$ graphify explain APIRouter Node: APIRouter Source: routing.py L2210 Degree: 47 Connections (47): -- RequestValidationError [uses] [INFERRED] -- __init__.py [imports] [EXTRACTED] $ graphify path FastAPI ModelField Shortest path (3 hops): FastAPI --uses-- DefaultPlaceholder --references-- get_request_handler() --references-- ModelField每条边都带标签你能一眼分清源码里明写的和graphify 推理出来的——这个置信度体系EXTRACTED/INFERRED/AMBIGUOUS三档 离散分数评分标准完整说明见 docs/how-it-works.md。小结一次确定性的符号之旅 阶段做了什么边的置信度AST 提取import 语句 → imports 边EXTRACTED (1.0)import 引导解析导入证据绑定裸调用 → calls 边EXTRACTED (1.0)保守标签解析唯一候选 → calls 边INFERRED (0.8)语言解析器成员调用按类型/框架约定解析视证据而定graphify 的跨文件符号解析没有魔法本地 AST 保证确定性import 证据保证可信度保守原则保证不胡连。最终你得到的是一个每条边都能解释来源的知识图谱——查问题、追调用路径、理解陌生代码库都从这里开始。【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表