tsl-devkit/memory-bank/system-patterns.md

78 lines
3.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.

# 系统模式与约束
## 模块边界
### Core / Protocol
- **职责**:处理 stdio 生命周期、LSP 消息路由、协议类型定义与序列化入口
- **输入**:编辑器发来的原始 LSP 请求、通知、初始化参数
- **输出**:分发后的 provider 调用、协议响应和服务端事件
- **不应负责**:语义分析、符号计算、解析缓存管理
### Provider / Manager
- **职责**Provider 负责 capability 级编排;
Manager 负责文档、解析结果、符号等共享状态
- **输入**:已解析的协议请求、文档状态、语言分析结果
- **输出**LSP 返回值、workspace edit、内部状态更新
- **不应负责**:跨层直接操作第三方库细节,或绕过 manager 持久化共享状态
### Language / Bridge
- **职责**Language 负责 AST、语义、符号逻辑
Bridge 负责 Tree-sitter、Glaze、Taskflow、spdlog 等第三方封装
- **输入**:语法树、节点访问请求、共享分析上下文
- **输出**AST 结构、语义结论、符号信息、桥接后的库接口
- **不应负责**LSP 协议路由、编辑器生命周期管理
## 关键数据流
1. 编辑器请求进入 `core/server.cppm`,由 `dispatcher.cppm`
解析 method 并路由到对应 provider
2. Provider 通过 `manager/` 获取文档、语法树和符号状态,
需要深入分析时再调用 `language/` 能力
3. 结果经 `protocol/``codec/` 序列化后返回客户端;
异步任务由 `scheduler/async_executor.cppm` 承载
## 核心不变量
- LSP 线协议必须稳定,能力扩展优先新增 provider 而不是改现有报文结构
- 文档和解析缓存由 manager 统一持有,其他层不各自维护第二份真相
- Tree-sitter 生成物、AST 访问逻辑和测试夹具必须同步演进
- Bridge 模块只做库封装,不夹带 TSL 业务分支
## 常见实现模式
### 新增 LSP 能力
- **适用场景**:新增 `textDocument/*`、`workspace/*`、
`callHierarchy/*` 等协议能力
- **推荐做法**:先补 protocol 类型,再在 `src/provider/`
新增或扩展对应 provider最后在 dispatcher 注册并补测试
- **避免事项**:把协议分发、共享状态和语义逻辑揉进一个模块里
### 调整语法或 AST
- **适用场景**:关键字、表达式、声明、节点结构发生变化
- **推荐做法**:先改 Tree-sitter 与 parser/scanner同步 AST /
semantic / symbol 访问点,再补 `test_tree_sitter`
`test_ast`、相关 provider 测试
- **避免事项**:只改生成物不改测试,或只改 AST 不回溯语法源
## 扩展路径
1. 协议功能扩展优先从 `src/protocol/`、`src/provider/`、
`src/core/dispatcher.cppm` 这一条链路进入
2. 语言分析扩展优先从 `src/language/` 进入,
需要共享缓存时再通过 `src/manager/` 暴露给 provider
## 禁止破坏的约束
- 不破坏现有分层边界,不跨层绕过 manager 直接操作底层解析状态
- 不引入与现有 C++23 Modules 组织方式冲突的头文件式拼装
- 不在 playbook 对齐任务里修改产品 README 或业务实现
---
**最后更新**2026-05-24