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![], }) }