From 35f0d73ce77044f05f631ac2e3e728d311ce6709 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 15:22:04 +1300 Subject: [PATCH 1/6] Fix syntax schemes to compile --- languages/powershell/highlights.scm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/languages/powershell/highlights.scm b/languages/powershell/highlights.scm index e0b1233..7947070 100644 --- a/languages/powershell/highlights.scm +++ b/languages/powershell/highlights.scm @@ -1,12 +1,13 @@ +; Keywords [ "begin" "break" "catch" "class" - "clean" + ; "clean" "continue" "data" - "define" + ; "define" "do" "dynamicparam" "else" @@ -18,7 +19,7 @@ "finally" "for" "foreach" - "from" + ; "from" "function" "hidden" "if" @@ -32,16 +33,16 @@ "trap" "try" "until" - "using" - "var" + ; "using" + ; "var" "while" ] @keyword ; Powershell Workflows [ - "inlinescript", - "parallel", - "sequence", + "inlinescript" + "parallel" + "sequence" "workflow" ] @keyword From 385ec8e6f65d9c55b3371f6dff73460df3e42567 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 15:22:19 +1300 Subject: [PATCH 2/6] Update to latest grammar version --- extension.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.toml b/extension.toml index 44901fb..1b810e3 100644 --- a/extension.toml +++ b/extension.toml @@ -8,7 +8,7 @@ repository = "https://github.com/wingyplus/zed-powershell" [grammars.powershell] repository = "https://github.com/airbus-cert/tree-sitter-powershell" -commit = "804d86fd4ad286bd0cc1c1f0f7b28bd7af6755ad" +commit = "b3fe65637fca35e426dc8c889d86c8724aaa73d5" # v0.24.4 [language_servers.powershell-es] name = "PowerShell Editor Services" From d770eff8d88b68a98b7f89fd79cafa50cee823b6 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 15:22:31 +1300 Subject: [PATCH 3/6] Update to latest Extension API --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fef1965..c9c3838 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "anyhow" @@ -72,7 +72,7 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "powershell" -version = "0.1.0" +version = "0.3.0-dev" dependencies = [ "zed_extension_api", ] @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "zed_extension_api" -version = "0.0.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca8bcaea3feb2d2ce9dbeb061ee48365312a351faa7014c417b0365fe9e459" +checksum = "9fd16b8b30a9dc920fc1678ff852f696b5bdf5b5843bc745a128be0aac29859e" dependencies = [ "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index aed2744..c69b798 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,4 @@ path = "src/powershell.rs" crate-type = ["cdylib"] [dependencies] -zed_extension_api = "0.0.6" +zed_extension_api = "0.2.0" From 2e5525eab448b8baa8c2aea6f46ee69ff30c0907 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 15:23:02 +1300 Subject: [PATCH 4/6] Download Editor Services as required --- src/language_server.rs | 39 ----------------- src/powershell.rs | 99 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 58 deletions(-) delete mode 100644 src/language_server.rs diff --git a/src/language_server.rs b/src/language_server.rs deleted file mode 100644 index 15eb824..0000000 --- a/src/language_server.rs +++ /dev/null @@ -1,39 +0,0 @@ -use zed_extension_api::{self as zed, Result}; - -pub struct PowerShellEditorServices; - -impl PowerShellEditorServices { - /// Install the PowerShellEditorServices. - /// - /// Returns the bundle path after installed. - pub fn install(language_server_id: &zed_extension_api::LanguageServerId) -> Result { - let release = zed::latest_github_release( - "PowerShell/PowerShellEditorServices", - zed::GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - )?; - - let asset = release - .assets - .iter() - .find(|asset| asset.name == "PowerShellEditorServices.zip") - .ok_or_else(|| format!("no PowerShellEditorServices.zip found"))?; - - let path = format!("powershell-es-{}", release.version); - - // TODO: do download when no bundle path found. - // TODO: cache the bundle path. - - zed::set_language_server_installation_status( - &language_server_id, - &zed::LanguageServerInstallationStatus::Downloading, - ); - - zed::download_file(&asset.download_url, &path, zed::DownloadedFileType::Zip) - .map_err(|err| format!("download error {}", err))?; - - Ok(path.to_string()) - } -} diff --git a/src/powershell.rs b/src/powershell.rs index a903b20..50650f9 100644 --- a/src/powershell.rs +++ b/src/powershell.rs @@ -1,8 +1,6 @@ -mod language_server; - -use zed_extension_api::{self as zed, settings::LspSettings}; - -use crate::language_server::PowerShellEditorServices as EditorServices; +use std::fs; +use std::path; +use zed_extension_api::{self as zed, Result}; struct PowerShellExtension { /// The PowerShell binary, default to `pwsh`. @@ -16,7 +14,7 @@ impl zed::Extension for PowerShellExtension { Self: Sized, { Self { - powershell_bin: Some("pwsh".to_string()), + powershell_bin: None, } } @@ -25,21 +23,13 @@ impl zed::Extension for PowerShellExtension { language_server_id: &zed_extension_api::LanguageServerId, worktree: &zed_extension_api::Worktree, ) -> zed_extension_api::Result { - let pwsh_bin = worktree - .which(self.powershell_bin.clone().unwrap().as_str()) - .ok_or_else(|| "No PowerShell command found")?; - - let bundle_path = LspSettings::for_worktree("powershell-es", worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.binary) - .and_then(|binary| binary.path) - .unwrap(); + let pwsh_bin = PowerShellExtension::powershell_binary_path(self, worktree).unwrap(); - // TODO: make remote install works. - // let bundle_path = EditorServices::install(language_server_id) - // .map_err(|err| format!("failed to get editor services: {}", err))?; + let bundle_path = self + .language_server_path(language_server_id) + .map_err(|err| format!("failed to get editor services: {}", err))?; - let command = format!("{bundle_path}/PowerShellEditorServices/Start-EditorServices.ps1 -BundledModulesPath {bundle_path} -Stdio -SessionDetailsPath {bundle_path}/powershell-es.session.json -LogPath {bundle_path}/logs -FeatureFlags @() -AdditionalModules @() -HostName zed -HostProfileId 0 -HostVersion 1.0.0 -LogLevel Diagnostic"); + let command = format!("Import-Module (Join-Path '{bundle_path}' 'PowerShellEditorServices/PowerShellEditorServices.psd1'); Start-EditorServices -Stdio -SessionDetailsPath '{bundle_path}/powershell-es.session.json' -LogPath '{bundle_path}/logs' -FeatureFlags @() -AdditionalModules @() -HostName zed -HostProfileId 0 -HostVersion 1.0.0 -LogLevel Diagnostic"); Ok(zed::Command { command: pwsh_bin, @@ -54,4 +44,75 @@ impl zed::Extension for PowerShellExtension { } } +impl PowerShellExtension { + fn powershell_binary_path(&mut self, worktree: &zed::Worktree) -> Result { + let pwsh_path = match &self.powershell_bin { + Some(path) if fs::metadata(path).map_or(false, |stat| stat.is_file()) => path.clone(), + Some(path) => worktree + .which(path.clone().as_str()) + .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, + None => worktree + .which("pwsh") + .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, + }; + self.powershell_bin = Some(pwsh_path.clone()); + Ok(pwsh_path) + } + + fn language_server_path( + &mut self, + language_server_id: &zed_extension_api::LanguageServerId, + ) -> Result { + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::CheckingForUpdate, + ); + + let release = zed::latest_github_release( + "PowerShell/PowerShellEditorServices", + zed::GithubReleaseOptions { + require_assets: true, + pre_release: false, + }, + )?; + + let asset = release + .assets + .iter() + .find(|asset| asset.name == "PowerShellEditorServices.zip") + .ok_or_else(|| format!("no PowerShellEditorServices.zip found"))?; + + let version_dir = format!("powershell-es-{}", release.version); + let lsp_path = format!("{version_dir}/PowerShellEditorServices/Start-EditorServices.ps1"); + + if !fs::metadata(&lsp_path).map_or(false, |stat| stat.is_file()) { + // Download the asset + zed::set_language_server_installation_status( + &language_server_id, + &zed::LanguageServerInstallationStatus::Downloading, + ); + zed::download_file( + &asset.download_url, + &version_dir, + zed::DownloadedFileType::Zip, + ) + .map_err(|err| format!("download error {}", err))?; + + // Ensure the binary exists + let entries = + fs::read_dir(".").map_err(|e| format!("failed to list working directory {e}"))?; + for entry in entries { + let entry = entry.map_err(|e| format!("failed to load directory entry {e}"))?; + if entry.file_name().to_str() != Some(&version_dir) { + fs::remove_dir_all(entry.path()).ok(); + } + } + } + + let abs_path = + path::absolute(&version_dir).map_err(|e| format!("failed to get absolute path {e}"))?; + Ok(abs_path.display().to_string()) + } +} + zed::register_extension!(PowerShellExtension); From c7cc5023d9933bcae03361f2aaf20680a6bb0d43 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 16:04:55 +1300 Subject: [PATCH 5/6] Add support for psm1 files --- languages/powershell/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/powershell/config.toml b/languages/powershell/config.toml index f2f47f7..00a2c06 100644 --- a/languages/powershell/config.toml +++ b/languages/powershell/config.toml @@ -1,6 +1,6 @@ name = "PowerShell" grammar = "powershell" -path_suffixes = ["ps1"] +path_suffixes = ["ps1", "psm1"] line_comments = ["# "] # autoclose_before = ";:.,=}])>" brackets = [ From 7cf7002f355cf6ad77e152eb03bda17be9e26e94 Mon Sep 17 00:00:00 2001 From: Jerome Brown Date: Mon, 17 Feb 2025 16:05:48 +1300 Subject: [PATCH 6/6] Move operators to an array --- languages/powershell/highlights.scm | 130 ++++++++++++++-------------- 1 file changed, 66 insertions(+), 64 deletions(-) diff --git a/languages/powershell/highlights.scm b/languages/powershell/highlights.scm index 7947070..c3074b6 100644 --- a/languages/powershell/highlights.scm +++ b/languages/powershell/highlights.scm @@ -46,71 +46,73 @@ "workflow" ] @keyword -"-as" @operator -"-ccontains" @operator -"-ceq" @operator -"-cge" @operator -"-cgt" @operator -"-cle" @operator -"-clike" @operator -"-clt" @operator -"-cmatch" @operator -"-cne" @operator -"-cnotcontains" @operator -"-cnotlike" @operator -"-cnotmatch" @operator -"-contains" @operator -"-creplace" @operator -"-csplit" @operator -"-eq" @operator -"-ge" @operator -"-gt" @operator -"-icontains" @operator -"-ieq" @operator -"-ige" @operator -"-igt" @operator -"-ile" @operator -"-ilike" @operator -"-ilt" @operator -"-imatch" @operator -"-in" @operator -"-ine" @operator -"-inotcontains" @operator -"-inotlike" @operator -"-inotmatch" @operator -"-ireplace" @operator -"-is" @operator -"-isnot" @operator -"-isplit" @operator -"-join" @operator -"-le" @operator -"-like" @operator -"-lt" @operator -"-match" @operator -"-ne" @operator -"-notcontains" @operator -"-notin" @operator -"-notlike" @operator -"-notmatch" @operator -"-replace" @operator -"-shl" @operator -"-shr" @operator -"-split" @operator -"-and" @operator -"-or" @operator -"-xor" @operator -"-band" @operator -"-bor" @operator -"-bxor" @operator -"+" @operator -"-" @operator -"/" @operator -"\\" @operator -"%" @operator -"*" @operator -".." @operator -"-not" @operator +[ + "-as" + "-ccontains" + "-ceq" + "-cge" + "-cgt" + "-cle" + "-clike" + "-clt" + "-cmatch" + "-cne" + "-cnotcontains" + "-cnotlike" + "-cnotmatch" + "-contains" + "-creplace" + "-csplit" + "-eq" + "-ge" + "-gt" + "-icontains" + "-ieq" + "-ige" + "-igt" + "-ile" + "-ilike" + "-ilt" + "-imatch" + "-in" + "-ine" + "-inotcontains" + "-inotlike" + "-inotmatch" + "-ireplace" + "-is" + "-isnot" + "-isplit" + "-join" + "-le" + "-like" + "-lt" + "-match" + "-ne" + "-notcontains" + "-notin" + "-notlike" + "-notmatch" + "-replace" + "-shl" + "-shr" + "-split" + "-and" + "-or" + "-xor" + "-band" + "-bor" + "-bxor" + "+" + "-" + "/" + "\\" + "%" + "*" + ".." + "-not" +] @operator [ ","