diff --git a/crates/languages/src/go.rs b/crates/languages/src/go.rs index 0ffc747c0fce7861349878d3d08938027c0cd652..58477d34a2d5510f4d3bf12935541acd9008f120 100644 --- a/crates/languages/src/go.rs +++ b/crates/languages/src/go.rs @@ -5,8 +5,10 @@ use gpui::{AsyncAppContext, Task}; pub use language::*; use lazy_static::lazy_static; use lsp::LanguageServerBinary; +use project::project_settings::{BinarySettings, ProjectSettings}; use regex::Regex; use serde_json::json; +use settings::Settings; use smol::{fs, process}; use std::{ any::Any, @@ -28,6 +30,10 @@ fn server_binary_arguments() -> Vec { #[derive(Copy, Clone)] pub struct GoLspAdapter; +impl GoLspAdapter { + const SERVER_NAME: &'static str = "gopls"; +} + lazy_static! { static ref GOPLS_VERSION_REGEX: Regex = Regex::new(r"\d+\.\d+\.\d+").unwrap(); } @@ -35,7 +41,7 @@ lazy_static! { #[async_trait(?Send)] impl super::LspAdapter for GoLspAdapter { fn name(&self) -> LanguageServerName { - LanguageServerName("gopls".into()) + LanguageServerName(Self::SERVER_NAME.into()) } async fn fetch_latest_server_version( @@ -57,15 +63,38 @@ impl super::LspAdapter for GoLspAdapter { async fn check_if_user_installed( &self, delegate: &dyn LspAdapterDelegate, - _: &AsyncAppContext, + cx: &AsyncAppContext, ) -> Option { - let env = delegate.shell_env().await; - let path = delegate.which("gopls".as_ref()).await?; - Some(LanguageServerBinary { - path, - arguments: server_binary_arguments(), - env: Some(env), - }) + let configured_binary = cx.update(|cx| { + ProjectSettings::get_global(cx) + .lsp + .get(Self::SERVER_NAME) + .and_then(|s| s.binary.clone()) + }); + + if let Ok(Some(BinarySettings { + path: Some(path), + arguments, + })) = configured_binary + { + Some(LanguageServerBinary { + path: path.into(), + arguments: arguments + .unwrap_or_default() + .iter() + .map(|arg| arg.into()) + .collect(), + env: None, + }) + } else { + let env = delegate.shell_env().await; + let path = delegate.which("gopls".as_ref()).await?; + Some(LanguageServerBinary { + path, + arguments: server_binary_arguments(), + env: Some(env), + }) + } } fn will_fetch_server(