diff --git a/lib/ruby_lsp/listeners/hover.rb b/lib/ruby_lsp/listeners/hover.rb index f7710ae0d2..75a1fe3ecf 100644 --- a/lib/ruby_lsp/listeners/hover.rb +++ b/lib/ruby_lsp/listeners/hover.rb @@ -92,6 +92,14 @@ def initialize(response_builder, global_state, uri, node_context, dispatcher, so #: (Prism::StringNode node) -> void def on_string_node_enter(node) + if @path && File.basename(@path) == GEMFILE_NAME + parent = @node_context.parent + if parent.is_a?(Prism::CallNode) && parent.name == :gem && parent.arguments&.arguments&.first == node + generate_gem_hover(parent) + return + end + end + generate_heredoc_hover(node) end diff --git a/test/requests/hover_expectations_test.rb b/test/requests/hover_expectations_test.rb index 1c496241fd..f180367181 100644 --- a/test/requests/hover_expectations_test.rb +++ b/test/requests/hover_expectations_test.rb @@ -273,13 +273,12 @@ class A end end - def test_hovering_over_gemfile_dependency + def test_hovering_over_gemfile_dependency_using_gem_call source = <<~RUBY gem 'rake' RUBY - # We need to pretend that Sorbet is not a dependency or else we can't properly test - with_server(source, URI("file:///Gemfile"), stub_no_typechecker: true) do |server, uri| + with_server(source, URI("file:///Gemfile")) do |server, uri| server.process_message( id: 1, method: "textDocument/hover", @@ -295,13 +294,48 @@ def test_hovering_over_gemfile_dependency end end + def test_hovering_over_gemfile_dependency_using_gem_name + source = <<~RUBY + gem 'rake' + RUBY + + with_server(source, URI("file:///Gemfile")) do |server, uri| + server.process_message( + id: 1, + method: "textDocument/hover", + params: { textDocument: { uri: uri }, position: { character: 5, line: 0 } }, + ) + + response = server.pop_response.response + + assert_includes(response.contents.value, "rake") + end + end + + def test_hovering_over_gemfile_dependency_triggers_only_for_first_arg + source = <<~RUBY + gem 'rake', '~> 1.0' + RUBY + + with_server(source, URI("file:///Gemfile")) do |server, uri| + server.process_message( + id: 1, + method: "textDocument/hover", + params: { textDocument: { uri: uri }, position: { character: 13, line: 0 } }, + ) + + response = server.pop_response.response + + assert_nil(response) + end + end + def test_hovering_over_gemfile_dependency_with_missing_argument source = <<~RUBY gem() RUBY - # We need to pretend that Sorbet is not a dependency or else we can't properly test - with_server(source, URI("file:///Gemfile"), stub_no_typechecker: true) do |server, uri| + with_server(source, URI("file:///Gemfile")) do |server, uri| server.process_message( id: 1, method: "textDocument/hover", @@ -317,8 +351,7 @@ def test_hovering_over_gemfile_dependency_with_non_gem_argument gem(method_call) RUBY - # We need to pretend that Sorbet is not a dependency or else we can't properly test - with_server(source, URI("file:///Gemfile"), stub_no_typechecker: true) do |server, uri| + with_server(source, URI("file:///Gemfile")) do |server, uri| server.process_message( id: 1, method: "textDocument/hover",