通用技术 分析 diff 上下游调用的工具/想法

williamfzc · 2022年06月09日 · 最后由 伊森 回复于 2022年08月02日 · 6186 次阅读

背景与效果

在研发流程中无论是 code review、MR 基本都绕不开 code diff 的存在,而人眼很难准确评估 diff 的影响规模。

linkediff 可以在无需编译的情况下对你的代码进行解析,指出 diff 的影响范围:

通过脑图可以看到:

  • 对 UTGen.java 发生了三块变更
  • 64-216 行这块影响了 methodsToCases 方法
  • 这个方法调用了近 40 个方法,并被 2 个方法调用

他同时也生成易处理的 JSON 文件便于与其他系统(如 CI)配合。

使用

当前只支持 java 项目。

进入你自己的工程

git clone https://github.com/jacoco/jacoco
cd jacoco

执行分析

通过 docker

docker run --rm -v `pwd`:/usr/src/app williamfzc/linkediff:v0.2.1 linkediff run

常规方式

你需要安装 Python3 及 coca

pip3 install linkediff
linkediff init

你会在你的项目目录下看到 .linkediff.json 配置文件,将其中 coca_cmd 指向 coca 可执行文件 的路径即可。

linkediff run

结果

在运行完成后你可以看到一些结果文件,如 ldresult.json, ldresult.xmind。结合自身需要进一步处理即可。

设计与讨论

智能 diff 功能存在我的 TODO 里很久了,之前的设计是:

  • tree-sitter(这里选型有很多)转 ast graph
  • ast graph -> 更高层级的、通用 graph
  • raw diff 生成
  • 代入 graph 抠出整条调用上下游

而后来偶然发现了 coca ,发现已经将第二步与第四步完成了。所以趁着休息日摸鱼把这个最小可体验版本写(拼)出来了。

这个版本可能只会被用于验证价值与试水,如果有一定使用场景再考虑具体选型与适配。当前版本自由参与,结构也非常简单,欢迎 PR 但请不要花费太多时间。欢迎各类建议。

项目地址

https://github.com/williamfzc/linkediff

共收到 9 条回复 时间 点赞

末尾看到欢迎 PR ,但文章里除了 coca 仓库地址外,没见到这个 linkediff 项目地址,是漏贴了?

陈恒捷 回复

ok 补上啦

太强了

看了下代码,我觉得 coca 的静态分析不太靠谱,不如试试比较成熟的那几个

eryi 回复

成熟指的是哪几个呢,coca 用的就是 antlr4

williamfzc 回复

parser 倒不是关键,静态分析写的太简陋了,这里面 corner case 挺多的。java 领域比较成熟的框架 soot 或者 wala

eryi 回复

这些都要编译且与 java 耦合,场景不太一致

将其中 coca_cmd 指向 coca 可执行文件 的路径即可。
请教下,这里的 coca 可执行文件是指什么文件?如果是自动生成的,是从哪生成的呢?
方便给个样式吗

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册