From 7f19c7ed2304c06969839852c2aa345d006ed44a Mon Sep 17 00:00:00 2001 From: Wouter Coppieters Date: Mon, 2 Jun 2025 10:20:15 +1200 Subject: [PATCH 1/2] Add `steep` LSP --- extension.toml | 4 ++ src/language_servers/mod.rs | 2 + src/language_servers/steep.rs | 76 +++++++++++++++++++++++++++++++++++ src/ruby.rs | 7 +++- 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/language_servers/steep.rs diff --git a/extension.toml b/extension.toml index 810a379..af5e4fa 100644 --- a/extension.toml +++ b/extension.toml @@ -18,6 +18,10 @@ languages = ["Ruby", "ERB"] name = "Rubocop" languages = ["Ruby"] +[language_servers.steep] +name = "Steep" +languages = ["Ruby"] + [grammars.ruby] repository = "https://github.com/tree-sitter/tree-sitter-ruby" commit = "71bd32fb7607035768799732addba884a37a6210" diff --git a/src/language_servers/mod.rs b/src/language_servers/mod.rs index 7ae94f0..6360685 100644 --- a/src/language_servers/mod.rs +++ b/src/language_servers/mod.rs @@ -2,8 +2,10 @@ mod language_server; mod rubocop; mod ruby_lsp; mod solargraph; +mod steep; pub use language_server::LanguageServer; pub use rubocop::*; pub use ruby_lsp::*; pub use solargraph::*; +pub use steep::*; diff --git a/src/language_servers/steep.rs b/src/language_servers/steep.rs new file mode 100644 index 0000000..96fa8b2 --- /dev/null +++ b/src/language_servers/steep.rs @@ -0,0 +1,76 @@ +use super::LanguageServer; +use zed_extension_api::{ + self as zed, set_language_server_installation_status, settings::LspSettings, LanguageServerId, + LanguageServerInstallationStatus, Result, +}; + +pub struct Steep {} + +impl LanguageServer for Steep { + const SERVER_ID: &str = "steep"; + const EXECUTABLE_NAME: &str = "steep"; + const GEM_NAME: &str = "steep"; + + fn get_executable_args() -> Vec { + vec!["langserver".to_string()] + } + + fn language_server_command( + &mut self, + language_server_id: &LanguageServerId, + worktree: &zed::Worktree, + ) -> Result { + let lsp_settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; + + let require_root_steepfile = lsp_settings + .settings + .as_ref() + .and_then(|settings| settings["require_root_steepfile"].as_bool()) + .unwrap_or(true); + + if require_root_steepfile { + if worktree.read_text_file("Steepfile").is_err() { + return Err("Steep language server requires a Steepfile in the project root. You can disable this requirement by setting 'require_root_steepfile': false in your LSP settings.".to_string()); + } + } + + let binary = self.language_server_binary(language_server_id, worktree)?; + + set_language_server_installation_status( + language_server_id, + &LanguageServerInstallationStatus::None, + ); + + Ok(zed::Command { + command: binary.path, + args: binary.args.unwrap_or(Self::get_executable_args()), + env: binary.env.unwrap_or_default(), + }) + } +} + +impl Steep { + pub fn new() -> Self { + Self {} + } +} + +#[cfg(test)] +mod tests { + use crate::language_servers::{LanguageServer, Steep}; + + #[test] + fn test_server_id() { + assert_eq!(Steep::SERVER_ID, "steep"); + } + + #[test] + fn test_executable_name() { + assert_eq!(Steep::EXECUTABLE_NAME, "steep"); + } + + #[test] + fn test_executable_args() { + assert_eq!(Steep::get_executable_args(), vec!["langserver"]); + } +} diff --git a/src/ruby.rs b/src/ruby.rs index 040b8fc..83be193 100644 --- a/src/ruby.rs +++ b/src/ruby.rs @@ -2,7 +2,7 @@ mod bundler; mod command_executor; mod gemset; mod language_servers; -use language_servers::{LanguageServer, Rubocop, RubyLsp, Solargraph}; +use language_servers::{LanguageServer, Rubocop, RubyLsp, Solargraph, Steep}; use zed::lsp::{Completion, Symbol}; use zed::settings::LspSettings; @@ -14,6 +14,7 @@ struct RubyExtension { solargraph: Option, ruby_lsp: Option, rubocop: Option, + steep: Option, } impl zed::Extension for RubyExtension { @@ -39,6 +40,10 @@ impl zed::Extension for RubyExtension { let rubocop = self.rubocop.get_or_insert_with(Rubocop::new); rubocop.language_server_command(language_server_id, worktree) } + Steep::SERVER_ID => { + let steep = self.steep.get_or_insert_with(Steep::new); + steep.language_server_command(language_server_id, worktree) + } language_server_id => Err(format!("unknown language server: {language_server_id}")), } } From 1415b8695926cab2a6af9486afed496b7a6fa4c4 Mon Sep 17 00:00:00 2001 From: Vitaly Slobodin Date: Tue, 3 Jun 2025 21:05:14 +0200 Subject: [PATCH 2/2] steep: make `clippy` happy --- src/language_servers/steep.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/language_servers/steep.rs b/src/language_servers/steep.rs index 96fa8b2..e51a360 100644 --- a/src/language_servers/steep.rs +++ b/src/language_servers/steep.rs @@ -28,10 +28,8 @@ impl LanguageServer for Steep { .and_then(|settings| settings["require_root_steepfile"].as_bool()) .unwrap_or(true); - if require_root_steepfile { - if worktree.read_text_file("Steepfile").is_err() { - return Err("Steep language server requires a Steepfile in the project root. You can disable this requirement by setting 'require_root_steepfile': false in your LSP settings.".to_string()); - } + if require_root_steepfile && worktree.read_text_file("Steepfile").is_err() { + return Err("Steep language server requires a Steepfile in the project root. You can disable this requirement by setting 'require_root_steepfile': false in your LSP settings.".to_string()); } let binary = self.language_server_binary(language_server_id, worktree)?;