feat(web): surface rust-analyzer indexing progress in the LSP status notice
打开第一个 .rs 文件时,rust-analyzer 会进入 PrimeCaches 阶段对工作区做初始化索引。这个阶段在 coder-studio 仓库根(中等仓库 + 大量 node_modules)下实测会持续 ~25 秒。
期间:
initializeLSP 请求几十毫秒就返回(rust-analyzer 设计上立刻确认 capabilities,workspace 加载是异步的)- 我们的
LspManager.ensureSession拿到summary.status === "ready",前端把 hover/definition provider 都注册好 - 但用户任何 hover/definition 请求都会被 rust-analyzer 立刻返回
null——不是 hang、不是 timeout,而是它故意在 indexing 期间不给语义答案 - Monaco 拿到 null 就什么都不显示
- 用户感受:开了
.rs文件之后随便点点都"完全没反应",像 LSP 没起来
25 秒后 rust-analyzer 发 $/progress { kind: "end" } 通知,从此 hover 正常工作。但这中间的等待期对用户完全不可见。
- 干净环境,无 rust-analyzer 缓存。
- 在 coder-studio 仓库根新建
Cargo.toml+probe.rs(最小 bin 项目即可)。 - 重启 dev server,让 LSP 会话从干净状态启动。
- 浏览器中打开
probe.rs,立刻 hover 任一标识符。 - 观察前 ~25 秒所有 hover/definition/references 都没反应。
可以用 scripts/probe-rust.mjs probe.rs 直接复现 ——
它会同时记录 initialize 用时、首次 hover 响应、$/progress end 用时。
- 前 25 秒:hover 返回 null,UI 安静
- 之后:hover 工作,但用户多半已经放弃尝试了
VS Code 的官方 rust-analyzer 扩展会在 status bar 上显示
rust-analyzer: indexing X/Y 进度条;Helix 会在底部状态栏显示同样信息。两者都监听 rust-analyzer
的 $/progress LSP 通知。
我们目前没监听任何 LSP 进度通知。
initialize响应快(~70ms 量级,与 indexing 解耦)- rust-analyzer 通过标准 LSP
$/progressnotification 通报进度,token 是"rustAnalyzer/Indexing"或类似 LspSession(packages/server/src/lsp/session.ts)目前没有connection.onNotification("$/progress", ...)处理器- 前端
LspStatusNotice目前只有 ready / installing / failed / disabled 四种状态显示
- server:
LspSession监听$/progress通知,把WorkDoneProgressBegin/WorkDoneProgressReport/WorkDoneProgressEnd转成lsp.progress.updated事件 viaeventBus - core / shared:在
LspEnsureSessionResult或独立LspProgress类型里加一个 "indexing" 状态 - web:
LspStatusNotice渲染 "Indexing 12 / 47 …" 或简单的 spinner + percentage - 范围只对 rust-analyzer + 任何主动发
$/progress的 server(pylsp、gopls 通常不发)
- 文档里告诉用户:"首次打开
.rs文件需要等 ~30s 完成索引" - 或检测 rust-analyzer 没回有效 hover 时,在编辑器里给一个 transient toast 提示