diff --git a/src/language_servers/ruby_lsp.rs b/src/language_servers/ruby_lsp.rs index eb66a28..2f99f53 100644 --- a/src/language_servers/ruby_lsp.rs +++ b/src/language_servers/ruby_lsp.rs @@ -86,6 +86,36 @@ impl RubyLsp { _ => None, } } + + pub fn language_server_initialization_options( + &self, + language_server_id: &zed::LanguageServerId, + worktree: &zed::Worktree, + ) -> zed::Result> { + let mut initialization_options = + zed::settings::LspSettings::for_worktree(language_server_id.as_ref(), worktree) + .ok() + .and_then(|lsp_settings| lsp_settings.initialization_options.clone()) + .unwrap_or_else(|| zed::serde_json::json!({})); + + let options_obj = initialization_options + .as_object_mut() + .expect("initialization_options must be an object"); + + let enabled_features = options_obj + .entry("enabledFeatures") + .or_insert_with(|| zed::serde_json::json!({})); + + // Workaround ruby-lsp upstream issue + // https://github.com/zed-extensions/ruby/issues/38 + if let Some(features_obj) = enabled_features.as_object_mut() { + features_obj + .entry("onTypeFormatting") + .or_insert(zed::serde_json::Value::Bool(false)); + } + + Ok(Some(initialization_options)) + } } #[cfg(test)] diff --git a/src/ruby.rs b/src/ruby.rs index a32951c..8453664 100644 --- a/src/ruby.rs +++ b/src/ruby.rs @@ -82,13 +82,18 @@ impl zed::Extension for RubyExtension { language_server_id: &zed::LanguageServerId, worktree: &zed::Worktree, ) -> zed::Result> { - let initialization_options = - zed::settings::LspSettings::for_worktree(language_server_id.as_ref(), worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.initialization_options.clone()) - .unwrap_or_default(); - - Ok(Some(zed::serde_json::json!(initialization_options))) + match language_server_id.as_ref() { + RubyLsp::SERVER_ID => { + let ruby = self.ruby_lsp.get_or_insert_with(RubyLsp::new); + ruby.language_server_initialization_options(language_server_id, worktree) + } + _ => Ok(Some( + zed::settings::LspSettings::for_worktree(language_server_id.as_ref(), worktree) + .ok() + .and_then(|lsp_settings| lsp_settings.initialization_options.clone()) + .unwrap_or_default(), + )), + } } fn label_for_completion(