ruby.rs

 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);