
Release Notes: - N/A This PR introduces syntax highlighting for intelephense autocomple. The styling was selected to roughly match PHPStorm's default scheme. Please note that I'm not very familiar with writing Rust, but I'm happy to adapt to any requested changes! ## Examples ### Object attributes, methods and constants   ### Typed enum members   ### Variables Includes altered highlighting for [reserved variable names](https://www.php.net/manual/en/reserved.variables.php).  --------- Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
72 lines
2.2 KiB
Rust
72 lines
2.2 KiB
Rust
mod language_servers;
|
|
|
|
use zed::CodeLabel;
|
|
use zed_extension_api::{self as zed, serde_json, LanguageServerId, Result};
|
|
|
|
use crate::language_servers::{Intelephense, Phpactor};
|
|
|
|
struct PhpExtension {
|
|
intelephense: Option<Intelephense>,
|
|
phpactor: Option<Phpactor>,
|
|
}
|
|
|
|
impl zed::Extension for PhpExtension {
|
|
fn new() -> Self {
|
|
Self {
|
|
intelephense: None,
|
|
phpactor: None,
|
|
}
|
|
}
|
|
|
|
fn language_server_command(
|
|
&mut self,
|
|
language_server_id: &LanguageServerId,
|
|
worktree: &zed::Worktree,
|
|
) -> Result<zed::Command> {
|
|
match language_server_id.as_ref() {
|
|
Intelephense::LANGUAGE_SERVER_ID => {
|
|
let intelephense = self.intelephense.get_or_insert_with(Intelephense::new);
|
|
intelephense.language_server_command(language_server_id, worktree)
|
|
}
|
|
Phpactor::LANGUAGE_SERVER_ID => {
|
|
let phpactor = self.phpactor.get_or_insert_with(Phpactor::new);
|
|
|
|
Ok(zed::Command {
|
|
command: phpactor.language_server_binary_path(language_server_id, worktree)?,
|
|
args: vec!["language-server".into()],
|
|
env: Default::default(),
|
|
})
|
|
}
|
|
language_server_id => Err(format!("unknown language server: {language_server_id}")),
|
|
}
|
|
}
|
|
|
|
fn language_server_workspace_configuration(
|
|
&mut self,
|
|
language_server_id: &LanguageServerId,
|
|
worktree: &zed::Worktree,
|
|
) -> Result<Option<serde_json::Value>> {
|
|
if language_server_id.as_ref() == Intelephense::LANGUAGE_SERVER_ID {
|
|
if let Some(intelephense) = self.intelephense.as_mut() {
|
|
return intelephense.language_server_workspace_configuration(worktree);
|
|
}
|
|
}
|
|
|
|
Ok(None)
|
|
}
|
|
|
|
fn label_for_completion(
|
|
&self,
|
|
language_server_id: &zed::LanguageServerId,
|
|
completion: zed::lsp::Completion,
|
|
) -> Option<CodeLabel> {
|
|
match language_server_id.as_ref() {
|
|
Intelephense::LANGUAGE_SERVER_ID => {
|
|
self.intelephense.as_ref()?.label_for_completion(completion)
|
|
}
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|
|
|
|
zed::register_extension!(PhpExtension);
|