其他
当需要了解某函数调用了哪些函数、排查依赖和副作用时,用…
需要分析一个函数的直接被调用函数、依赖、副作用或为新代码库生成依赖文档时,使用 grepai trace callees 查询 callee 列表。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
当需要了解某函数调用了哪些函数、排查依赖特定
解决思路
- 用基础命令查询指定函数调用了哪些函数:`grepai trace callees "FunctionName"`;例如 `grepai trace callees "ProcessOrder"`。
- 读取默认输出:包含 `Mode: fast`、`Function found in: services/order.go:40`、`Found 4 callees`,以及每个 callee 的 `File` 和 `Context`,如 `validateOrder` 在 `services/order.go:45`,上下文为 `validateOrder(order)`。
- 需要结构化结果时加 `--json`:`grepai trace callees "ProcessOrder" --json`;结果包含 `query`、`mode`、`count`、`results`,每个结果含 `file`、`line`、`callee`、`context`。
- 面向 AI 或节省空间时使用紧凑 JSON:`grepai trace callees "ProcessOrder" --json --compact`;字段简写为 `q`、`m`、`c`、`r`,结果项含 `f`、`l`、`fn`。
- 在 v0.26.0+ 使用 TOON 输出:`grepai trace callees "ProcessOrder" --toon`;相比 JSON 约减少 50% token;注意 `--json` 与 `--toon` 互斥。
- 选择快速模式:`grepai trace callees "ProcessOrder" --mode fast`;这是默认模式,速度快、准确度 Good、无额外依赖。
- 选择精确模式:`grepai trace callees "ProcessOrder" --mode precise`;速度稍慢、准确度 Excellent、依赖 tree-sitter。
- 理解复杂函数行为时运行:`grepai trace callees "handleRequest"`;映射数据流时运行:`grepai trace callees "processPayment"`。
- 查找依赖时运行:`grepai trace callees "syncData"` 查看调用了哪些外部服务;`grepai trace callees "saveUser"` 查看发生哪些数据库操作。
- 代码审查时运行:`grepai trace callees "updateProfile"` 查看副作用;`grepai trace callees "doEverything"` 判断函数是否做了太多事(callee 很多是代码坏味道)。
- 生成文档依赖列表时运行:`grepai trace callees "initialize" --json | jq '.results[].callee'`。
- 区分 callers 与 callees:要影响分析、查谁调用我,用 `grepai trace callers "processOrder"`;要行为分析、查我调用了谁,用 `grepai trace callees "processOrder"`。
- 组合分析:对同一函数同时运行 `grepai trace callers "processOrder"` 和 `grepai trace callees "processOrder"`,得到调用关系全貌。
- 按文件类型过滤:`grepai trace callees "main" --json | jq '.results[] | select(.file | endswith(".go"))'`,只保留 `.go` 文件中的 callee。
- 排除测试函数:`grepai trace callees "Login" --json | jq '.results[] | select(.callee | startswith("Test") | not)'`。
- 按类别计数:`grepai trace callees "processOrder" --json | jq '.results[].callee' | grep -c "db"`,统计包含 `db` 的调用数量。
- 认识 callees 包含范围:可找到直接函数调用、方法调用、包函数调用;内置函数调用取决于模式,例如 Go 示例中可找到 `validateOrder`、`Validate`(方法)、`Log`(来自 `utils`)、`Println`(取决于模式)。
- 需要递归依赖分析时,直接 callees 用 `grepai trace callees "main"`;完整依赖树用 `grepai trace graph "main" --depth 3`。
- 脚本列出所有 callee 并去重:`grepai trace callees "main" --json | jq -r '.results[].callee' | sort -u`。
- 脚本检查是否存在特定 callee:`grepai trace callees "processOrder" --json | jq -e '.results[] | select(.callee == "sendEmail")' && echo "Yes" || echo "No"`。
- 生成依赖报告:写 bash 脚本,输出 `# Function Dependencies Report`,循环 `main initialize processOrder`,对每个函数执行 `grepai trace callees "$fn" --json | jq -r '.results[].callee' | sed 's/^/- /'`,并输出 `## $fn` 与列表。
- 处理找不到函数:检查拼写,并确保函数存在于已索引文件中。
- 处理有调用但找不到 callees:尝试 `--mode precise`;检查语言是否在 `enabled_languages`;确保 `symbols.gob` 已更新,可运行 `grepai watch`。
- 处理缺少部分 callees:使用 `--mode precise` 提高准确度。
- 最佳实践:用于理解新代码库。
- 最佳实践:与 callers 组合形成完整依赖图。
- 最佳实践:需要深度分析时用 graph。
- 最佳实践:过滤结果,聚焦相关 callee。
- 最佳实践:记录发现,导出为 Markdown 文档。
- 查看默认输出末尾提示:`Tip: Use 'grepai trace graph ProcessOrder' for recursive analysis`,据此转入递归分析。
适用边界 · 注意事项
- 不适用于静态分析无法可靠捕获的调用:动态/运行时调用、回调和闭包、接口方法调用(可能显示接口而非实现)、基于反射的调用;例如 `func process(fn func()) { fn() }` 中的 `fn()` 无法确定 callee。
- 不适用于直接获取递归完整依赖树;`trace callees` 只列直接 callee,需要递归时改用 `grepai trace graph "main" --depth 3`。
- 不适用于函数未索引、拼写错误、语言未在 `enabled_languages`、`symbols.gob` 未更新或需要具体接口实现分析的场景,否则可能找不到或不完整。