Why building a Rust LSP is hard
2 days ago
- LSP需要在快速提供有用答案与完整索引之间取得平衡,接受部分信息。
- Rust LSP中的索引涉及多个层次:解析、项目树构建、定义映射、宏展开和主体分析。
- Rust-analyzer使用salsa增量数据库,而Rust Glancer采用急切索引并利用文件系统卸载状态。
- LSP必须处理错误/不完整的代码,利用CST和创造性解析来建议修复和补全。
- 光标分析有所不同:rust-analyzer使用语法树匹配,Rust Glancer使用基于范围的完整语义分析。
- 补全需要上下文感知的猜测,例如在点或'::'之后,考虑类型、作用域和用户意图。
- LSP架构选择各异:rust-analyzer是急切的,Rust Glancer是懒惰且按工作空间进程隔离的。
- 使用LSP协议涉及UTF-16、行/列转换,以及处理多工作空间文件夹之类的用户意图歧义。
- 索引由查询驱动,而非仅编译,且必须高效处理增量更新。
- Rust LSP必须与外部工具(cargo、rustdoc)集成,以提供诊断、测试和流畅的用户体验。