tsl-devkit/memory-bank/architecture.md

153 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构设计
## 整体架构
```mermaid
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
**步骤**
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