From ca012cd8e837080e7e927bbbfff83b0301bccd1f Mon Sep 17 00:00:00 2001 From: Kaan Ozkan Date: Fri, 6 Mar 2026 15:34:41 -0500 Subject: [PATCH] Make trigger_reload return success/failure status Change reload from a fire-and-forget notification to a request that returns { success: true/false }. This allows callers (like the Tapioca addon) to skip DSL generation when reload fails, instead of running against stale server state. Server: catch StandardError during reload!, return success status. Client: use make_request instead of send_notification. Related: https://github.com/Shopify/team-ruby-dx/issues/1711 --- lib/ruby_lsp/ruby_lsp_rails/runner_client.rb | 4 ++-- lib/ruby_lsp/ruby_lsp_rails/server.rb | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb b/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb index c966a637..3175b876 100644 --- a/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb +++ b/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb @@ -239,10 +239,10 @@ def delegate_request(server_addon_name:, request_name:, **params) nil end - #: -> void + #: -> Hash[Symbol, untyped]? def trigger_reload log_message("Reloading Rails application") - send_notification("reload") + make_request("reload") rescue MessageError log_message( "Ruby LSP Rails failed to trigger reload", diff --git a/lib/ruby_lsp/ruby_lsp_rails/server.rb b/lib/ruby_lsp/ruby_lsp_rails/server.rb index ce8f3b79..e27341c5 100644 --- a/lib/ruby_lsp/ruby_lsp_rails/server.rb +++ b/lib/ruby_lsp/ruby_lsp_rails/server.rb @@ -321,8 +321,14 @@ def execute(request, params) end when "reload" with_progress("rails-reload", "Reloading Ruby LSP Rails instance") do - with_notification_error_handling(request) do + begin ::Rails.application.reloader.reload! + send_result({ success: true }) + rescue StandardError => e + log_message( + "Request reload failed with #{e.class}:\n#{e.full_message(highlight: false)}", + ) + send_result({ success: false }) end end when "route_location"