php.rs

 1mod language_servers;
 2
 3use std::env;
 4
 5use zed_extension_api::{self as zed, LanguageServerId, Result};
 6
 7use crate::language_servers::{Intelephense, Phpactor};
 8
 9struct PhpExtension {
10    intelephense: Option<Intelephense>,
11    phpactor: Option<Phpactor>,
12}
13
14impl zed::Extension for PhpExtension {
15    fn new() -> Self {
16        Self {
17            intelephense: None,
18            phpactor: None,
19        }
20    }
21
22    fn language_server_command(
23        &mut self,
24        language_server_id: &LanguageServerId,
25        worktree: &zed::Worktree,
26    ) -> Result<zed::Command> {
27        match language_server_id.as_ref() {
28            Intelephense::LANGUAGE_SERVER_ID => {
29                let intelephense = self.intelephense.get_or_insert_with(|| Intelephense::new());
30
31                let server_path = intelephense.server_script_path(language_server_id)?;
32                Ok(zed::Command {
33                    command: zed::node_binary_path()?,
34                    args: vec![
35                        env::current_dir()
36                            .unwrap()
37                            .join(&server_path)
38                            .to_string_lossy()
39                            .to_string(),
40                        "--stdio".to_string(),
41                    ],
42                    env: Default::default(),
43                })
44            }
45            Phpactor::LANGUAGE_SERVER_ID => {
46                let phpactor = self.phpactor.get_or_insert_with(|| Phpactor::new());
47
48                Ok(zed::Command {
49                    command: phpactor.language_server_binary_path(language_server_id, worktree)?,
50                    args: vec!["language-server".into()],
51                    env: Default::default(),
52                })
53            }
54            language_server_id => Err(format!("unknown language server: {language_server_id}")),
55        }
56    }
57}
58
59zed::register_extension!(PhpExtension);