Source Insight 式的上游引用图:先把整个工程解析成一份本地索引, 之后每一层展开都在毫秒级返回。不依赖 clangd 或任何语言服务,也不要求工程可编译。
从任意一个符号出发向上追溯:
- 这个函数被谁调用?
- 这个全局变量被谁写坏了?(读写分开标注,可一键只看写入)
- 这个宏在哪些地方展开?
- 改这个结构体会影响谁?
一个符号一个方框,同一符号中的多处引用在框内逐行列出并可分别点击; 点击某一行,编辑器跳过去并选中那一行。
扩展面板搜索 Code Relations 直接安装,或在命令行执行:
code --install-extension yuandixiang.code-relations
这些编辑器使用 Open VSX 市场,本扩展暂未上架,需手动安装:
- 打开扩展市场页面,
点右侧 Download Extension 下载
.vsix文件 - 扩展面板 → 右上角
...→ 从 VSIX 安装… → 选中该文件
装完按提示重载窗口。升级时重复同样步骤即可,会覆盖旧版,已建好的索引不受影响。
- 侧栏打开 Code Relations,点标题栏的生成关系。首次全量扫描,之后只重扫改动过的文件。
- 把光标放到某个符号上(或函数体内任意一行),点刷新。视图只显示根框,不自动展开。
- 鼠标移到框的右边缘 20 px,出现提示符后点击,向右展开一级引用者。
- 点框内某一行跳到该处引用;点标题行跳到符号定义。
视图不跟随光标:跳到源码后根节点、已展开分支、缩放和过滤全部保持不变,直到你再次刷新。
- 图从左向右生长,箭头恒指向被引用符号(画面朝左)。
- 连线只用水平/垂直线段,直角拐角,无曲线。
- 展开热区静止时完全不可见,悬停才出现淡底色与提示符。
- 实线 = 确定引用;虚线 + 行首
?= 同名候选,无法唯一确定。
图区带原生滚动条(右侧与底部),行为与编辑器、终端一致:
| 操作 | 效果 |
|---|---|
| 滚轮 | 上下滚动 |
Shift + 滚轮 |
左右滚动 |
| 拖动滚动条 | 快速定位 |
| 触控板双指 | 任意方向滚动 |
Ctrl / Cmd + 滚轮 |
以指针为中心缩放(40%–250%) |
| 空白处拖动 | 平移 |
| 空白处双击 | 适应窗口 |
默认在工程根的 .code-relations/relations.db:
你的工程/
├── .code-relations/
│ ├── .gitignore 内容为 *,自动生成,忽略自身
│ └── relations.db SQLite 索引库
└── src/ ...
放工程内是为了各工程天然隔离、删工程即删索引、位置一眼可知;目录自带
.gitignore,不需要你往仓库的忽略清单里加东西。Remote SSH / WSL 场景下
它随工程位于远端。
想集中存放(例如统一放到大容量磁盘)就设 codeRelations.index.storagePath,
此时按工作区哈希分子目录。
清理:命令面板执行 Code Relations: 清空关系索引,或直接删掉该目录。
基于 tree-sitter 的语法分析,没有类型信息,因此:
- 成员访问
p->count无法确定p的类型,同名成员只能按候选处理。 - 通过指针的间接写入(
*p = 1、memcpy(&x,…))无法完整捕获,所以"谁写了它"是可能漏的。 - 函数指针与未知宏发起的调用记为不可解析引用点,只在框上计数提示,不产生错误的边。
#ifdef各分支都参与解析,不判断哪一支会被实际编译。- 局部变量默认不索引(可配置开启)。
用起来有问题、结果不对、想要新功能,都欢迎提到 Issues。
报告解析结果不对时,请附上能复现的最小代码片段、符号名,以及
Code Relations: 显示诊断日志 输出的相关片段。
本扩展为专有软件,Copyright (c) 2026 yuandixiang,保留所有权利。
免费授权你在自己的设备上安装使用(含商业性的内部开发),但不授权再分发、
修改、反向工程,或以本扩展为基础发布同类产品。完整条款见扩展安装目录下的
LICENSE 文件,在扩展市场页面也可从「License」一栏查看。
需要超出此范围的授权,请联系作者另行洽谈。
所含第三方组件的版权声明见扩展安装目录下的 THIRD-PARTY-NOTICES.txt。