LSP + AST-Grep 工具集成
LSP + AST-Grep 工具集成
学习目标
- 理解 LSP 工具族的 IDE 级操作能力
- 掌握 AST-Grep 的跨语言模式匹配
- 识别 LSP 服务器启动延迟对响应时间的影响
项目实践
LSP 工具族
位于 packages/lsp-tools-mcp/,提供 4 个 LSP 工具:
| 工具 | 功能 | IDE 对应操作 |
|---|---|---|
lsp_rename | 语义级重命名 | Rename Symbol |
lsp_goto_definition | 跳转到定义 | Go to Definition |
lsp_find_references | 查找引用 | Find All References |
lsp_diagnostics | 获取诊断信息 | Problems Panel |
为什么需要 LSP:Agent 修改代码时,字符串替换可能遗漏重载、继承、引用等语义关系。LSP 提供 IDE 级精度,确保重命名和引用分析的正确性。
AST-Grep 集成
位于 packages/ast-grep-core/ 和 packages/ast-grep-mcp/:
- 25 种语言支持:TypeScript、Python、Rust、Go、Java 等
- 模式感知搜索:基于 AST 而非正则,准确匹配代码结构
- 重写能力:模式匹配后批量重写代码
典型用例:
# 查找所有未使用的 importast-grep --pattern 'import $X from $Y' --filter '!has_reference($X)'
# 批量重写 API 调用ast-grep --pattern 'oldApi.$METHOD($ARGS)' --rewrite 'newApi.$METHOD($ARGS)'LSP 与 AST-Grep 的互补
| 维度 | LSP | AST-Grep |
|---|---|---|
| 分析方式 | 语义级(需要语言服务器) | 语法级(AST 解析) |
| 启动时间 | 需要语言服务器启动(数秒到数十秒) | 即时(本地进程) |
| 准确性 | 最高(理解类型、继承、重载) | 高(基于 AST 结构) |
| 语言覆盖 | 依赖语言服务器可用性 | 25 种内置语言 |
| 适用场景 | 精确重命名、跳转定义 | 跨文件搜索、批量重写 |
预构建诊断
在 Agent 编辑前运行 LSP diagnostics,提前发现潜在问题:
- 编辑后自动运行 diagnostics
- 如果引入新错误,提醒 Agent 修复
- 类似 IDE 的实时红线提示
问题与规避
LSP 服务器启动延迟
问题:LSP 服务器启动可能需要数秒到数十秒,阻塞 Agent 的编辑操作。
规避:
- 在插件启动时预启动 LSP 服务器
- 设置启动超时(超过超时时间降级为 AST-Grep)
- 向 Agent 提示 LSP 未就绪时等待或使用 AST-Grep 替代
语言服务器兼容性
问题:不同语言服务器的行为和输出格式不同。
规避:
- LSP 工具层做输出格式归一化
- 定义统一的内部数据模型(如
Location、Diagnostic结构)
设计取舍
LSP + AST-Grep 双工具 vs 单一工具
| 方案 | 优势 | 代价 |
|---|---|---|
| 双工具 | LSP 提供语义精度,AST-Grep 提供速度和覆盖 | 增加两个工具的维护成本 |
| 单一工具 | 简单、资源占用少 | 无法同时满足精度和速度 |
Oh-My-OpenAgent 的选择:双工具并行,LSP 用于精确操作(重命名、跳转),AST-Grep 用于大规模搜索和重写。