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

3.1 KiB
Raw Blame History

系统模式与约束

模块边界

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_sittertest_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