From 6d6c3d648a32f2b88073fe59a744ee7ba09e4c28 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:20:04 +0200 Subject: [PATCH] lsp: Fix overnotifying about open buffers for unrelated servers (#38196) Do not report all open buffers to new instances of the same language server, as they can respond with ~spurious errors. This regressed in https://github.com/zed-industries/zed/pull/34142 Closes https://github.com/zed-industries/zed/issues/35017 Release Notes: - Fixed Zed overly notifying language servers about open buffers, which could've resulted in confusing errors in multi-language projects (in e.g. Go). --- crates/project/src/lsp_store.rs | 12 ++++++++---- crates/project/src/manifest_tree/server_tree.rs | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 2040b10bb39ceff6d9d6d06a5dbfb0f68f41a459..37a97a35ab8300248d6e1b68b628ed6439c5e8e0 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -10540,7 +10540,10 @@ impl LspStore { for (worktree_id, servers) in &local.lsp_tree.instances { if *worktree_id != key.worktree_id { for server_map in servers.roots.values() { - if server_map.contains_key(&key.name) { + if server_map + .values() + .any(|(node, _)| node.id() == Some(server_id)) + { worktrees_using_server.push(*worktree_id); } } @@ -10550,6 +10553,7 @@ impl LspStore { let mut buffer_paths_registered = Vec::new(); self.buffer_store.clone().update(cx, |buffer_store, cx| { + let mut lsp_adapters = HashMap::default(); for buffer_handle in buffer_store.buffers() { let buffer = buffer_handle.read(cx); let file = match File::from_dyn(buffer.file()) { @@ -10562,9 +10566,9 @@ impl LspStore { }; if !worktrees_using_server.contains(&file.worktree.read(cx).id()) - || !self - .languages - .lsp_adapters(&language.name()) + || !lsp_adapters + .entry(language.name()) + .or_insert_with(|| self.languages.lsp_adapters(&language.name())) .iter() .any(|a| a.name == key.name) { diff --git a/crates/project/src/manifest_tree/server_tree.rs b/crates/project/src/manifest_tree/server_tree.rs index 48e2007d47f1ebd3c950f0d03e80dcccad515389..17a183e5b08dcab8ba6b6da861d2ec12559092b5 100644 --- a/crates/project/src/manifest_tree/server_tree.rs +++ b/crates/project/src/manifest_tree/server_tree.rs @@ -114,6 +114,10 @@ impl InnerTreeNode { }), } } + + pub(crate) fn id(&self) -> Option { + self.id.get().copied() + } } impl LanguageServerTree {