Follow-up to #923 (PR fixing it: see linked PR). That PR gave the settings-reload placeholder provenance (ParseSnapshot::awaiting_reparse) and made selectionRange, formatting and rangeFormatting wait past it. Other readers were audited and intentionally left accepting the placeholder. These related gaps remain. Each is pre-existing or best-effort, not a regression:
- The reparse is scheduled late.
apply_shared_settings_locked (src/lsp/lsp_impl.rs) invalidates documents and then awaits bridge.propagate_settings. Only after that does it return reparse_uris for scheduling. The placeholder window therefore includes the propagation time, and the 500 ms explicit-action wait can expire before the reparse is even queued. Consider scheduling the reparses right after drop(parser_reload).
formatting skips the host layer without a tree. formatting_impl returns Ok(None) when doc.snapshot() is None, before the host layer runs, even though the host formatter needs only text. rangeFormatting gates only its virtual layer on the snapshot.
rename/prepareRename don't get the explicit-action wait. The parse-snapshot ADR lists them as explicit actions with that wait. In the code they go through resolve_bridge_contexts → ensure_document_parsed, a 200 ms wait that accepts the placeholder.
- Pull diagnostics can miss the reload. A virt-layer pull that lands on the placeholder records degraded-pull debt only when region slots or a pull layer are already cached. So a reload that newly enables an injected pull-only server may not be re-driven after the reparse. The comment at
lsp_impl.rs ("the re-pull waits for the reparse") is not accurate for the virt layer.
- Highlighting flashes on reload. The reload's semantic-tokens refresh lands on the placeholder, which serves empty tokens. The settle refresh repaints them, at the cost of a second refresh.
captures/full answers null immediately.
- Test gap: the
resolve_reload_placeholder calls on reparse_latest's language-load-failure exit and final no-tree exit have no test. There is no hermetic way to force a tree-less parse for a detected language.
Follow-up to #923 (PR fixing it: see linked PR). That PR gave the settings-reload placeholder provenance (
ParseSnapshot::awaiting_reparse) and madeselectionRange,formattingandrangeFormattingwait past it. Other readers were audited and intentionally left accepting the placeholder. These related gaps remain. Each is pre-existing or best-effort, not a regression:apply_shared_settings_locked(src/lsp/lsp_impl.rs) invalidates documents and then awaitsbridge.propagate_settings. Only after that does it returnreparse_urisfor scheduling. The placeholder window therefore includes the propagation time, and the 500 ms explicit-action wait can expire before the reparse is even queued. Consider scheduling the reparses right afterdrop(parser_reload).formattingskips the host layer without a tree.formatting_implreturnsOk(None)whendoc.snapshot()isNone, before the host layer runs, even though the host formatter needs only text.rangeFormattinggates only its virtual layer on the snapshot.rename/prepareRenamedon't get the explicit-action wait. The parse-snapshot ADR lists them as explicit actions with that wait. In the code they go throughresolve_bridge_contexts→ensure_document_parsed, a 200 ms wait that accepts the placeholder.lsp_impl.rs("the re-pull waits for the reparse") is not accurate for the virt layer.captures/fullanswersnullimmediately.resolve_reload_placeholdercalls onreparse_latest's language-load-failure exit and final no-tree exit have no test. There is no hermetic way to force a tree-less parse for a detected language.