The default-bundle auto-attach path (lsp.lua ensure_server) never forwarded cwd/root_uri to pmacs.lsp.spawn, so build_initialize fell back to std::env::current_dir() — every auto-attached server received the *editor's* cwd as rootUri regardless of which project the opened file belonged to. Module-strict servers (gopls, rust-analyzer) return nothing unless launched from the project dir; the fake-LSP and clangd (which finds compile_flags near the file) masked this, gopls exposes it. Same shape as the #26 transport bugs: lenient fakes hid a gap strict real servers fall straight into. Fix: project_root_for(language, path) in lsp.lua — config[lang].root override -> pmacs.project.detect marker walk (the canonical detector, honors set_search_boundary) -> the file's own directory. attach_buffer resolves the path before ensure_server; spawn now carries cwd/root_uri. Single-root only (fixes which root the one per-language server uses); one-server-per-root multi-root scoping stays deferred post-v0.1 (documented: first file of a language fixes that server's root). New documented pmacs.lsp.config[lang].root key. Tests: - m4_26: deterministic — new fake "rooturi" mode + PMACS_FAKE_LSP_ROOT_SINK side-channel; asserts the rootUri sent through a real find_or_open auto-attach is the go.mod dir, not the cwd, not the file's own dir. - m4_27: PATH-gated real gopls — documentSymbol + hover round-trip is end-to-end proof of the fix against a real strict server. - m4_28: PATH-gated real clangd — diagnostics arriving is the #26 deferred-notification-flush + URI-absolutization regression guard; also exercises semantic tokens + documentSymbol. No other latent bugs surfaced; gopls & clangd both clean through the fixed path. rust-analyzer / basedpyright not installed here, so their real end-to-end validation is still pending (the fix benefits them identically — Cargo.toml / pyproject.toml are detect markers). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| async.lua | ||
| fs.lua | ||
| lsp.lua | ||
| mcp.lua | ||
| syntax.lua | ||