第 9 讲:LSP 语言服务器集成

OpenCode 源码解析 · 第 9 讲

OpenCode 源码解析 第 9 讲:LSP 语言服务器集成 基于 dev 分支源码 · 2026-07-15 一、LSP:AI 编程助手的核心基础设施 前八讲我们覆盖了 OpenCode 从 CLI 入口到 ACP 协议的核心路径。这一讲进入 LSP 语言服务器集成 ——OpenCode 如何构建多语言、多服务器、自动发现的 LSP 集成层,让 AI 拥有 IDE 级别的代码理解能力。 📦 本讲核心文件 packages/opencode/src/lsp/lsp.ts (507 行)— LSP 服务层 packages/opencode/src/lsp/client.ts (650 行)— JSON-RPC 客户端 packages/opencode/src/lsp/server.ts (1983 行)— 15+ 语言服务器注册表 packages/opencode/src/lsp/launch.ts (295 行)— 服务器启动器 二、三层 LSP 架构 OpenCode 的 LSP 模块采用精妙的 三层设计 ——Service 层管理客户端生命周期,Client 层处理 JSON-RPC 通信,Server 层维护 15+ 语言服务器的注册和自动发现。 1. LSP Service 接口 📄 lsp/lsp.ts (第 58-100 行) export interface Interface { readonly init: () => Effect.Effect<void> readonly status: () => Effect.Effect<Status[]> readonly hasClients: (file: string) => Effect.Effect<boolean> readonly definition: (file: string, position: Position) => Effect.Effect<Location[]> readonly references: (file: string, position: Position) => Effect.Effect<Location[]> readonly typeDefinition: (file: string, position: Position) => Effect.Effect<Location[]> readonly implementation: (file: string, position: Position) => Effect.Effect<Location[]> readonly documentSymbol: (file: string) => Effect.Effect<DocumentSymbol[]> readonly workspaceSymbol: (query: string) => Effect.Effect<Symbol[]> readonly hover: (file: string, position: Position) => Effect.Effect<HoverContent> readonly signatureHelp: (file: string, position: Position) => Effect.Effect<SignatureHelp> readonly codeAction: (file: string, range: Range) => Effect.Effect<CodeAction[]> readonly formatting: (file: string) => Effect.Effect<TextEdit[]> } 设计亮点: 13 个公开方法覆盖了 LSP 协议的核心能力——定义跳转、引用查找、类型定义、文档符号、工作区符号、悬停提示、签名帮助、代码操作和格式化。所有方法返回 Effect.Effect ,支持异步组合和错误处理。 2. LSP Client:JSON-RPC 通信层 client.ts (650 行)实现了完整的 JSON-RPC 客户端,处理握手协议、消息编解码和诊断聚合。 📄 lsp/client.ts (第 45-90 行) cla…

阅读全文:OpenCode 源码解析 第 9 讲