4.1 KiB
4.1 KiB
架构设计
整体架构
graph TB
Client["fa:fa-desktop 客户端 (VSCode / Vim / ...)"]
Client -->|"LSP stdio"| Core
subgraph Server["LSP Server (C++23)"]
subgraph Core["Core"]
direction LR
S["Server"] ~~~ D["Dispatcher"] ~~~ A["AsyncExecutor"]
end
subgraph Provider["Provider"]
direction LR
P1["Completion"] ~~~ P2["Definition"] ~~~ P3["CodeAction"] ~~~ P4["..."]
end
subgraph Manager["Manager"]
direction LR
M1["Document"] ~~~ M2["Parser"] ~~~ M3["Symbol"] ~~~ M4["EventBus"]
end
subgraph Language["Language"]
direction LR
L1["AST"] ~~~ L2["Semantic"] ~~~ L3["Symbol"]
end
subgraph Bridge["Bridge"]
direction LR
B1["Glaze"] ~~~ B2["Tree-sitter"] ~~~ B3["Taskflow"] ~~~ B4["spdlog"]
end
Core --> Provider & Manager
Provider --> Manager & Language
Manager --> Language & Bridge
Language --> 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