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