mirror of
https://github.com/zed-industries/zed.git
synced 2024-09-19 18:41:56 +03:00
Use rust-analyzer from path if possible (#12418)
Release Notes: - Added support for looking up the `rust-analyzer` binary in `$PATH`. This allows using such tools as `asdf` and nix to configure per-folder rust installations. To enable this behavior, use the `path_lookup` key when configuring the `rust-analyzer` `binary`: `{"lsp": {"rust-analyzer": {"binary": {"path_lookup": true }}}}`.
This commit is contained in:
parent
48581167b7
commit
07dbd2bce8
@ -35,12 +35,12 @@ impl super::LspAdapter for CLspAdapter {
|
|||||||
.and_then(|s| s.binary.clone())
|
.and_then(|s| s.binary.clone())
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Ok(Some(BinarySettings {
|
match configured_binary {
|
||||||
path: Some(path),
|
Ok(Some(BinarySettings {
|
||||||
arguments,
|
path: Some(path),
|
||||||
})) = configured_binary
|
arguments,
|
||||||
{
|
..
|
||||||
Some(LanguageServerBinary {
|
})) => Some(LanguageServerBinary {
|
||||||
path: path.into(),
|
path: path.into(),
|
||||||
arguments: arguments
|
arguments: arguments
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
@ -48,15 +48,20 @@ impl super::LspAdapter for CLspAdapter {
|
|||||||
.map(|arg| arg.into())
|
.map(|arg| arg.into())
|
||||||
.collect(),
|
.collect(),
|
||||||
env: None,
|
env: None,
|
||||||
})
|
}),
|
||||||
} else {
|
Ok(Some(BinarySettings {
|
||||||
let env = delegate.shell_env().await;
|
path_lookup: Some(false),
|
||||||
let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
|
..
|
||||||
Some(LanguageServerBinary {
|
})) => None,
|
||||||
path,
|
_ => {
|
||||||
arguments: vec![],
|
let env = delegate.shell_env().await;
|
||||||
env: Some(env),
|
let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
|
||||||
})
|
Some(LanguageServerBinary {
|
||||||
|
path,
|
||||||
|
arguments: vec![],
|
||||||
|
env: Some(env),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,12 +78,12 @@ impl super::LspAdapter for GoLspAdapter {
|
|||||||
.and_then(|s| s.binary.clone())
|
.and_then(|s| s.binary.clone())
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Ok(Some(BinarySettings {
|
match configured_binary {
|
||||||
path: Some(path),
|
Ok(Some(BinarySettings {
|
||||||
arguments,
|
path: Some(path),
|
||||||
})) = configured_binary
|
arguments,
|
||||||
{
|
..
|
||||||
Some(LanguageServerBinary {
|
})) => Some(LanguageServerBinary {
|
||||||
path: path.into(),
|
path: path.into(),
|
||||||
arguments: arguments
|
arguments: arguments
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
@ -91,15 +91,20 @@ impl super::LspAdapter for GoLspAdapter {
|
|||||||
.map(|arg| arg.into())
|
.map(|arg| arg.into())
|
||||||
.collect(),
|
.collect(),
|
||||||
env: None,
|
env: None,
|
||||||
})
|
}),
|
||||||
} else {
|
Ok(Some(BinarySettings {
|
||||||
let env = delegate.shell_env().await;
|
path_lookup: Some(false),
|
||||||
let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
|
..
|
||||||
Some(LanguageServerBinary {
|
})) => None,
|
||||||
path,
|
_ => {
|
||||||
arguments: server_binary_arguments(),
|
let env = delegate.shell_env().await;
|
||||||
env: Some(env),
|
let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
|
||||||
})
|
Some(LanguageServerBinary {
|
||||||
|
path,
|
||||||
|
arguments: server_binary_arguments(),
|
||||||
|
env: Some(env),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ use http::github::{latest_github_release, GitHubLspBinaryVersion};
|
|||||||
pub use language::*;
|
pub use language::*;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use lsp::LanguageServerBinary;
|
use lsp::LanguageServerBinary;
|
||||||
use project::project_settings::ProjectSettings;
|
use project::project_settings::{BinarySettings, ProjectSettings};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use settings::Settings;
|
use settings::Settings;
|
||||||
use smol::fs::{self, File};
|
use smol::fs::{self, File};
|
||||||
@ -35,29 +35,50 @@ impl LspAdapter for RustLspAdapter {
|
|||||||
|
|
||||||
async fn check_if_user_installed(
|
async fn check_if_user_installed(
|
||||||
&self,
|
&self,
|
||||||
_delegate: &dyn LspAdapterDelegate,
|
delegate: &dyn LspAdapterDelegate,
|
||||||
cx: &AsyncAppContext,
|
cx: &AsyncAppContext,
|
||||||
) -> Option<LanguageServerBinary> {
|
) -> Option<LanguageServerBinary> {
|
||||||
let binary = cx
|
let configured_binary = cx.update(|cx| {
|
||||||
.update(|cx| {
|
ProjectSettings::get_global(cx)
|
||||||
ProjectSettings::get_global(cx)
|
.lsp
|
||||||
.lsp
|
.get(Self::SERVER_NAME)
|
||||||
.get(Self::SERVER_NAME)
|
.and_then(|s| s.binary.clone())
|
||||||
.and_then(|s| s.binary.clone())
|
});
|
||||||
})
|
|
||||||
.ok()??;
|
|
||||||
|
|
||||||
let path = binary.path?;
|
match configured_binary {
|
||||||
Some(LanguageServerBinary {
|
Ok(Some(BinarySettings {
|
||||||
path: path.into(),
|
path,
|
||||||
arguments: binary
|
arguments,
|
||||||
.arguments
|
path_lookup,
|
||||||
.unwrap_or_default()
|
})) => {
|
||||||
.iter()
|
let (path, env) = match (path, path_lookup) {
|
||||||
.map(|arg| arg.into())
|
(Some(path), lookup) => {
|
||||||
.collect(),
|
if lookup.is_some() {
|
||||||
env: None,
|
log::warn!(
|
||||||
})
|
"Both `path` and `path_lookup` are set, ignoring `path_lookup`"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
(Some(path.into()), None)
|
||||||
|
}
|
||||||
|
(None, Some(true)) => {
|
||||||
|
let path = delegate.which(Self::SERVER_NAME.as_ref()).await?;
|
||||||
|
let env = delegate.shell_env().await;
|
||||||
|
(Some(path), Some(env))
|
||||||
|
}
|
||||||
|
(None, Some(false)) | (None, None) => (None, None),
|
||||||
|
};
|
||||||
|
path.map(|path| LanguageServerBinary {
|
||||||
|
path,
|
||||||
|
arguments: arguments
|
||||||
|
.unwrap_or_default()
|
||||||
|
.iter()
|
||||||
|
.map(|arg| arg.into())
|
||||||
|
.collect(),
|
||||||
|
env,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn fetch_latest_server_version(
|
async fn fetch_latest_server_version(
|
||||||
|
@ -94,6 +94,7 @@ const fn true_value() -> bool {
|
|||||||
pub struct BinarySettings {
|
pub struct BinarySettings {
|
||||||
pub path: Option<String>,
|
pub path: Option<String>,
|
||||||
pub arguments: Option<Vec<String>>,
|
pub arguments: Option<Vec<String>>,
|
||||||
|
pub path_lookup: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
|
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
|
||||||
|
Loading…
Reference in New Issue
Block a user