1mod language_servers;
2
3use zed::lsp::{Completion, Symbol};
4use zed::{CodeLabel, LanguageServerId};
5use zed_extension_api::{self as zed, Result};
6
7use crate::language_servers::Solargraph;
8
9struct RubyExtension {
10 solargraph: Option<Solargraph>,
11}
12
13impl zed::Extension for RubyExtension {
14 fn new() -> Self {
15 Self { solargraph: None }
16 }
17
18 fn language_server_command(
19 &mut self,
20 language_server_id: &LanguageServerId,
21 worktree: &zed::Worktree,
22 ) -> Result<zed::Command> {
23 match language_server_id.as_ref() {
24 Solargraph::LANGUAGE_SERVER_ID => {
25 let solargraph = self.solargraph.get_or_insert_with(|| Solargraph::new());
26
27 Ok(zed::Command {
28 command: solargraph.server_script_path(worktree)?,
29 args: vec!["stdio".into()],
30 env: worktree.shell_env(),
31 })
32 }
33 language_server_id => Err(format!("unknown language server: {language_server_id}")),
34 }
35 }
36
37 fn label_for_symbol(
38 &self,
39 language_server_id: &LanguageServerId,
40 symbol: Symbol,
41 ) -> Option<CodeLabel> {
42 match language_server_id.as_ref() {
43 Solargraph::LANGUAGE_SERVER_ID => self.solargraph.as_ref()?.label_for_symbol(symbol),
44 _ => None,
45 }
46 }
47
48 fn label_for_completion(
49 &self,
50 language_server_id: &LanguageServerId,
51 completion: Completion,
52 ) -> Option<CodeLabel> {
53 match language_server_id.as_ref() {
54 Solargraph::LANGUAGE_SERVER_ID => {
55 self.solargraph.as_ref()?.label_for_completion(completion)
56 }
57 _ => None,
58 }
59 }
60}
61
62zed::register_extension!(RubyExtension);