@@ -4,6 +4,8 @@ use futures::StreamExt;
use gpui::AsyncAppContext;
pub use language::*;
use lsp::LanguageServerBinary;
+use project::project_settings::{BinarySettings, ProjectSettings};
+use settings::Settings;
use smol::fs::{self, File};
use std::{any::Any, env::consts, path::PathBuf, sync::Arc};
use util::{
@@ -14,10 +16,51 @@ use util::{
pub struct CLspAdapter;
+impl CLspAdapter {
+ const SERVER_NAME: &'static str = "clangd";
+}
+
#[async_trait(?Send)]
impl super::LspAdapter for CLspAdapter {
fn name(&self) -> LanguageServerName {
- LanguageServerName("clangd".into())
+ LanguageServerName(Self::SERVER_NAME.into())
+ }
+
+ async fn check_if_user_installed(
+ &self,
+ delegate: &dyn LspAdapterDelegate,
+ cx: &AsyncAppContext,
+ ) -> Option<LanguageServerBinary> {
+ 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(Self::SERVER_NAME.as_ref()).await?;
+ Some(LanguageServerBinary {
+ path,
+ arguments: vec![],
+ env: Some(env),
+ })
+ }
}
async fn fetch_latest_server_version(
@@ -45,20 +88,6 @@ impl super::LspAdapter for CLspAdapter {
Ok(Box::new(version) as Box<_>)
}
- async fn check_if_user_installed(
- &self,
- delegate: &dyn LspAdapterDelegate,
- _: &AsyncAppContext,
- ) -> Option<LanguageServerBinary> {
- let env = delegate.shell_env().await;
- let path = delegate.which("clangd".as_ref()).await?;
- Some(LanguageServerBinary {
- path,
- arguments: vec![],
- env: Some(env),
- })
- }
-
async fn fetch_server_binary(
&self,
version: Box<dyn 'static + Send + Any>,
@@ -88,7 +88,7 @@ impl super::LspAdapter for GoLspAdapter {
})
} else {
let env = delegate.shell_env().await;
- let path = delegate.which("gopls".as_ref()).await?;
+ let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
Some(LanguageServerBinary {
path,
arguments: server_binary_arguments(),