跳转到内容

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 而非正则,准确匹配代码结构
  • 重写能力:模式匹配后批量重写代码

典型用例

# 查找所有未使用的 import
ast-grep --pattern 'import $X from $Y' --filter '!has_reference($X)'
# 批量重写 API 调用
ast-grep --pattern 'oldApi.$METHOD($ARGS)' --rewrite 'newApi.$METHOD($ARGS)'

LSP 与 AST-Grep 的互补

维度LSPAST-Grep
分析方式语义级(需要语言服务器)语法级(AST 解析)
启动时间需要语言服务器启动(数秒到数十秒)即时(本地进程)
准确性最高(理解类型、继承、重载)高(基于 AST 结构)
语言覆盖依赖语言服务器可用性25 种内置语言
适用场景精确重命名、跳转定义跨文件搜索、批量重写

预构建诊断

在 Agent 编辑前运行 LSP diagnostics,提前发现潜在问题:

  • 编辑后自动运行 diagnostics
  • 如果引入新错误,提醒 Agent 修复
  • 类似 IDE 的实时红线提示

问题与规避

LSP 服务器启动延迟

问题:LSP 服务器启动可能需要数秒到数十秒,阻塞 Agent 的编辑操作。

规避

  • 在插件启动时预启动 LSP 服务器
  • 设置启动超时(超过超时时间降级为 AST-Grep)
  • 向 Agent 提示 LSP 未就绪时等待或使用 AST-Grep 替代

语言服务器兼容性

问题:不同语言服务器的行为和输出格式不同。

规避

  • LSP 工具层做输出格式归一化
  • 定义统一的内部数据模型(如 LocationDiagnostic 结构)

设计取舍

LSP + AST-Grep 双工具 vs 单一工具

方案优势代价
双工具LSP 提供语义精度,AST-Grep 提供速度和覆盖增加两个工具的维护成本
单一工具简单、资源占用少无法同时满足精度和速度

Oh-My-OpenAgent 的选择:双工具并行,LSP 用于精确操作(重命名、跳转),AST-Grep 用于大规模搜索和重写。

参考来源