zig: Add Windows support (#15197)

Uberlicious and Marshall Bowers created

Release Notes:

- N/A

Currently Windows environments do not have a `shell_env`. This causes
the Zig extension to error when trying to call `worktree.shell_env()`
since extensions api isn't yet on `0.0.7` and thus not using wasm-host
`0.0.7` we need to only call for the shell env only on non-windows
systems. 0.0.7 and onward at the moment return a Result from
`shell_env()`. The binary path is also slightly different on windows.

---------

Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>

Change summary

extensions/zig/src/zig.rs | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)

Detailed changes

extensions/zig/src/zig.rs 🔗

@@ -19,7 +19,12 @@ impl ZigExtension {
         worktree: &zed::Worktree,
     ) -> Result<ZlsBinary> {
         let mut args: Option<Vec<String>> = None;
-        let environment = Some(worktree.shell_env());
+
+        let (platform, arch) = zed::current_platform();
+        let environment = match platform {
+            zed::Os::Mac | zed::Os::Linux => Some(worktree.shell_env()),
+            zed::Os::Windows => None,
+        };
 
         if let Ok(lsp_settings) = LspSettings::for_worktree("zls", worktree) {
             if let Some(binary) = lsp_settings.binary {
@@ -72,7 +77,6 @@ impl ZigExtension {
             },
         )?;
 
-        let (platform, arch) = zed::current_platform();
         let asset_name = format!(
             "zls-{arch}-{os}.{extension}",
             arch = match arch {
@@ -98,7 +102,10 @@ impl ZigExtension {
             .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?;
 
         let version_dir = format!("zls-{}", release.version);
-        let binary_path = format!("{version_dir}/bin/zls");
+        let binary_path = match platform {
+            zed::Os::Mac | zed::Os::Linux => format!("{version_dir}/bin/zls"),
+            zed::Os::Windows => format!("{version_dir}/zls.exe"),
+        };
 
         if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) {
             zed::set_language_server_installation_status(