Skip to content

Commit 9a867c0

Browse files
committed
When using user-installed language server use worktree env
1 parent e31f566 commit 9a867c0

38 files changed

+81
-5
lines changed

crates/copilot/src/copilot.rs

+2
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,8 @@ impl Copilot {
428428
let binary = LanguageServerBinary {
429429
path: node_path,
430430
arguments,
431+
// TODO: We could set HTTP_PROXY etc here and fix the copilot issue.
432+
env: None,
431433
};
432434

433435
let server = LanguageServer::new(

crates/language/src/language.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ pub trait LspAdapterDelegate: Send + Sync {
254254
&'a self,
255255
command: &'a OsStr,
256256
cx: &AppContext,
257-
) -> BoxFuture<'a, Option<PathBuf>>;
257+
) -> BoxFuture<'a, Option<(PathBuf, HashMap<String, String>)>>;
258258
fn build_command<'a>(
259259
&'a self,
260260
command: &'a OsStr,

crates/lsp/src/lsp.rs

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub enum IoKind {
5555
pub struct LanguageServerBinary {
5656
pub path: PathBuf,
5757
pub arguments: Vec<OsString>,
58+
pub env: Option<HashMap<String, String>>,
5859
}
5960

6061
/// A running language server process.
@@ -189,6 +190,7 @@ impl LanguageServer {
189190
let mut server = process::Command::new(&binary.path)
190191
.current_dir(working_dir)
191192
.args(binary.arguments)
193+
.envs(binary.env.unwrap_or_default())
192194
.stdin(Stdio::piped())
193195
.stdout(Stdio::piped())
194196
.stderr(Stdio::piped())

crates/prettier/src/prettier.rs

+1
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ impl Prettier {
192192
LanguageServerBinary {
193193
path: node_path,
194194
arguments: vec![prettier_server.into(), prettier_dir.as_path().into()],
195+
env: None,
195196
},
196197
Path::new("/"),
197198
None,

crates/project/src/project.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -9299,7 +9299,7 @@ impl LspAdapterDelegate for ProjectLspAdapterDelegate {
92999299
&'a self,
93009300
command: &'a OsStr,
93019301
cx: &AppContext,
9302-
) -> BoxFuture<'a, Option<PathBuf>> {
9302+
) -> BoxFuture<'a, Option<(PathBuf, HashMap<String, String>)>> {
93039303
let worktree_abs_path = self.worktree.read(cx).abs_path();
93049304
async move {
93059305
let shell_env = load_login_shell_environment(&worktree_abs_path)
@@ -9311,10 +9311,10 @@ impl LspAdapterDelegate for ProjectLspAdapterDelegate {
93119311
})
93129312
.log_err();
93139313

9314-
if let Some(shell_env) = shell_env.as_ref() {
9314+
if let Some(shell_env) = shell_env {
93159315
let shell_path = shell_env.get("PATH");
93169316
match which::which_in(command, shell_path, &worktree_abs_path) {
9317-
Ok(command_path) => Some(command_path),
9317+
Ok(command_path) => Some((command_path, shell_env)),
93189318
Err(error) => {
93199319
log::warn!(
93209320
"failed to determine path for command {command:?} in env {shell_env:?}: {error}"

crates/zed/src/languages/astro.rs

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ impl LspAdapter for AstroLspAdapter {
7171

7272
Ok(LanguageServerBinary {
7373
path: self.node.binary_path().await?,
74+
env: None,
7475
arguments: server_binary_arguments(&server_path),
7576
})
7677
}
@@ -122,6 +123,7 @@ async fn get_cached_server_binary(
122123
if server_path.exists() {
123124
Ok(LanguageServerBinary {
124125
path: node.binary_path().await?,
126+
env: None,
125127
arguments: server_binary_arguments(&server_path),
126128
})
127129
} else {

crates/zed/src/languages/c.rs

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ impl super::LspAdapter for CLspAdapter {
8484

8585
Ok(LanguageServerBinary {
8686
path: binary_path,
87+
env: None,
8788
arguments: vec![],
8889
})
8990
}
@@ -260,6 +261,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
260261
if clangd_bin.exists() {
261262
Ok(LanguageServerBinary {
262263
path: clangd_bin,
264+
env: None,
263265
arguments: vec![],
264266
})
265267
} else {

crates/zed/src/languages/clojure.rs

+3
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ impl super::LspAdapter for ClojureLspAdapter {
105105

106106
Ok(LanguageServerBinary {
107107
path: binary_path,
108+
env: None,
108109
arguments: vec![],
109110
})
110111
}
@@ -118,6 +119,7 @@ impl super::LspAdapter for ClojureLspAdapter {
118119
if binary_path.exists() {
119120
Some(LanguageServerBinary {
120121
path: binary_path,
122+
env: None,
121123
arguments: vec![],
122124
})
123125
} else {
@@ -133,6 +135,7 @@ impl super::LspAdapter for ClojureLspAdapter {
133135
if binary_path.exists() {
134136
Some(LanguageServerBinary {
135137
path: binary_path,
138+
env: None,
136139
arguments: vec!["--version".into()],
137140
})
138141
} else {

crates/zed/src/languages/csharp.rs

+2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ impl super::LspAdapter for OmniSharpAdapter {
9292
}
9393
Ok(LanguageServerBinary {
9494
path: binary_path,
95+
env: None,
9596
arguments: server_binary_arguments(),
9697
})
9798
}
@@ -136,6 +137,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
136137
if let Some(path) = last_binary_path {
137138
Ok(LanguageServerBinary {
138139
path,
140+
env: None,
139141
arguments: server_binary_arguments(),
140142
})
141143
} else {

crates/zed/src/languages/css.rs

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ impl LspAdapter for CssLspAdapter {
7272

7373
Ok(LanguageServerBinary {
7474
path: self.node.binary_path().await?,
75+
env: None,
7576
arguments: server_binary_arguments(&server_path),
7677
})
7778
}
@@ -116,6 +117,7 @@ async fn get_cached_server_binary(
116117
if server_path.exists() {
117118
Ok(LanguageServerBinary {
118119
path: node.binary_path().await?,
120+
env: None,
119121
arguments: server_binary_arguments(&server_path),
120122
})
121123
} else {

crates/zed/src/languages/dart.rs

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ impl LspAdapter for DartLanguageServer {
3939
) -> Option<LanguageServerBinary> {
4040
Some(LanguageServerBinary {
4141
path: "dart".into(),
42+
env: None,
4243
arguments: vec!["language-server".into(), "--protocol=lsp".into()],
4344
})
4445
}

crates/zed/src/languages/deno.rs

+2
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ impl LspAdapter for DenoLspAdapter {
134134

135135
Ok(LanguageServerBinary {
136136
path: binary_path,
137+
env: None,
137138
arguments: deno_server_binary_arguments(),
138139
})
139140
}
@@ -220,6 +221,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
220221
if fs::metadata(&binary).await.is_ok() {
221222
return Ok(LanguageServerBinary {
222223
path: binary,
224+
env: None,
223225
arguments: deno_server_binary_arguments(),
224226
});
225227
}

crates/zed/src/languages/dockerfile.rs

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ impl LspAdapter for DockerfileLspAdapter {
7171

7272
Ok(LanguageServerBinary {
7373
path: self.node.binary_path().await?,
74+
env: None,
7475
arguments: server_binary_arguments(&server_path),
7576
})
7677
}
@@ -110,6 +111,7 @@ async fn get_cached_server_binary(
110111
if server_path.exists() {
111112
Ok(LanguageServerBinary {
112113
path: node.binary_path().await?,
114+
env: None,
113115
arguments: server_binary_arguments(&server_path),
114116
})
115117
} else {

crates/zed/src/languages/elixir.rs

+7
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ impl LspAdapter for ElixirLspAdapter {
174174

175175
Ok(LanguageServerBinary {
176176
path: binary_path,
177+
env: None,
177178
arguments: vec![],
178179
})
179180
}
@@ -284,6 +285,7 @@ async fn get_cached_server_binary_elixir_ls(
284285
if server_path.exists() {
285286
Some(LanguageServerBinary {
286287
path: server_path,
288+
env: None,
287289
arguments: vec![],
288290
})
289291
} else {
@@ -369,6 +371,7 @@ impl LspAdapter for NextLspAdapter {
369371

370372
Ok(LanguageServerBinary {
371373
path: binary_path,
374+
env: None,
372375
arguments: vec!["--stdio".into()],
373376
})
374377
}
@@ -435,6 +438,7 @@ async fn get_cached_server_binary_next(container_dir: PathBuf) -> Option<Languag
435438
if let Some(path) = last_binary_path {
436439
Ok(LanguageServerBinary {
437440
path,
441+
env: None,
438442
arguments: Vec::new(),
439443
})
440444
} else {
@@ -476,6 +480,7 @@ impl LspAdapter for LocalLspAdapter {
476480
let path = shellexpand::full(&self.path)?;
477481
Ok(LanguageServerBinary {
478482
path: PathBuf::from(path.deref()),
483+
env: None,
479484
arguments: self.arguments.iter().map(|arg| arg.into()).collect(),
480485
})
481486
}
@@ -488,6 +493,7 @@ impl LspAdapter for LocalLspAdapter {
488493
let path = shellexpand::full(&self.path).ok()?;
489494
Some(LanguageServerBinary {
490495
path: PathBuf::from(path.deref()),
496+
env: None,
491497
arguments: self.arguments.iter().map(|arg| arg.into()).collect(),
492498
})
493499
}
@@ -496,6 +502,7 @@ impl LspAdapter for LocalLspAdapter {
496502
let path = shellexpand::full(&self.path).ok()?;
497503
Some(LanguageServerBinary {
498504
path: PathBuf::from(path.deref()),
505+
env: None,
499506
arguments: self.arguments.iter().map(|arg| arg.into()).collect(),
500507
})
501508
}

crates/zed/src/languages/elm.rs

+2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ impl LspAdapter for ElmLspAdapter {
7575

7676
Ok(LanguageServerBinary {
7777
path: self.node.binary_path().await?,
78+
env: None,
7879
arguments: server_binary_arguments(&server_path),
7980
})
8081
}
@@ -134,6 +135,7 @@ async fn get_cached_server_binary(
134135
if server_path.exists() {
135136
Ok(LanguageServerBinary {
136137
path: node.binary_path().await?,
138+
env: None,
137139
arguments: server_binary_arguments(&server_path),
138140
})
139141
} else {

crates/zed/src/languages/erlang.rs

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl LspAdapter for ErlangLspAdapter {
4141
) -> Option<LanguageServerBinary> {
4242
Some(LanguageServerBinary {
4343
path: "erlang_ls".into(),
44+
env: None,
4445
arguments: vec![],
4546
})
4647
}
@@ -52,6 +53,7 @@ impl LspAdapter for ErlangLspAdapter {
5253
async fn installation_test_binary(&self, _: PathBuf) -> Option<LanguageServerBinary> {
5354
Some(LanguageServerBinary {
5455
path: "erlang_ls".into(),
56+
env: None,
5557
arguments: vec!["--version".into()],
5658
})
5759
}

crates/zed/src/languages/gleam.rs

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ impl LspAdapter for GleamLspAdapter {
8181

8282
Ok(LanguageServerBinary {
8383
path: binary_path,
84+
env: None,
8485
arguments: server_binary_arguments(),
8586
})
8687
}
@@ -116,6 +117,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
116117

117118
anyhow::Ok(LanguageServerBinary {
118119
path: last.ok_or_else(|| anyhow!("no cached binary"))?,
120+
env: None,
119121
arguments: server_binary_arguments(),
120122
})
121123
})

crates/zed/src/languages/go.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ impl super::LspAdapter for GoLspAdapter {
7272
}
7373
};
7474
match command {
75-
Some(path) => Some(LanguageServerBinary {
75+
Some((path, env)) => Some(LanguageServerBinary {
7676
path,
7777
arguments: server_binary_arguments(),
78+
env: Some(env),
7879
}),
7980
None => None,
8081
}
@@ -135,6 +136,7 @@ impl super::LspAdapter for GoLspAdapter {
135136
return Ok(LanguageServerBinary {
136137
path: binary_path.to_path_buf(),
137138
arguments: server_binary_arguments(),
139+
env: None,
138140
});
139141
}
140142
}
@@ -182,6 +184,7 @@ impl super::LspAdapter for GoLspAdapter {
182184
Ok(LanguageServerBinary {
183185
path: binary_path.to_path_buf(),
184186
arguments: server_binary_arguments(),
187+
env: None,
185188
})
186189
}
187190

@@ -400,6 +403,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
400403
Ok(LanguageServerBinary {
401404
path,
402405
arguments: server_binary_arguments(),
406+
env: None,
403407
})
404408
} else {
405409
Err(anyhow!("no cached binary"))

crates/zed/src/languages/haskell.rs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl LspAdapter for HaskellLanguageServer {
4141
) -> Option<LanguageServerBinary> {
4242
Some(LanguageServerBinary {
4343
path: "haskell-language-server-wrapper".into(),
44+
env: None,
4445
arguments: vec!["lsp".into()],
4546
})
4647
}

crates/zed/src/languages/html.rs

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ impl LspAdapter for HtmlLspAdapter {
7272

7373
Ok(LanguageServerBinary {
7474
path: self.node.binary_path().await?,
75+
env: None,
7576
arguments: server_binary_arguments(&server_path),
7677
})
7778
}
@@ -116,6 +117,7 @@ async fn get_cached_server_binary(
116117
if server_path.exists() {
117118
Ok(LanguageServerBinary {
118119
path: node.binary_path().await?,
120+
env: None,
119121
arguments: server_binary_arguments(&server_path),
120122
})
121123
} else {

crates/zed/src/languages/json.rs

+2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ impl LspAdapter for JsonLspAdapter {
122122

123123
Ok(LanguageServerBinary {
124124
path: self.node.binary_path().await?,
125+
env: None,
125126
arguments: server_binary_arguments(&server_path),
126127
})
127128
}
@@ -177,6 +178,7 @@ async fn get_cached_server_binary(
177178
if server_path.exists() {
178179
Ok(LanguageServerBinary {
179180
path: node.binary_path().await?,
181+
env: None,
180182
arguments: server_binary_arguments(&server_path),
181183
})
182184
} else {

crates/zed/src/languages/lua.rs

+2
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ impl super::LspAdapter for LuaLspAdapter {
9494
}
9595
Ok(LanguageServerBinary {
9696
path: binary_path,
97+
env: None,
9798
arguments: Vec::new(),
9899
})
99100
}
@@ -138,6 +139,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
138139
if let Some(path) = last_binary_path {
139140
Ok(LanguageServerBinary {
140141
path,
142+
env: None,
141143
arguments: Vec::new(),
142144
})
143145
} else {

crates/zed/src/languages/nu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl LspAdapter for NuLanguageServer {
4141
) -> Option<LanguageServerBinary> {
4242
Some(LanguageServerBinary {
4343
path: "nu".into(),
44+
env: None,
4445
arguments: vec!["--lsp".into()],
4546
})
4647
}

0 commit comments

Comments
 (0)