diff --git a/crates/languages/src/css.rs b/crates/languages/src/css.rs index 957f66d5fb..dee82c3428 100644 --- a/crates/languages/src/css.rs +++ b/crates/languages/src/css.rs @@ -1,7 +1,8 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; use futures::StreamExt; -use language::{LspAdapter, LspAdapterDelegate}; +use gpui::AsyncApp; +use language::{LanguageToolchainStore, LspAdapter, LspAdapterDelegate}; use lsp::{LanguageServerBinary, LanguageServerName}; use node_runtime::NodeRuntime; use project::Fs; @@ -39,6 +40,24 @@ impl LspAdapter for CssLspAdapter { LanguageServerName("vscode-css-language-server".into()) } + async fn check_if_user_installed( + &self, + delegate: &dyn LspAdapterDelegate, + _: Arc, + _: &AsyncApp, + ) -> Option { + let path = delegate + .which("vscode-css-language-server".as_ref()) + .await?; + let env = delegate.shell_env().await; + + Some(LanguageServerBinary { + path, + env: Some(env), + arguments: vec!["--stdio".into()], + }) + } + async fn fetch_latest_server_version( &self, _: &dyn LspAdapterDelegate, diff --git a/crates/languages/src/json.rs b/crates/languages/src/json.rs index 81f4f479b2..02a818bce9 100644 --- a/crates/languages/src/json.rs +++ b/crates/languages/src/json.rs @@ -149,6 +149,24 @@ impl LspAdapter for JsonLspAdapter { LanguageServerName("json-language-server".into()) } + async fn check_if_user_installed( + &self, + delegate: &dyn LspAdapterDelegate, + _: Arc, + _: &AsyncApp, + ) -> Option { + let path = delegate + .which("vscode-json-language-server".as_ref()) + .await?; + let env = delegate.shell_env().await; + + Some(LanguageServerBinary { + path, + env: Some(env), + arguments: vec!["--stdio".into()], + }) + } + async fn fetch_latest_server_version( &self, _: &dyn LspAdapterDelegate, diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index 67073e7cf3..7c72a2be9a 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -83,19 +83,28 @@ impl LspAdapter for PythonLspAdapter { _: Arc, _: &AsyncApp, ) -> Option { - let node = delegate.which("node".as_ref()).await?; - let (node_modules_path, _) = delegate - .npm_package_installed_version(Self::SERVER_NAME.as_ref()) - .await - .log_err()??; + if let Some(pyright_bin) = delegate.which(Self::SERVER_NAME.as_ref()).await { + let env = delegate.shell_env().await; + Some(LanguageServerBinary { + path: pyright_bin, + env: Some(env), + arguments: vec!["--stdio".into()], + }) + } else { + let node = delegate.which("node".as_ref()).await?; + let (node_modules_path, _) = delegate + .npm_package_installed_version(Self::SERVER_NAME.as_ref()) + .await + .log_err()??; - let path = node_modules_path.join(NODE_MODULE_RELATIVE_SERVER_PATH); + let path = node_modules_path.join(NODE_MODULE_RELATIVE_SERVER_PATH); - Some(LanguageServerBinary { - path: node, - env: None, - arguments: server_binary_arguments(&path), - }) + Some(LanguageServerBinary { + path: node, + env: None, + arguments: server_binary_arguments(&path), + }) + } } async fn fetch_latest_server_version( @@ -791,19 +800,28 @@ impl LspAdapter for PyLspAdapter { toolchains: Arc, cx: &AsyncApp, ) -> Option { - let venv = toolchains - .active_toolchain( - delegate.worktree_id(), - LanguageName::new("Python"), - &mut cx.clone(), - ) - .await?; - let pylsp_path = Path::new(venv.path.as_ref()).parent()?.join("pylsp"); - pylsp_path.exists().then(|| LanguageServerBinary { - path: venv.path.to_string().into(), - arguments: vec![pylsp_path.into()], - env: None, - }) + if let Some(pylsp_bin) = delegate.which(Self::SERVER_NAME.as_ref()).await { + let env = delegate.shell_env().await; + Some(LanguageServerBinary { + path: pylsp_bin, + env: Some(env), + arguments: vec![], + }) + } else { + let venv = toolchains + .active_toolchain( + delegate.worktree_id(), + LanguageName::new("Python"), + &mut cx.clone(), + ) + .await?; + let pylsp_path = Path::new(venv.path.as_ref()).parent()?.join("pylsp"); + pylsp_path.exists().then(|| LanguageServerBinary { + path: venv.path.to_string().into(), + arguments: vec![pylsp_path.into()], + env: None, + }) + } } async fn fetch_latest_server_version( diff --git a/crates/languages/src/tailwind.rs b/crates/languages/src/tailwind.rs index 5350eeac0e..04127e98bb 100644 --- a/crates/languages/src/tailwind.rs +++ b/crates/languages/src/tailwind.rs @@ -47,6 +47,22 @@ impl LspAdapter for TailwindLspAdapter { Self::SERVER_NAME.clone() } + async fn check_if_user_installed( + &self, + delegate: &dyn LspAdapterDelegate, + _: Arc, + _: &AsyncApp, + ) -> Option { + let path = delegate.which(Self::SERVER_NAME.as_ref()).await?; + let env = delegate.shell_env().await; + + Some(LanguageServerBinary { + path, + env: Some(env), + arguments: vec!["--stdio".into()], + }) + } + async fn fetch_latest_server_version( &self, _: &dyn LspAdapterDelegate,