From 6a14388d385ae59f528bb54db0c10d2551cc1348 Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Mon, 2 Mar 2026 10:33:48 +0100 Subject: [PATCH] languages: Add support for passing user settings to Go LSP adapter (#50472) Closes https://github.com/zed-industries/zed/issues/50276 Release Notes: - Added support for specifying settings for the Go LSP adapter --- crates/language/src/language.rs | 2 + .../src/extension_lsp_adapter.rs | 1 + crates/languages/src/css.rs | 1 + crates/languages/src/go.rs | 38 ++++++++++++++++--- crates/languages/src/json.rs | 1 + crates/languages/src/python.rs | 2 + crates/languages/src/tailwind.rs | 1 + crates/languages/src/tailwindcss.rs | 1 + crates/languages/src/typescript.rs | 1 + crates/project/src/lsp_store.rs | 5 ++- 10 files changed, 47 insertions(+), 6 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index fd14f42a93179ae0423f5acfa6ede3cceec94935..fe5c5d09aa0765e2c305d88c65e86d6832443b1e 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -491,6 +491,7 @@ pub trait LspAdapter: 'static + Send + Sync + DynLspInstaller { async fn initialization_options( self: Arc, _: &Arc, + _cx: &mut AsyncApp, ) -> Result> { Ok(None) } @@ -2638,6 +2639,7 @@ impl LspAdapter for FakeLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _cx: &mut AsyncApp, ) -> Result> { Ok(self.initialization_options.clone()) } diff --git a/crates/language_extension/src/extension_lsp_adapter.rs b/crates/language_extension/src/extension_lsp_adapter.rs index c2062a294d75657b1421982974019454ecba4aa3..6f5300991fd8afbfaba710ed2bde068dd4d3a969 100644 --- a/crates/language_extension/src/extension_lsp_adapter.rs +++ b/crates/language_extension/src/extension_lsp_adapter.rs @@ -309,6 +309,7 @@ impl LspAdapter for ExtensionLspAdapter { async fn initialization_options( self: Arc, delegate: &Arc, + _: &mut AsyncApp, ) -> Result> { let delegate = Arc::new(WorktreeDelegateAdapter(delegate.clone())) as _; let json_options = self diff --git a/crates/languages/src/css.rs b/crates/languages/src/css.rs index c5c89a0c66431380cf9f500a23b74a19230f3046..6a8fb730a0faa6430d252cdd189d0620fcd07e4a 100644 --- a/crates/languages/src/css.rs +++ b/crates/languages/src/css.rs @@ -134,6 +134,7 @@ impl LspAdapter for CssLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { Ok(Some(json!({ "provideFormatter": true diff --git a/crates/languages/src/go.rs b/crates/languages/src/go.rs index abcb890566d9c0d0d6d9fe85b565c74825775250..581159503ce8aaf642b62789cb895858f1f963c2 100644 --- a/crates/languages/src/go.rs +++ b/crates/languages/src/go.rs @@ -8,8 +8,9 @@ pub use language::*; use language::{LanguageToolchainStore, LspAdapterDelegate, LspInstaller}; use lsp::{LanguageServerBinary, LanguageServerName}; +use project::lsp_store::language_server_settings; use regex::Regex; -use serde_json::json; +use serde_json::{Value, json}; use smol::fs; use std::{ borrow::Cow, @@ -24,7 +25,7 @@ use std::{ }, }; use task::{TaskTemplate, TaskTemplates, TaskVariables, VariableName}; -use util::{ResultExt, fs::remove_matching, maybe}; +use util::{ResultExt, fs::remove_matching, maybe, merge_json_value_into}; fn server_binary_arguments() -> Vec { vec!["-mode=stdio".into()] @@ -192,9 +193,10 @@ impl LspAdapter for GoLspAdapter { async fn initialization_options( self: Arc, - _: &Arc, + delegate: &Arc, + cx: &mut AsyncApp, ) -> Result> { - Ok(Some(json!({ + let mut default_config = json!({ "usePlaceholders": false, "hints": { "assignVariableTypes": true, @@ -205,7 +207,33 @@ impl LspAdapter for GoLspAdapter { "parameterNames": true, "rangeVariableTypes": true } - }))) + }); + + let project_initialization_options = cx.update(|cx| { + language_server_settings(delegate.as_ref(), &self.name(), cx) + .and_then(|s| s.initialization_options.clone()) + }); + + if let Some(override_options) = project_initialization_options { + merge_json_value_into(override_options, &mut default_config); + } + + Ok(Some(default_config)) + } + + async fn workspace_configuration( + self: Arc, + delegate: &Arc, + _: Option, + _: Option, + cx: &mut AsyncApp, + ) -> Result { + Ok(cx + .update(|cx| { + language_server_settings(delegate.as_ref(), &self.name(), cx) + .and_then(|settings| settings.settings.clone()) + }) + .unwrap_or_default()) } async fn label_for_completion( diff --git a/crates/languages/src/json.rs b/crates/languages/src/json.rs index b6c3954cf228d90714a5eb5676d86a204b47b88d..3d8ba972eb17b0fe7f9d5070b73a4fb9e94adef3 100644 --- a/crates/languages/src/json.rs +++ b/crates/languages/src/json.rs @@ -245,6 +245,7 @@ impl LspAdapter for JsonLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { Ok(Some(json!({ "provideFormatter": true diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index 9eaf9764f100428b4bbbc80238f7da5847001470..722f4bb795ea857a9d399ef5b291beb8503f1c92 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -507,6 +507,7 @@ impl LspAdapter for PyrightLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { // Provide minimal initialization options // Virtual environment configuration will be handled through workspace configuration @@ -1972,6 +1973,7 @@ impl LspAdapter for BasedPyrightLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { // Provide minimal initialization options // Virtual environment configuration will be handled through workspace configuration diff --git a/crates/languages/src/tailwind.rs b/crates/languages/src/tailwind.rs index 72e4684ce0a0242e5381c118a9748e3d9718341d..a74275af9631eea603cc957d44867d7d53327682 100644 --- a/crates/languages/src/tailwind.rs +++ b/crates/languages/src/tailwind.rs @@ -139,6 +139,7 @@ impl LspAdapter for TailwindLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { Ok(Some(json!({ "provideFormatter": true, diff --git a/crates/languages/src/tailwindcss.rs b/crates/languages/src/tailwindcss.rs index 016c2956591a5140ab4b2d8313711382fee47d30..aa310fac3f57477b9c0ef85f24f51e619a893c87 100644 --- a/crates/languages/src/tailwindcss.rs +++ b/crates/languages/src/tailwindcss.rs @@ -135,6 +135,7 @@ impl LspAdapter for TailwindCssLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { Ok(Some(json!({ "provideFormatter": true diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index 2b2fb19c629f85c6b51eba64d154b43e716f6827..d15d01808137dd171cc7ee0ab440671bf58cac52 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -804,6 +804,7 @@ impl LspAdapter for TypeScriptLspAdapter { async fn initialization_options( self: Arc, adapter: &Arc, + _: &mut AsyncApp, ) -> Result> { let tsdk_path = self.tsdk_path(adapter).await; Ok(Some(json!({ diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index e2fab975cf455677ff0c92c2902151cc6712b6e0..5a5a13e9cbb4b17f333d29cedd16b1fe6366d204 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -548,6 +548,7 @@ impl LocalLspStore { let mut initialization_options = Self::initialization_options_for_adapter( adapter.adapter.clone(), &delegate, + cx, ) .await?; @@ -3771,9 +3772,10 @@ impl LocalLspStore { async fn initialization_options_for_adapter( adapter: Arc, delegate: &Arc, + cx: &mut AsyncApp, ) -> Result> { let Some(mut initialization_config) = - adapter.clone().initialization_options(delegate).await? + adapter.clone().initialization_options(delegate, cx).await? else { return Ok(None); }; @@ -13986,6 +13988,7 @@ impl LspAdapter for SshLspAdapter { async fn initialization_options( self: Arc, _: &Arc, + _: &mut AsyncApp, ) -> Result> { let Some(options) = &self.initialization_options else { return Ok(None);