# 架构设计 ## 整体架构 ```mermaid graph TB subgraph Clients["编辑器客户端"] VSCode["VSCode Extension"] Vim["Vim Plugin"] Other["其他 IDE"] end VSCode & Vim & Other -->|"LSP (JSON-RPC over stdio)"| Core subgraph Server["LSP Server (C++23)"] subgraph Core["Core Layer"] ServerMain["Server\n主循环"] Dispatcher["Dispatcher\n请求分发"] AsyncExecutor["AsyncExecutor\n异步调度"] ServerMain --- Dispatcher --- AsyncExecutor end subgraph Manager["Manager Layer"] DocumentMgr["Document\nManager"] ParserMgr["Parser\nManager"] SymbolMgr["Symbol\nManager"] EventBus["EventBus"] end subgraph Provider["Provider Layer"] Completion["Completion"] CodeAction["CodeAction"] CodeLens["CodeLens"] Definition["Definition"] InlayHint["InlayHint"] More["..."] end subgraph Language["Language Layer"] AST["AST\n语法树"] Semantic["Semantic\n语义分析"] Symbol["Symbol\n符号表"] end subgraph Bridge["Bridge Layer"] Glaze["Glaze"] Spdlog["spdlog"] Taskflow["Taskflow"] TreeSitter["Tree-sitter"] Win32Stdio["win32_stdio"] end Core --> Manager Core --> Provider Provider --> Manager Provider --> Language Manager --> Language Language --> Bridge Manager --> Bridge end ``` ## 核心模块 ### Core - 核心服务 **职责**:处理 LSP 协议通信,分发请求,管理服务器生命周期 **关键文件**: - `src/core/server.cppm` - 服务器主循环,stdio 读写 - `src/core/dispatcher.cppm` - 请求分发器,路由到对应 Provider ### Manager - 状态管理 **职责**:管理文档、符号、解析结果等核心状态 **关键文件**: - `src/manager/document.cppm` - 文档管理,维护打开的文件内容 - `src/manager/parser.cppm` - 解析管理,维护语法树缓存 - `src/manager/symbol.cppm` - 符号管理,维护符号索引 - `src/manager/event_bus.cppm` - 事件总线,模块间解耦通信 - `src/manager/manager_hub.cppm` - 管理器集线器,统一访问入口 ### Provider - LSP 功能提供者 **职责**:实现具体的 LSP 功能(补全、跳转、悬停等) **关键目录**: - `src/provider/completion_item/` - 代码补全 - `src/provider/code_action/` - 代码操作 - `src/provider/code_lens/` - 代码透镜 - `src/provider/text_document/` - 文档相关 (悬停、跳转定义、引用等) - `src/provider/inlay_hint/` - 内联提示 - `src/provider/document_link/` - 文档链接 - `src/provider/call_hierarchy/` - 调用层次 - `src/provider/type_hierarchy/` - 类型层次 - `src/provider/workspace_symbol/` - 工作区符号搜索 ### Language - 语言分析 **职责**:TSL 语言的语法和语义分析 **关键目录**: - `src/language/ast/` - 抽象语法树访问和遍历 - `src/language/semantic/` - 语义分析 - `src/language/symbol/` - 符号定义和类型 - `src/language/keyword/` - 关键字定义 ### Bridge - 第三方库桥接 **职责**:封装第三方库,提供 C++ Module 接口 **关键文件**: - `src/bridge/glaze.cppm` - JSON 序列化 - `src/bridge/spdlog.cppm` - 日志 - `src/bridge/taskflow.cppm` - 并行任务 - `src/bridge/tree_sitter.cppm` - 语法解析 - `src/bridge/win32_stdio.cppm` - Windows stdio 支持 ### Protocol - LSP 协议 **职责**:定义 LSP 协议的类型和序列化 **关键文件**: - `src/protocol/types.cppm` - 基础类型定义 - `src/protocol/protocol.cppm` - 协议聚合模块 ## 关键约束 - **C++ Modules**:使用 `.cppm` 文件,需要 Clang 20+ 或 GCC 15+ - **异步处理**:所有耗时操作必须通过 `AsyncExecutor` 异步执行 - **增量解析**:使用 Tree-sitter 保证编辑时的响应性能 - **JSON 序列化**:使用 Glaze 库实现零拷贝 JSON 解析 ## 扩展点 ### 添加新的 LSP Provider **步骤**: 1. 在 `src/provider/` 下创建新目录 2. 继承 `ProviderBase` 基类 3. 实现 `handle()` 方法处理请求 4. 在 `Dispatcher` 中注册路由 ### 添加新的语义分析 **步骤**: 1. 在 `src/language/semantic/` 添加分析模块 2. 定义访问 AST 的逻辑 3. 在 `SymbolManager` 中集成 ### 添加新的代码补全类型 **步骤**: 1. 在 `src/provider/completion_item/` 添加新的补全源 2. 实现补全逻辑,返回 `CompletionItem` 列表 3. 在主 completion provider 中注册 --- **最后更新**:2026-02-02