From a52140c221ffaf7d001f76799279097e44c8586f Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Sun, 25 May 2025 14:03:58 +0200 Subject: [PATCH 01/12] refactor: move omnisharp to language servers --- src/csharp.rs | 145 +++++------------------------- src/language_servers.rs | 3 + src/language_servers/omnisharp.rs | 129 ++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 125 deletions(-) create mode 100644 src/language_servers.rs create mode 100644 src/language_servers/omnisharp.rs diff --git a/src/csharp.rs b/src/csharp.rs index f9da890..e970e0b 100644 --- a/src/csharp.rs +++ b/src/csharp.rs @@ -1,130 +1,18 @@ -use std::fs; -use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result}; +mod language_servers; -struct OmnisharpBinary { - path: String, - args: Option>, -} +use zed_extension_api::{self as zed, Result}; + +use crate::language_servers::Omnisharp; struct CsharpExtension { - cached_binary_path: Option, + omnisharp: Option, } -impl CsharpExtension { - fn language_server_binary( - &mut self, - language_server_id: &LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - let binary_settings = LspSettings::for_worktree("omnisharp", worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.binary); - let binary_args = binary_settings - .as_ref() - .and_then(|binary_settings| binary_settings.arguments.clone()); - - if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { - return Ok(OmnisharpBinary { - path, - args: binary_args, - }); - } - - if let Some(path) = worktree.which("OmniSharp") { - return Ok(OmnisharpBinary { - path, - args: binary_args, - }); - } - - if let Some(path) = &self.cached_binary_path { - if fs::metadata(path).map_or(false, |stat| stat.is_file()) { - return Ok(OmnisharpBinary { - path: path.clone(), - args: binary_args, - }); - } - } - - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::CheckingForUpdate, - ); - let release = zed::latest_github_release( - "OmniSharp/omnisharp-roslyn", - zed::GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - )?; - - let (platform, arch) = zed::current_platform(); - let asset_name = format!( - "omnisharp-{os}-{arch}-net6.0.{extension}", - os = match platform { - zed::Os::Mac => "osx", - zed::Os::Linux => "linux", - zed::Os::Windows => "win", - }, - arch = match arch { - zed::Architecture::Aarch64 => "arm64", - zed::Architecture::X86 => "x86", - zed::Architecture::X8664 => "x64", - }, - extension = match platform { - zed::Os::Mac | zed::Os::Linux => "tar.gz", - zed::Os::Windows => "zip", - } - ); - - let asset = release - .assets - .iter() - .find(|asset| asset.name == asset_name) - .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; - - let version_dir = format!("omnisharp-{}", release.version); - let binary_path = format!("{version_dir}/OmniSharp"); - - if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::Downloading, - ); - - zed::download_file( - &asset.download_url, - &version_dir, - match platform { - zed::Os::Mac | zed::Os::Linux => zed::DownloadedFileType::GzipTar, - zed::Os::Windows => zed::DownloadedFileType::Zip, - }, - ) - .map_err(|e| format!("failed to download file: {e}"))?; - - 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(); - } - } - } - - self.cached_binary_path = Some(binary_path.clone()); - Ok(OmnisharpBinary { - path: binary_path, - args: binary_args, - }) - } -} +impl CsharpExtension {} impl zed::Extension for CsharpExtension { fn new() -> Self { - Self { - cached_binary_path: None, - } + Self { omnisharp: None } } fn language_server_command( @@ -132,12 +20,19 @@ impl zed::Extension for CsharpExtension { language_server_id: &zed::LanguageServerId, worktree: &zed::Worktree, ) -> Result { - let omnisharp_binary = self.language_server_binary(language_server_id, worktree)?; - Ok(zed::Command { - command: omnisharp_binary.path, - args: omnisharp_binary.args.unwrap_or_else(|| vec!["-lsp".into()]), - env: Default::default(), - }) + match language_server_id.as_ref() { + Omnisharp::LANGUAGE_SERVER_ID => { + let omnisharp = self.omnisharp.get_or_insert_with(Omnisharp::new); + let omnisharp_binary = + omnisharp.language_server_binary(language_server_id, worktree)?; + Ok(zed::Command { + command: omnisharp_binary.path, + args: omnisharp_binary.args.unwrap_or_else(|| vec!["-lsp".into()]), + env: Default::default(), + }) + } + language_server_id => Err(format!("unknown language server: {language_server_id}")), + } } } diff --git a/src/language_servers.rs b/src/language_servers.rs new file mode 100644 index 0000000..c775a6a --- /dev/null +++ b/src/language_servers.rs @@ -0,0 +1,3 @@ +mod omnisharp; + +pub use omnisharp::*; diff --git a/src/language_servers/omnisharp.rs b/src/language_servers/omnisharp.rs new file mode 100644 index 0000000..3b0a923 --- /dev/null +++ b/src/language_servers/omnisharp.rs @@ -0,0 +1,129 @@ +use std::fs; +use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result}; + +pub struct Omnisharp { + cached_binary_path: Option, +} + +pub struct OmnisharpBinary { + pub path: String, + pub args: Option>, +} + +impl Omnisharp { + pub const LANGUAGE_SERVER_ID: &'static str = "omnisharp"; + + pub fn new() -> Self { + Self { + cached_binary_path: None, + } + } + + pub fn language_server_binary( + &mut self, + language_server_id: &LanguageServerId, + worktree: &zed::Worktree, + ) -> Result { + let binary_settings = LspSettings::for_worktree("omnisharp", worktree) + .ok() + .and_then(|lsp_settings| lsp_settings.binary); + let binary_args = binary_settings + .as_ref() + .and_then(|binary_settings| binary_settings.arguments.clone()); + + if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { + return Ok(OmnisharpBinary { + path, + args: binary_args, + }); + } + + if let Some(path) = worktree.which("OmniSharp") { + return Ok(OmnisharpBinary { + path, + args: binary_args, + }); + } + + if let Some(path) = &self.cached_binary_path { + if fs::metadata(path).map_or(false, |stat| stat.is_file()) { + return Ok(OmnisharpBinary { + path: path.clone(), + args: binary_args, + }); + } + } + + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::CheckingForUpdate, + ); + let release = zed::latest_github_release( + "OmniSharp/omnisharp-roslyn", + zed::GithubReleaseOptions { + require_assets: true, + pre_release: false, + }, + )?; + + let (platform, arch) = zed::current_platform(); + let asset_name = format!( + "omnisharp-{os}-{arch}-net6.0.{extension}", + os = match platform { + zed::Os::Mac => "osx", + zed::Os::Linux => "linux", + zed::Os::Windows => "win", + }, + arch = match arch { + zed::Architecture::Aarch64 => "arm64", + zed::Architecture::X86 => "x86", + zed::Architecture::X8664 => "x64", + }, + extension = match platform { + zed::Os::Mac | zed::Os::Linux => "tar.gz", + zed::Os::Windows => "zip", + } + ); + + let asset = release + .assets + .iter() + .find(|asset| asset.name == asset_name) + .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; + + let version_dir = format!("omnisharp-{}", release.version); + let binary_path = format!("{version_dir}/OmniSharp"); + + if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::Downloading, + ); + + zed::download_file( + &asset.download_url, + &version_dir, + match platform { + zed::Os::Mac | zed::Os::Linux => zed::DownloadedFileType::GzipTar, + zed::Os::Windows => zed::DownloadedFileType::Zip, + }, + ) + .map_err(|e| format!("failed to download file: {e}"))?; + + 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(); + } + } + } + + self.cached_binary_path = Some(binary_path.clone()); + Ok(OmnisharpBinary { + path: binary_path, + args: binary_args, + }) + } +} From 8ff3168c8cce7379abf60a097a049ba1c894dd46 Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Sun, 25 May 2025 21:25:53 +0200 Subject: [PATCH 02/12] add roslyn language server via binary config --- extension.toml | 11 ++++++-- src/csharp.rs | 12 +++++++- src/language_servers.rs | 2 ++ src/language_servers/roslyn.rs | 50 ++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/language_servers/roslyn.rs diff --git a/extension.toml b/extension.toml index 46490c7..03e7fd2 100644 --- a/extension.toml +++ b/extension.toml @@ -1,15 +1,22 @@ id = "csharp" name = "C#" description = "C# support." -version = "0.1.2" +version = "0.1.3" schema_version = 1 -authors = ["fminkowski "] +authors = [ + "fminkowski ", + "Fabian Freimueller ", +] repository = "https://github.com/zed-extensions/csharp" [language_servers.omnisharp] name = "OmniSharp" language = "CSharp" +[language_servers.roslyn] +name = "Roslyn" +language = "CSharp" + [grammars.c_sharp] repository = "https://github.com/tree-sitter/tree-sitter-c-sharp" commit = "dd5e59721a5f8dae34604060833902b882023aaf" diff --git a/src/csharp.rs b/src/csharp.rs index e970e0b..5c2a48c 100644 --- a/src/csharp.rs +++ b/src/csharp.rs @@ -1,18 +1,23 @@ mod language_servers; +use language_servers::Roslyn; use zed_extension_api::{self as zed, Result}; use crate::language_servers::Omnisharp; struct CsharpExtension { omnisharp: Option, + roslyn: Option, } impl CsharpExtension {} impl zed::Extension for CsharpExtension { fn new() -> Self { - Self { omnisharp: None } + Self { + omnisharp: None, + roslyn: None, + } } fn language_server_command( @@ -31,6 +36,11 @@ impl zed::Extension for CsharpExtension { env: Default::default(), }) } + Roslyn::LANGUAGE_SERVER_ID => { + // Add Roslyn Server + let roslyn = self.roslyn.get_or_insert_with(Roslyn::new); + roslyn.language_server_cmd(language_server_id, worktree) + } language_server_id => Err(format!("unknown language server: {language_server_id}")), } } diff --git a/src/language_servers.rs b/src/language_servers.rs index c775a6a..d67b7a8 100644 --- a/src/language_servers.rs +++ b/src/language_servers.rs @@ -1,3 +1,5 @@ mod omnisharp; +mod roslyn; pub use omnisharp::*; +pub use roslyn::*; diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs new file mode 100644 index 0000000..fc9c15a --- /dev/null +++ b/src/language_servers/roslyn.rs @@ -0,0 +1,50 @@ +use std::fs; + +use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result}; + +pub struct Roslyn { + cached_binary_path: Option, +} + +impl Roslyn { + pub const LANGUAGE_SERVER_ID: &'static str = "roslyn"; + + pub fn new() -> Self { + Roslyn { + cached_binary_path: None, + } + } + + pub fn language_server_cmd( + &mut self, + language_server_id: &LanguageServerId, + worktree: &zed::Worktree, + ) -> Result { + let binary_settings = LspSettings::for_worktree("roslyn", worktree) + .ok() + .and_then(|lsp_settings| lsp_settings.binary); + let binary_args = binary_settings + .as_ref() + .and_then(|binary_settings| binary_settings.arguments.clone()); + + if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { + //Roslyn user config + return Ok(zed::Command { + command: path, + args: binary_args.unwrap_or_default(), + env: Default::default(), + }); + } + + if let Some(path) = &self.cached_binary_path { + if fs::metadata(path).map_or(false, |stat| stat.is_file()) { + return Ok(zed::Command { + command: path.clone(), + args: binary_args.unwrap_or_default(), + env: Default::default(), + }); + } + } + Err("Roslyn binary not found".to_string()) + } +} From 8affb73ba6e461284e4bfcc03c1ccfd4a49e5409 Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Mon, 26 May 2025 15:04:31 +0200 Subject: [PATCH 03/12] feat: add download for language server --- src/language_servers/roslyn.rs | 80 +++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index fc9c15a..0f8520d 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -2,6 +2,8 @@ use std::fs; use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result}; +const REPO: &str = "SofusA/csharp-language-server"; + pub struct Roslyn { cached_binary_path: Option, } @@ -28,7 +30,6 @@ impl Roslyn { .and_then(|binary_settings| binary_settings.arguments.clone()); if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { - //Roslyn user config return Ok(zed::Command { command: path, args: binary_args.unwrap_or_default(), @@ -45,6 +46,81 @@ impl Roslyn { }); } } - Err("Roslyn binary not found".to_string()) + + //Not found locally getting remotely + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::CheckingForUpdate, + ); + let release = zed::latest_github_release( + REPO, + zed::GithubReleaseOptions { + require_assets: true, + pre_release: false, + }, + )?; + + let (platform, arch) = zed::current_platform(); + let asset_name = format!( + "csharp-language-server-{arch}-{os}.{extension}", + os = match platform { + zed::Os::Mac => "apple-darwin", + zed::Os::Linux => "unknown-linux", + zed::Os::Windows => "pc-windows-msvc", + }, + arch = match arch { + zed::Architecture::Aarch64 => "aarch64", + zed::Architecture::X8664 => "x86_64", + zed::Architecture::X86 => "unsupported", + }, + extension = match platform { + zed::Os::Mac | zed::Os::Linux => "tar.gz", + zed::Os::Windows => "zip", + } + ); + + let asset = release + .assets + .iter() + .find(|asset| asset.name == asset_name) + .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; + + let version_dir = format!("roslyn-{}", release.version); + let binary_path = format!("{version_dir}/csharp-language-server"); + + if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::Downloading, + ); + + zed::download_file( + &asset.download_url, + &version_dir, + match platform { + zed::Os::Mac | zed::Os::Linux => zed::DownloadedFileType::GzipTar, + zed::Os::Windows => zed::DownloadedFileType::Zip, + }, + ) + .map_err(|e| format!("failed to download file: {e}"))?; + + zed::make_file_executable(&binary_path)?; + + 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(); + } + } + } + + self.cached_binary_path = Some(binary_path.clone()); + Ok(zed::Command { + command: binary_path, + args: binary_args.unwrap_or_default(), + env: Default::default(), + }) } } From 18db8b45a26d3ccec5ad8102069d45bc9694e6f2 Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Mon, 26 May 2025 15:40:36 +0200 Subject: [PATCH 04/12] chore: removing comment --- src/language_servers/roslyn.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index 0f8520d..d8d4bf8 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -47,7 +47,6 @@ impl Roslyn { } } - //Not found locally getting remotely zed::set_language_server_installation_status( language_server_id, &zed::LanguageServerInstallationStatus::CheckingForUpdate, From ed8aca75b70dc0bd5515ace06c834200276103ab Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Tue, 27 May 2025 16:33:07 +0200 Subject: [PATCH 05/12] feat: add implementation for workspace configuration options for roslyn --- src/csharp.rs | 13 +++++++++ src/language_servers/roslyn.rs | 48 +++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/csharp.rs b/src/csharp.rs index 5c2a48c..4f10051 100644 --- a/src/csharp.rs +++ b/src/csharp.rs @@ -44,6 +44,19 @@ impl zed::Extension for CsharpExtension { language_server_id => Err(format!("unknown language server: {language_server_id}")), } } + + fn language_server_workspace_configuration( + &mut self, + language_server_id: &zed::LanguageServerId, + worktree: &zed::Worktree, + ) -> Result> { + if language_server_id.as_ref() == Roslyn::LANGUAGE_SERVER_ID { + if let Some(roslyn) = self.roslyn.as_mut() { + return roslyn.configuration_options(worktree); + } + } + Ok(None) + } } zed::register_extension!(CsharpExtension); diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index d8d4bf8..99d7ed4 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -1,6 +1,8 @@ use std::fs; -use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result}; +use zed_extension_api::{ + self as zed, serde_json::Map, settings::LspSettings, LanguageServerId, Result, +}; const REPO: &str = "SofusA/csharp-language-server"; @@ -122,4 +124,48 @@ impl Roslyn { env: Default::default(), }) } + + pub fn configuration_options( + &self, + worktree: &zed::Worktree, + ) -> Result> { + let settings = LspSettings::for_worktree("roslyn", worktree) + .ok() + .and_then(|lsp_settings| lsp_settings.settings); + + if let Some(user_settings) = settings { + let transformed_settings = self.transform_settings_for_roslyn(user_settings)?; + return Ok(Some(transformed_settings)); + } + + Ok(None) + } + + fn transform_settings_for_roslyn( + &self, + settings: zed::serde_json::Value, + ) -> Result { + let mut roslyn_config = Map::new(); + + if let zed::serde_json::Value::Object(settings_map) = settings { + for (key, value) in &settings_map { + if key.contains('|') { + // This is already in the language|category format + if let zed::serde_json::Value::Object(nested_settings) = value { + for (nested_key, nested_value) in nested_settings { + // The key already contains the proper format, just add the setting + let roslyn_key = format!("{}.{}", key, nested_key); + roslyn_config.insert(roslyn_key, nested_value.clone()); + } + } + } + // Handle direct roslyn-format settings (fallback for any other format) + else if key.contains('.') { + roslyn_config.insert(key.clone(), value.clone()); + } + } + } + + Ok(zed::serde_json::Value::Object(roslyn_config)) + } } From f346ea1496969eacf514ca55c7a26706557d8877 Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Tue, 3 Jun 2025 18:17:33 +0200 Subject: [PATCH 06/12] Update src/language_servers/roslyn.rs Co-authored-by: Dylan Hackworth --- src/language_servers/roslyn.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index 99d7ed4..f53f8a3 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -66,7 +66,7 @@ impl Roslyn { "csharp-language-server-{arch}-{os}.{extension}", os = match platform { zed::Os::Mac => "apple-darwin", - zed::Os::Linux => "unknown-linux", + zed::Os::Linux => "unknown-linux-gnu", zed::Os::Windows => "pc-windows-msvc", }, arch = match arch { From e2d4b3e43be7c353dcefeadabe3ecbff322a6a9a Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 07:30:50 +0200 Subject: [PATCH 07/12] Update extension.toml Co-authored-by: Finn Evers --- extension.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.toml b/extension.toml index 03e7fd2..5c3bdae 100644 --- a/extension.toml +++ b/extension.toml @@ -1,7 +1,7 @@ id = "csharp" name = "C#" description = "C# support." -version = "0.1.3" +version = "0.1.2" schema_version = 1 authors = [ "fminkowski ", From 31a8ba6b226b26b0555c5f0a3947a6206b6a1c1b Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 07:31:34 +0200 Subject: [PATCH 08/12] Update src/language_servers/roslyn.rs Suggestion for dedup Co-authored-by: Finn Evers --- src/language_servers/roslyn.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index f53f8a3..e101646 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -31,7 +31,15 @@ impl Roslyn { .as_ref() .and_then(|binary_settings| binary_settings.arguments.clone()); - if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { + if let Some(path) = binary_settings + .and_then(|binary_settings| binary_settings.path) + .or_else(|| { + self.cached_binary_path + .as_ref() + .filter(|path| fs::metadata(path).map_or(false, |stat| stat.is_file())) + .cloned() + }) + { return Ok(zed::Command { command: path, args: binary_args.unwrap_or_default(), @@ -39,15 +47,6 @@ impl Roslyn { }); } - if let Some(path) = &self.cached_binary_path { - if fs::metadata(path).map_or(false, |stat| stat.is_file()) { - return Ok(zed::Command { - command: path.clone(), - args: binary_args.unwrap_or_default(), - env: Default::default(), - }); - } - } zed::set_language_server_installation_status( language_server_id, From 4e858d4ef4dcdcbde54e33205b799a6049915f2d Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 08:20:02 +0200 Subject: [PATCH 09/12] updated for PR Review --- .../mod.rs} | 4 +-- src/language_servers/roslyn.rs | 26 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) rename src/{language_servers.rs => language_servers/mod.rs} (54%) diff --git a/src/language_servers.rs b/src/language_servers/mod.rs similarity index 54% rename from src/language_servers.rs rename to src/language_servers/mod.rs index d67b7a8..4d8ce91 100644 --- a/src/language_servers.rs +++ b/src/language_servers/mod.rs @@ -1,5 +1,5 @@ -mod omnisharp; -mod roslyn; +pub mod omnisharp; +pub mod roslyn; pub use omnisharp::*; pub use roslyn::*; diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index e101646..ea8bb45 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -24,7 +24,7 @@ impl Roslyn { language_server_id: &LanguageServerId, worktree: &zed::Worktree, ) -> Result { - let binary_settings = LspSettings::for_worktree("roslyn", worktree) + let binary_settings = LspSettings::for_worktree(Self::LANGUAGE_SERVER_ID, worktree) .ok() .and_then(|lsp_settings| lsp_settings.binary); let binary_args = binary_settings @@ -47,7 +47,6 @@ impl Roslyn { }); } - zed::set_language_server_installation_status( language_server_id, &zed::LanguageServerInstallationStatus::CheckingForUpdate, @@ -61,6 +60,15 @@ impl Roslyn { )?; let (platform, arch) = zed::current_platform(); + + let arch_str = match arch { + zed::Architecture::Aarch64 => "aarch64", + zed::Architecture::X8664 => "x86_64", + zed::Architecture::X86 => { + return Err(format!("Unsupported processor architecture: {:?}", arch)); + } + }; + let asset_name = format!( "csharp-language-server-{arch}-{os}.{extension}", os = match platform { @@ -68,11 +76,7 @@ impl Roslyn { zed::Os::Linux => "unknown-linux-gnu", zed::Os::Windows => "pc-windows-msvc", }, - arch = match arch { - zed::Architecture::Aarch64 => "aarch64", - zed::Architecture::X8664 => "x86_64", - zed::Architecture::X86 => "unsupported", - }, + arch = arch_str, extension = match platform { zed::Os::Mac | zed::Os::Linux => "tar.gz", zed::Os::Windows => "zip", @@ -128,12 +132,12 @@ impl Roslyn { &self, worktree: &zed::Worktree, ) -> Result> { - let settings = LspSettings::for_worktree("roslyn", worktree) + let settings = LspSettings::for_worktree(Self::LANGUAGE_SERVER_ID, worktree) .ok() .and_then(|lsp_settings| lsp_settings.settings); if let Some(user_settings) = settings { - let transformed_settings = self.transform_settings_for_roslyn(user_settings)?; + let transformed_settings = self.transform_settings_for_roslyn(user_settings); return Ok(Some(transformed_settings)); } @@ -143,7 +147,7 @@ impl Roslyn { fn transform_settings_for_roslyn( &self, settings: zed::serde_json::Value, - ) -> Result { + ) -> zed::serde_json::Value { let mut roslyn_config = Map::new(); if let zed::serde_json::Value::Object(settings_map) = settings { @@ -165,6 +169,6 @@ impl Roslyn { } } - Ok(zed::serde_json::Value::Object(roslyn_config)) + zed::serde_json::Value::Object(roslyn_config) } } From 53e5095eb7668da5df7ebb4b9f4767c6c5935ff3 Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 10:28:26 +0200 Subject: [PATCH 10/12] Update src/language_servers/roslyn.rs Co-authored-by: Finn Evers --- src/language_servers/roslyn.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index ea8bb45..5b919a4 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -136,12 +136,7 @@ impl Roslyn { .ok() .and_then(|lsp_settings| lsp_settings.settings); - if let Some(user_settings) = settings { - let transformed_settings = self.transform_settings_for_roslyn(user_settings); - return Ok(Some(transformed_settings)); - } - - Ok(None) + Ok(settings.map(|user_settings| self.transform_settings_for_user(user_settings)) } fn transform_settings_for_roslyn( From a135c641669b23a7ecdfb06485370c07f16dbefe Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 10:31:40 +0200 Subject: [PATCH 11/12] made arch error message specific to the roslyn wrapper --- src/language_servers/roslyn.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index 5b919a4..ddd2ef6 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -65,7 +65,7 @@ impl Roslyn { zed::Architecture::Aarch64 => "aarch64", zed::Architecture::X8664 => "x86_64", zed::Architecture::X86 => { - return Err(format!("Unsupported processor architecture: {:?}", arch)); + return Err(format!("The roslyn lsp server wrapper does not support the following processor architecture: {:?}", arch)); } }; @@ -136,7 +136,7 @@ impl Roslyn { .ok() .and_then(|lsp_settings| lsp_settings.settings); - Ok(settings.map(|user_settings| self.transform_settings_for_user(user_settings)) + Ok(settings.map(|user_settings| self.transform_settings_for_user(user_settings))) } fn transform_settings_for_roslyn( From 13a207f4afd9f5416e68e5e8fcdbaebfd0611a7b Mon Sep 17 00:00:00 2001 From: Fabian Freimueller Date: Thu, 31 Jul 2025 10:39:16 +0200 Subject: [PATCH 12/12] add missing parenthesis --- src/language_servers/roslyn.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language_servers/roslyn.rs b/src/language_servers/roslyn.rs index ddd2ef6..8d0da21 100644 --- a/src/language_servers/roslyn.rs +++ b/src/language_servers/roslyn.rs @@ -136,7 +136,7 @@ impl Roslyn { .ok() .and_then(|lsp_settings| lsp_settings.settings); - Ok(settings.map(|user_settings| self.transform_settings_for_user(user_settings))) + Ok(settings.map(|user_settings| self.transform_settings_for_roslyn(user_settings))) } fn transform_settings_for_roslyn(