为什么写一个 Rust 语言服务器这么难
来源: rust-glancer.github.io — 2026-09-15
概述
作者在开发实验性的 Rust 语言服务器「Rust Glancer」,文章从架构层面讲述难点:语言服务器必须在只有部分信息的情况下给出有用的答案。initialize 请求到来时服务器还一无所知,却要立即决定是否阻塞等待索引;索引一旦缺失,文档符号这类请求就没有答案,而 inlay hint 依赖语义分析与定义映射,需要先解析文件、构建 item tree、解析模块并生成「从哪儿能看到什么」的映射,才能回答光标下的符号来自哪里。
核心要点
- 服务器一端要处理协议本身,另一端要真的在被索引的状态上把查询做对,前者看似已解决其实并不。
- 并非所有查询都等价:查引用相当麻烦,hover 通常便宜,所以读查询必须并行执行。
- 状态一变,正在跑的对旧状态的查询就全白做了,需要把可变与不可变查询分离,并在状态变化时取消。
- workspace/inlayHint/refresh 之类工具不能刷新一切,文档符号若不立即返回就会一直陈旧,直到客户端自己再问一次。
- 好消息是回答文档符号只要索引一个东西——当前打开的文件,解析出语法树就能列出声明的结构、trait 与函数。
金句
构建 LSP 的本质,就是从部分信息里挤出有用的答案。
👍 0
👎 0
返回 Lobsters 首页