Skip to content

AtomCode LSP 诊断与诊断工具系统分析

持续深度分析 — Language Server Protocol 集成、实时诊断、LspConfig 2026-06-23


1. LSP 系统架构

1.1 源文件

crates/atomcode-core/src/tool/diagnostics.rs

1.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 服务器启动命令根标记文件
Rustrust-analyzerrust-analyzerCargo.toml
TypeScript/JavaScripttypescript-language-servertypescript-language-server --stdiotsconfig.json, package.json
Pythonpylsppylsppyproject.toml, setup.py
Gogoplsgopls servego.mod
Javajdtlsjdtlspom.xml, build.gradle
Kotlinkotlin-language-server
Scalametalsbuild.sbt
C#csharp-ls / OmniSharp.csproj, solution.sln
Swiftsourcekit-lspPackage.swift
Kotlin同上

3. LSP 协议实现

3.1 支持的 LSP 方法

方法方向说明
textDocument/didOpenclient → server文件打开通知
textDocument/didChangeclient → server文件变更通知
textDocument/publishDiagnosticsserver → client诊断推送
textDocument/completionclient → server自动补全
textDocument/hoverclient → server悬停信息
textDocument/definitionclient → server跳转到定义
textDocument/referencesclient → server查找引用
initializeclient → serverLSP 初始化
initializedclient → server初始化完成通知
shutdownclient → 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: exit

3.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_edit

7.2 DiagnosticsArgs

rust
struct DiagnosticsArgs {
    // 文件路径(可选,省略则运行全量诊断)
    file_path: Option<String>,
    // 过滤级别
    filter: Option<DiagnosticsFilter>,
}

8. 新覆盖的盲区

#之前未覆盖的领域状态发现
1LSP 系统完整架构6 种语言服务器 + 配置文件
2LSP 协议方法实现7+ LSP 方法 + 生命周期
3Diagnostics 工具filter + output + 超时 30s
4LspConfig 结构体auto_detect + diagnostics_settle_delay_ms
5LSP 与 CodeGraph 集成诊断 → 影响范围分析链
6LspServerConfig 字段命令 + 参数 + 根标记

本报告由持续分析循环生成

逆向命令索引

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

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档