AtomCode LSP 诊断与诊断工具系统分析
持续深度分析 — Language Server Protocol 集成、实时诊断、LspConfig 2026-06-23
1. LSP 系统架构
1.1 源文件
crates/atomcode-core/src/tool/diagnostics.rs1.2 LSP 配置结构体
rust
struct LspConfig {
auto_detect: bool, // 自动检测 LSP 服务器
diagnostics_settle_delay_ms: u64, // 诊断结果稳定等待时间(毫秒)
}
struct LspServerConfig { // 3 个字段
// LSP 服务器配置
root_markers: Vec<String>, // 项目根标记文件
}
struct DiagnosticsArgs {
// 工具参数
}2. 支持的 LSP 服务器
| 语言 | LSP 服务器 | 启动命令 | 根标记文件 |
|---|---|---|---|
| Rust | rust-analyzer | rust-analyzer | Cargo.toml |
| TypeScript/JavaScript | typescript-language-server | typescript-language-server --stdio | tsconfig.json, package.json |
| Python | pylsp | pylsp | pyproject.toml, setup.py |
| Go | gopls | gopls serve | go.mod |
| Java | jdtls | jdtls | pom.xml, build.gradle |
| Kotlin | kotlin-language-server | — | — |
| Scala | metals | — | build.sbt |
| C# | csharp-ls / OmniSharp | — | .csproj, solution.sln |
| Swift | sourcekit-lsp | — | Package.swift |
| Kotlin | 同上 | — | — |
3. LSP 协议实现
3.1 支持的 LSP 方法
| 方法 | 方向 | 说明 |
|---|---|---|
textDocument/didOpen | client → server | 文件打开通知 |
textDocument/didChange | client → server | 文件变更通知 |
textDocument/publishDiagnostics | server → client | 诊断推送 |
textDocument/completion | client → server | 自动补全 |
textDocument/hover | client → server | 悬停信息 |
textDocument/definition | client → server | 跳转到定义 |
textDocument/references | client → server | 查找引用 |
initialize | client → server | LSP 初始化 |
initialized | client → server | 初始化完成通知 |
shutdown | client → server | 关闭 LSP |
3.2 LSP 生命周期
1. 初始化阶段
client → server: initialize (processId, rootUri, capabilities)
server → client: InitializeResult (serverInfo, capabilities)
2. 初始化完成
client → server: initialized (空通知)
3. 工作阶段
client → server: textDocument/didOpen (文件打开时)
client → server: textDocument/didChange (文件变更时)
server → client: textDocument/publishDiagnostics (诊断推送)
4. 关闭
client → server: shutdown
client → server: exit3.3 超时控制
LSP request timed out after 30s // 30秒超时
LSP response channel closed // 通道关闭4. 诊断工具(tool/diagnostics)
4.1 命令接口
/diagnostics → 运行诊断
/diagnostics <file> → 指定文件诊断
/diagnostics --all → 全量诊断4.2 过滤器
Filter level:
- error (默认,仅错误)
- warning (错误 + 警告)
- all (所有诊断信息)4.3 输出格式
Get real-time compiler/linter diagnostics from the Language Server.
Returns type errors, missing imports, and other issues without
running a full build. Optionally filter by file path and severity.
输出:
- 文件路径
- 行号 + 列号
- 严重级别 (error/warning/info/hint)
- 消息内容
- 相关错误代码
无诊断时:
"No diagnostics found"4.4 集成到代码图
diagnostics 输出可被 CodeGraph 工具消费:
- blast_radius → 分析变更影响范围
- file_dependencies → 文件依赖关系
- trace_callers → 调用链追踪5. LSP 配置
5.1 Config 中 LspConfig 字段
toml
[lsp]
# auto_detect = true # 自动检测 LSP 服务器
# diagnostics_settle_delay_ms = 500 # 诊断稳定化延迟(ms)5.2 LspServerConfig 字段
rust
struct LspServerConfig {
// 3 个字段,包括:
command: String, // LSP 服务器命令
args: Vec<String>, // 启动参数
root_markers: Vec<String>, // 根目录标记文件
}6. 兼容性控制
当 LSP 不可用时:
"LSP not available. No language servers are configured or enabled."
LSP 配置通过:
- config.toml 的 [lsp] 节
- 自动检测(auto_detect)7. 代码分析工具链
7.1 工具间关系
diagnostics (LSP 实时诊断)
│
├──▶ code_graph (代码图)
│ ├── blast_radius (影响范围)
│ ├── file_dependencies (文件依赖)
│ ├── trace_callers (调用者链)
│ └── trace_callees (被调用者链)
│
└──▶ 编辑工具
├── edit_file
├── search_replace
└── parallel_edit7.2 DiagnosticsArgs
rust
struct DiagnosticsArgs {
// 文件路径(可选,省略则运行全量诊断)
file_path: Option<String>,
// 过滤级别
filter: Option<DiagnosticsFilter>,
}8. 新覆盖的盲区
| # | 之前未覆盖的领域 | 状态 | 发现 |
|---|---|---|---|
| 1 | LSP 系统完整架构 | ✅ | 6 种语言服务器 + 配置文件 |
| 2 | LSP 协议方法实现 | ✅ | 7+ LSP 方法 + 生命周期 |
| 3 | Diagnostics 工具 | ✅ | filter + output + 超时 30s |
| 4 | LspConfig 结构体 | ✅ | auto_detect + diagnostics_settle_delay_ms |
| 5 | LSP 与 CodeGraph 集成 | ✅ | 诊断 → 影响范围分析链 |
| 6 | LspServerConfig 字段 | ✅ | 命令 + 参数 + 根标记 |
本报告由持续分析循环生成
逆向命令索引
bash
# 提取 LSP 相关结构体
strings atomcode.bin.bak | grep -E "LspConfig|LspServerConfig|auto_detect|diagnostics_settle" | sort -u
# 提取 LSP 源文件
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/lsp/" | sort -u
# 输出: client.rs jsonrpc.rs manager.rs
# 提取 JSON-RPC 结构体
strings atomcode.bin.bak | grep -E "struct JsonRpcResponse|struct JsonRpcError" | sort -u