From 46ea1d2214d54d94c5a17c4a031524d52ba031ba Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Thu, 3 Oct 2024 16:15:24 +0100 Subject: [PATCH] Avoid directly calling version to avoid Sorbet error This will avoid breaking add-ons that don't define a `version` method and doesn't require `ruby-lsp` as a dependency when displaying the add-ons in the UI. --- lib/ruby_lsp/server.rb | 11 ++++++++++- test/server_test.rb | 7 ++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/ruby_lsp/server.rb b/lib/ruby_lsp/server.rb index 353934daf..6130d72ab 100644 --- a/lib/ruby_lsp/server.rb +++ b/lib/ruby_lsp/server.rb @@ -89,7 +89,16 @@ def process_message(message) id: message[:id], response: Addon.addons.map do |addon| - { name: addon.name, version: addon.version, errored: addon.error? } + version_method = addon.method(:version) + + # If the add-on doesn't define a `version` method, we'd be calling the abstract method defined by + # Sorbet, which would raise an error. + # Therefore, we only call the method if it's defined by the add-on itself + if version_method.owner != Addon + version = addon.version + end + + { name: addon.name, version: version, errored: addon.error? } end, ), ) diff --git a/test/server_test.rb b/test/server_test.rb index 799ab3b47..b8683ae7e 100644 --- a/test/server_test.rb +++ b/test/server_test.rb @@ -465,7 +465,8 @@ def test_workspace_addons refute(addons_info[0][:errored]) assert_equal("Bar", addons_info[1][:name]) - assert_equal("0.2.0", addons_info[1][:version]) + # It doesn't define a `version` method + assert_nil(addons_info[1][:version]) assert(addons_info[1][:errored]) ensure RubyLsp::Addon.addons.clear @@ -722,10 +723,6 @@ def name end def deactivate; end - - def version - "0.2.0" - end end end