tsl-devkit/memory-bank/architecture.md

4.6 KiB
Raw Blame History

架构设计

整体架构

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

步骤

  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