1mod language_servers;
2
3use zed::CodeLabel;
4use zed_extension_api::{self as zed, serde_json, LanguageServerId, Result};
5
6use crate::language_servers::{Intelephense, Phpactor};
7
8struct PhpExtension {
9 intelephense: Option<Intelephense>,
10 phpactor: Option<Phpactor>,
11}
12
13impl zed::Extension for PhpExtension {
14 fn new() -> Self {
15 Self {
16 intelephense: None,
17 phpactor: None,
18 }
19 }
20
21 fn language_server_command(
22 &mut self,
23 language_server_id: &LanguageServerId,
24 worktree: &zed::Worktree,
25 ) -> Result<zed::Command> {
26 match language_server_id.as_ref() {
27 Intelephense::LANGUAGE_SERVER_ID => {
28 let intelephense = self.intelephense.get_or_insert_with(Intelephense::new);
29 intelephense.language_server_command(language_server_id, worktree)
30 }
31 Phpactor::LANGUAGE_SERVER_ID => {
32 let phpactor = self.phpactor.get_or_insert_with(Phpactor::new);
33
34 Ok(zed::Command {
35 command: phpactor.language_server_binary_path(language_server_id, worktree)?,
36 args: vec!["language-server".into()],
37 env: Default::default(),
38 })
39 }
40 language_server_id => Err(format!("unknown language server: {language_server_id}")),
41 }
42 }
43
44 fn language_server_workspace_configuration(
45 &mut self,
46 language_server_id: &LanguageServerId,
47 worktree: &zed::Worktree,
48 ) -> Result<Option<serde_json::Value>> {
49 if language_server_id.as_ref() == Intelephense::LANGUAGE_SERVER_ID {
50 if let Some(intelephense) = self.intelephense.as_mut() {
51 return intelephense.language_server_workspace_configuration(worktree);
52 }
53 }
54
55 Ok(None)
56 }
57
58 fn label_for_completion(
59 &self,
60 language_server_id: &zed::LanguageServerId,
61 completion: zed::lsp::Completion,
62 ) -> Option<CodeLabel> {
63 match language_server_id.as_ref() {
64 Intelephense::LANGUAGE_SERVER_ID => {
65 self.intelephense.as_ref()?.label_for_completion(completion)
66 }
67 _ => None,
68 }
69 }
70}
71
72zed::register_extension!(PhpExtension);