From a054a2a9a331fbc3ca067d0e5b8f2f35149adf04 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 6 Aug 2024 09:10:18 -0400 Subject: [PATCH] ruff: Refactor language server loading (#15852) This PR refactors the language server loading in the Ruff extension to mirror our other extensions. Also fixed an issue where the cached binary path was not being respected. Release Notes: - N/A --- extensions/ruff/src/ruff.rs | 68 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/extensions/ruff/src/ruff.rs b/extensions/ruff/src/ruff.rs index d7e08ed1ad..3bdbaa5783 100644 --- a/extensions/ruff/src/ruff.rs +++ b/extensions/ruff/src/ruff.rs @@ -2,18 +2,49 @@ use std::fs; use zed::LanguageServerId; use zed_extension_api::{self as zed, settings::LspSettings, Result}; +struct RuffBinary { + path: String, + args: Option>, +} + struct RuffExtension { cached_binary_path: Option, } impl RuffExtension { - fn language_server_binary_path( + fn language_server_binary( &mut self, language_server_id: &LanguageServerId, worktree: &zed::Worktree, - ) -> Result { + ) -> Result { + let binary_settings = LspSettings::for_worktree("ruff", 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(RuffBinary { + path, + args: binary_args, + }); + } + if let Some(path) = worktree.which("ruff") { - return Ok(path); + return Ok(RuffBinary { + 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(RuffBinary { + path: path.clone(), + args: binary_args, + }); + } } zed::set_language_server_installation_status( @@ -83,7 +114,10 @@ impl RuffExtension { } self.cached_binary_path = Some(binary_path.clone()); - Ok(binary_path) + Ok(RuffBinary { + path: binary_path, + args: binary_args, + }) } } @@ -96,31 +130,13 @@ impl zed::Extension for RuffExtension { fn language_server_command( &mut self, - server_id: &LanguageServerId, + language_server_id: &LanguageServerId, worktree: &zed::Worktree, ) -> Result { - let mut binary = None; - let mut args = None; - if let Some(binary_settings) = LspSettings::for_worktree(server_id.as_ref(), worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.binary) - { - if let Some(bin_path) = binary_settings.path { - binary = Some(bin_path); - } - if let Some(bin_args) = binary_settings.arguments { - args = Some(bin_args); - } - } - let command = if let Some(binary) = binary { - binary - } else { - self.language_server_binary_path(server_id, worktree)? - }; - let args = args.unwrap_or_else(|| vec!["server".into()]); + let ruff_binary = self.language_server_binary(language_server_id, worktree)?; Ok(zed::Command { - command, - args, + command: ruff_binary.path, + args: ruff_binary.args.unwrap_or_else(|| vec!["server".into()]), env: vec![], }) }