36 KiB
transform/ common.hpp facade.hpp/.inl transformer.*
LSP类型定义 类型转换 Position/Range 序列化/反序列化
scheduler/ async_executor.hpp/.cpp 异步任务执行 线程池管理 🔌 PROVIDER LAYER (LSP Handlers) provider/base/ (注册&接口) bootstrap. interface.
核心功能模块: initialize/ text_document/ workspace/ call_hierarchy/
completion_item/ code_action/ code_lens/ ...20+ LSP请求处理器
text_document/ (核心功能) completion.* hover.* definition.* implementation.* did_open.* did_change.*→ Symbol → Symbol → Symbol → Symbol → Document → Document
调用 service/ 层进行实际处理
⚙️ SERVICE LAYER (业务逻辑 + 三区域符号存储) service/symbol/ symbol.hpp/.cpp 符号服务主接口detail/symbol/ symbol_types.hpp PositionKey, RangeKey SymbolSignature
三区域仓库:
system_repo.* ~50KB/文件 系统库轻量索引 workspace_repo.* ~100KB/文件 工作区文件索引 editing_repo.* (?) ~1MB/文件 完整符号表 ⚠️ 需新增! service/parser/ parser.hpp/.cpp• Tree-sitter语法解析 • 增量解析优化 • 触发DocumentParsed事件 • ParseTsfFile() 完整解析
service/document/ document.hpp/.cpp• 文档内容管理 • 版本控制 • OpenDocument() • UpdateDocument()
service/base/ (事件驱动) event_bus.hpp events.hpp bootstrap.*DocumentOpened → Parser → DocumentParsed → Symbol构建
service/utils/ text_coordinates.*• 位置计算 • 行列转换 • 范围处理
🧬 LANGUAGE LAYER (语言语义分析) language/ast/ node_types.hpp AST节点定义(variant) UnitDef, ClassDef, FunctionDef, VarDecl... deserializer.hpp/.cpp TSTree → AST 转换核心数据结构示例: struct UnitDef { std::string name; Location location; std::optional<UsesClause> uses; vector<ASTNode> interface_stmts; vector<ASTNode> impl_stmts; }; using ASTNode = variant< UnitDef, ClassDef, FunctionDef... >;
language/symbol/ symbol.hpp/.cpp 符号类层次 table.hpp/.cpp 符号表 + GlobalTable builder.hpp/.cpp AST → Symbol构建器符号类型体系: Symbol (base) ├─ Variable (变量/参数) ├─ Function (函数 + body_scope) └─ Method (继承Function) ├─ Class (类 + members Table) ├─ Constant (常量) └─ Unit (interface + impl Tables)
完整语义信息 ~1MB/文件
language/keyword/ types.hpp 关键字类型枚举 repo.hpp/.cpp 关键字仓库用途: • 语法验证 (识别保留字) • 补全过滤 (避免建议关键字) • 高亮支持 (提供关键字列表)
示例关键字: begin, end, if, then, else class, function, procedure var, const, type unit, interface, implementation uses, private, public, published
🌳 TREE-SITTER LAYER (C语法解析引擎) tree-sitter/ grammar.json parser.c node-types.json→ 生成CST (Concrete Syntax Tree) → 增量解析 | 错误恢复 | 高性能
⚠️ 红色部分需新增文件
💡 架构要点 1️⃣ 三层数据流: 源代码 → TSTree (tree-sitter) → AST (language/ast) → Symbol (language/symbol) → 索引 (service/symbol) 2️⃣ 三区域存储: SystemRepo(50KB) + WorkspaceRepo(100KB) + EditingRepo(1MB) = 分层节省内存 3️⃣ 事件驱动: Document变化 → Parser解析 → Symbol构建 → Provider响应LSP 4️⃣ 职责分离: Provider处理协议 | Service管理业务 | Language执行语义 | Tree-sitter负责语法事件类型: DocumentOpened, DocumentChanged, DocumentClosed DocumentParsed, SymbolTableBuilt
service/document/ DocumentService (服务类) void OpenDocument(TextDocumentItem) void UpdateDocument(uri, changes) void CloseDocument(uri) TextDocument (实体类) void ApplyChange(change) const string& GetContent() integer GetVersion() 私有成员: TextDocumentItem item_ service/parser/ ParserService (服务类) ParseResult Parse(uri, source) ParseResult ParseIncremental(uri, old_tree) FileSymbolIndex ParseLight(file) ParseResult ParseFull(file) 返回: AST + TSTree + Errors incremental.hpp (可选) • 增量解析优化逻辑 • 变更范围计算 service/symbol/ SymbolService (核心服务) void LoadSystemSymbols(folder) SymbolQueryResult FindSymbol(name, ctx) SymbolQueryResult FindSymbolAt(uri, pos) SymbolResolutionContext BuildContext(uri) types.hpp • PositionKey / RangeKey • SymbolSignature • SymbolQueryResult context.hpp/cpp • 上下文构建 • 可见单元计算 • 可见性规则 service/symbol/repository/ - 三区域符号存储 system_repo.hpp/cpp ~50KB/文件void LoadFromFolder(folder) SymbolSignature FindSymbol(unit, name) SystemSymbolIndex FindUnit(unit) GlobalTable* LoadFullSymbolTable(file)
存储结构: • index_: unit_name → SystemSymbolIndex • global_symbols_: symbol → unit_name 只存 public/published 符号
workspace_repo.hpp/cpp ~100KB/文件void LoadFromFolder(folder) void AddOrUpdate(file, FileSymbolIndex) SymbolSignature FindSymbol(unit, name) vector<string> GetDependencies(file)
存储结构: • files_: file_path → FileSymbolIndex • units_: unit_name → file_path • dependencies_: 依赖图
editing_repo.hpp/cpp ⚠️ 需新增 ~1MB/文件void AddOrUpdate(uri, GlobalTable, AST) Symbol* FindSymbolAt(uri, position) Symbol* FindSymbolByName(uri, name) GlobalTable* GetSymbolTable(uri)
存储结构 (EditingSymbolTable): • symbol_table: 完整 GlobalTable • name_index_: 名称快速查找 • position_index_: 位置快速查找
service/utils/ - 工具类 position.hpp/cpp 位置计算、行列转换、范围处理 conversion.hpp (可选) 类型转换: Position ↔ PositionKey