Skip to content

Commit a9331a3

Browse files
committed
Enable custom LSP binary, env, args for EmmyLua
1 parent 5962247 commit a9331a3

File tree

2 files changed

+51
-47
lines changed

2 files changed

+51
-47
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ path = "src/emmylua.rs"
99
crate-type = ["cdylib"]
1010

1111
[dependencies]
12-
zed_extension_api = "0.6.0"
12+
zed_extension_api = "0.7.0"

src/emmylua.rs

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::fs;
22
use zed::lsp::CompletionKind;
33
use zed::{CodeLabel, CodeLabelSpan, LanguageServerId};
4-
use zed_extension_api::{self as zed, Result};
4+
use zed_extension_api::settings::LspSettings;
5+
use zed_extension_api::{self as zed, Command, Result};
56

67
struct EmmyLuaExtension {
78
cached_binary_path: Option<String>,
@@ -13,7 +14,14 @@ impl EmmyLuaExtension {
1314
language_server_id: &LanguageServerId,
1415
worktree: &zed::Worktree,
1516
) -> Result<String> {
16-
// First check if emmylua is in PATH
17+
if let Ok(lsp_settings) = LspSettings::for_worktree("emmylua", worktree) {
18+
if let Some(binary) = lsp_settings.binary {
19+
if let Some(path) = binary.path {
20+
return Ok(path);
21+
}
22+
}
23+
}
24+
1725
if let Some(path) = worktree.which("emmylua_ls") {
1826
return Ok(path);
1927
}
@@ -33,7 +41,7 @@ impl EmmyLuaExtension {
3341
language_server_id,
3442
&zed::LanguageServerInstallationStatus::CheckingForUpdate,
3543
);
36-
44+
3745
let release = zed::latest_github_release(
3846
"EmmyLuaLs/emmylua-analyzer-rust",
3947
zed::GithubReleaseOptions {
@@ -126,10 +134,24 @@ impl zed::Extension for EmmyLuaExtension {
126134
language_server_id: &LanguageServerId,
127135
worktree: &zed::Worktree,
128136
) -> Result<zed::Command> {
137+
let mut env = worktree.shell_env();
138+
let mut args = Default::default();
139+
140+
if let Ok(lsp_settings) = LspSettings::for_worktree("emmylua", worktree) {
141+
if let Some(binary) = lsp_settings.binary {
142+
if let Some(binary_arguments) = binary.arguments {
143+
args = binary_arguments;
144+
}
145+
if let Some(binary_env) = binary.env {
146+
env.extend(binary_env);
147+
}
148+
}
149+
}
150+
129151
Ok(zed::Command {
130152
command: self.language_server_binary_path(language_server_id, worktree)?,
131-
args: Default::default(),
132-
env: Default::default(),
153+
args,
154+
env,
133155
})
134156
}
135157

@@ -139,7 +161,7 @@ impl zed::Extension for EmmyLuaExtension {
139161
completion: zed::lsp::Completion,
140162
) -> Option<CodeLabel> {
141163
let name = &completion.label;
142-
164+
143165
match completion.kind? {
144166
CompletionKind::Method | CompletionKind::Function => {
145167
let name_len = name.find('(').unwrap_or(name.len());
@@ -166,26 +188,17 @@ impl zed::Extension for EmmyLuaExtension {
166188
code: Default::default(),
167189
}),
168190
CompletionKind::Class => Some(CodeLabel {
169-
spans: vec![CodeLabelSpan::literal(
170-
name.clone(),
171-
Some("type".into()),
172-
)],
191+
spans: vec![CodeLabelSpan::literal(name.clone(), Some("type".into()))],
173192
filter_range: (0..name.len()).into(),
174193
code: Default::default(),
175194
}),
176195
CompletionKind::Module => Some(CodeLabel {
177-
spans: vec![CodeLabelSpan::literal(
178-
name.clone(),
179-
Some("module".into()),
180-
)],
196+
spans: vec![CodeLabelSpan::literal(name.clone(), Some("module".into()))],
181197
filter_range: (0..name.len()).into(),
182198
code: Default::default(),
183199
}),
184200
CompletionKind::Keyword => Some(CodeLabel {
185-
spans: vec![CodeLabelSpan::literal(
186-
name.clone(),
187-
Some("keyword".into()),
188-
)],
201+
spans: vec![CodeLabelSpan::literal(name.clone(), Some("keyword".into()))],
189202
filter_range: (0..name.len()).into(),
190203
code: Default::default(),
191204
}),
@@ -199,7 +212,7 @@ impl zed::Extension for EmmyLuaExtension {
199212
symbol: zed::lsp::Symbol,
200213
) -> Option<CodeLabel> {
201214
let name = &symbol.name;
202-
215+
203216
match symbol.kind {
204217
zed::lsp::SymbolKind::Method | zed::lsp::SymbolKind::Function => {
205218
let code = format!("function {}()", name);
@@ -210,33 +223,24 @@ impl zed::Extension for EmmyLuaExtension {
210223
code,
211224
})
212225
}
213-
zed::lsp::SymbolKind::Class | zed::lsp::SymbolKind::Module => {
214-
Some(CodeLabel {
215-
spans: vec![CodeLabelSpan::literal(
216-
name.clone(),
217-
Some("type".into()),
218-
)],
219-
filter_range: (0..name.len()).into(),
220-
code: name.clone(),
221-
})
222-
}
223-
zed::lsp::SymbolKind::Variable | zed::lsp::SymbolKind::Constant => {
224-
Some(CodeLabel {
225-
spans: vec![CodeLabelSpan::literal(
226-
name.clone(),
227-
Some("variable".into()),
228-
)],
229-
filter_range: (0..name.len()).into(),
230-
code: name.clone(),
231-
})
232-
}
233-
_ => {
234-
Some(CodeLabel {
235-
spans: vec![CodeLabelSpan::code_range(0..name.len())],
236-
filter_range: (0..name.len()).into(),
237-
code: name.clone(),
238-
})
239-
}
226+
zed::lsp::SymbolKind::Class | zed::lsp::SymbolKind::Module => Some(CodeLabel {
227+
spans: vec![CodeLabelSpan::literal(name.clone(), Some("type".into()))],
228+
filter_range: (0..name.len()).into(),
229+
code: name.clone(),
230+
}),
231+
zed::lsp::SymbolKind::Variable | zed::lsp::SymbolKind::Constant => Some(CodeLabel {
232+
spans: vec![CodeLabelSpan::literal(
233+
name.clone(),
234+
Some("variable".into()),
235+
)],
236+
filter_range: (0..name.len()).into(),
237+
code: name.clone(),
238+
}),
239+
_ => Some(CodeLabel {
240+
spans: vec![CodeLabelSpan::code_range(0..name.len())],
241+
filter_range: (0..name.len()).into(),
242+
code: name.clone(),
243+
}),
240244
}
241245
}
242246

0 commit comments

Comments
 (0)