4.6 KiB
4.6 KiB
架构设计
整体架构
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
步骤:
- 在
src/provider/下创建新目录 - 继承
ProviderBase基类 - 实现
handle()方法处理请求 - 在
Dispatcher中注册路由
添加新的语义分析
步骤:
- 在
src/language/semantic/添加分析模块 - 定义访问 AST 的逻辑
- 在
SymbolManager中集成
添加新的代码补全类型
步骤:
- 在
src/provider/completion_item/添加新的补全源 - 实现补全逻辑,返回
CompletionItem列表 - 在主 completion provider 中注册
最后更新:2026-02-02