aboutsummaryrefslogtreecommitdiff
path: root/helix-lsp
diff options
context:
space:
mode:
authorath32022-10-03 15:02:49 +0000
committerGitHub2022-10-03 15:02:49 +0000
commit7c9809eeb2708a9eba3c3cc48c9513e9892409f0 (patch)
treef0e5cebc206845c83de11a002a40a74c5d383a10 /helix-lsp
parent66bbba90242e499d7178d4beae1054019067d1c9 (diff)
Find workspace from document path (#3553)
Diffstat (limited to 'helix-lsp')
-rw-r--r--helix-lsp/src/client.rs6
-rw-r--r--helix-lsp/src/lib.rs15
2 files changed, 17 insertions, 4 deletions
diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs
index 497ce80c..0b443ccf 100644
--- a/helix-lsp/src/client.rs
+++ b/helix-lsp/src/client.rs
@@ -49,6 +49,7 @@ impl Client {
root_markers: &[String],
id: usize,
req_timeout: u64,
+ doc_path: Option<&std::path::PathBuf>,
) -> Result<(Self, UnboundedReceiver<(usize, Call)>, Arc<Notify>)> {
// Resolve path to the binary
let cmd = which::which(cmd).map_err(|err| anyhow::anyhow!(err))?;
@@ -72,7 +73,10 @@ impl Client {
let (server_rx, server_tx, initialize_notify) =
Transport::start(reader, writer, stderr, id);
- let root_path = find_root(None, root_markers);
+ let root_path = find_root(
+ doc_path.and_then(|x| x.parent().and_then(|x| x.to_str())),
+ root_markers,
+ );
let root_uri = lsp::Url::from_file_path(root_path.clone()).ok();
diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs
index 98300a62..feeedc96 100644
--- a/helix-lsp/src/lib.rs
+++ b/helix-lsp/src/lib.rs
@@ -353,6 +353,7 @@ impl Registry {
pub fn restart(
&mut self,
language_config: &LanguageConfiguration,
+ doc_path: Option<&std::path::PathBuf>,
) -> Result<Option<Arc<Client>>> {
let config = match &language_config.language_server {
Some(config) => config,
@@ -367,7 +368,8 @@ impl Registry {
// initialize a new client
let id = self.counter.fetch_add(1, Ordering::Relaxed);
- let NewClientResult(client, incoming) = start_client(id, language_config, config)?;
+ let NewClientResult(client, incoming) =
+ start_client(id, language_config, config, doc_path)?;
self.incoming.push(UnboundedReceiverStream::new(incoming));
let (_, old_client) = entry.insert((id, client.clone()));
@@ -381,7 +383,11 @@ impl Registry {
}
}
- pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Option<Arc<Client>>> {
+ pub fn get(
+ &mut self,
+ language_config: &LanguageConfiguration,
+ doc_path: Option<&std::path::PathBuf>,
+ ) -> Result<Option<Arc<Client>>> {
let config = match &language_config.language_server {
Some(config) => config,
None => return Ok(None),
@@ -393,7 +399,8 @@ impl Registry {
// initialize a new client
let id = self.counter.fetch_add(1, Ordering::Relaxed);
- let NewClientResult(client, incoming) = start_client(id, language_config, config)?;
+ let NewClientResult(client, incoming) =
+ start_client(id, language_config, config, doc_path)?;
self.incoming.push(UnboundedReceiverStream::new(incoming));
entry.insert((id, client.clone()));
@@ -493,6 +500,7 @@ fn start_client(
id: usize,
config: &LanguageConfiguration,
ls_config: &LanguageServerConfiguration,
+ doc_path: Option<&std::path::PathBuf>,
) -> Result<NewClientResult> {
let (client, incoming, initialize_notify) = Client::start(
&ls_config.command,
@@ -501,6 +509,7 @@ fn start_client(
&config.roots,
id,
ls_config.timeout,
+ doc_path,
)?;
let client = Arc::new(client);