From 481c83b5082ea7f2647acfd76d2fb643e5d5e66c Mon Sep 17 00:00:00 2001 From: "gcp-cherry-pick-bot[bot]" <98988430+gcp-cherry-pick-bot[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:57:48 +0300 Subject: [PATCH] Properly register buffers with reused language servers (cherry-pick #32057) (#32063) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked Properly register buffers with reused language servers (#32057) Follow-up of https://github.com/zed-industries/zed/pull/30707 The old code does something odd, re-accessing essentially the same adapter-server pair for every language server initialized; but that was done before for "incorrect", non-reused worktree_id hence never resulted in external worktrees' files registration in this code path. Release Notes: - Fixed certain external worktrees' files sometimes not registered with language servers Co-authored-by: Kirill Bulatov --- crates/project/src/lsp_store.rs | 63 +++++++++++---------------------- 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index fdf12e8f04b47fa0c9536192615d3850bbb412ce..2c80f6b43282c0c25bde03a6a0ba82b690434568 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -2306,7 +2306,7 @@ impl LocalLspStore { }); (false, delegate, servers) }); - let servers = servers + let servers_and_adapters = servers .into_iter() .filter_map(|server_node| { if reused && server_node.server_id().is_none() { @@ -2382,14 +2382,14 @@ impl LocalLspStore { }, )?; let server_state = self.language_servers.get(&server_id)?; - if let LanguageServerState::Running { server, .. } = server_state { - Some(server.clone()) + if let LanguageServerState::Running { server, adapter, .. } = server_state { + Some((server.clone(), adapter.clone())) } else { None } }) .collect::>(); - for server in servers { + for (server, adapter) in servers_and_adapters { buffer_handle.update(cx, |buffer, cx| { buffer.set_completion_triggers( server.server_id(), @@ -2407,47 +2407,26 @@ impl LocalLspStore { cx, ); }); - } - for adapter in self.languages.lsp_adapters(&language.name()) { - let servers = self - .language_server_ids - .get(&(worktree_id, adapter.name.clone())) - .map(|ids| { - ids.iter().flat_map(|id| { - self.language_servers.get(id).and_then(|server_state| { - if let LanguageServerState::Running { server, .. } = server_state { - Some(server.clone()) - } else { - None - } - }) - }) - }); - let servers = match servers { - Some(server) => server, - None => continue, + + let snapshot = LspBufferSnapshot { + version: 0, + snapshot: initial_snapshot.clone(), }; - for server in servers { - let snapshot = LspBufferSnapshot { - version: 0, - snapshot: initial_snapshot.clone(), - }; - self.buffer_snapshots - .entry(buffer_id) - .or_default() - .entry(server.server_id()) - .or_insert_with(|| { - server.register_buffer( - uri.clone(), - adapter.language_id(&language.name()), - 0, - initial_snapshot.text(), - ); + self.buffer_snapshots + .entry(buffer_id) + .or_default() + .entry(server.server_id()) + .or_insert_with(|| { + server.register_buffer( + uri.clone(), + adapter.language_id(&language.name()), + 0, + initial_snapshot.text(), + ); - vec![snapshot] - }); - } + vec![snapshot] + }); } }