From da6cf1f54b9c5680ae26580440e83ad975f156b9 Mon Sep 17 00:00:00 2001 From: Vinicius Stock Date: Mon, 30 Sep 2024 16:41:17 -0400 Subject: [PATCH] Guess types for chained invocations --- lib/ruby_lsp/type_inferrer.rb | 7 ++++++- test/type_inferrer_test.rb | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/ruby_lsp/type_inferrer.rb b/lib/ruby_lsp/type_inferrer.rb index 2fbf9f86d..e7256860d 100644 --- a/lib/ruby_lsp/type_inferrer.rb +++ b/lib/ruby_lsp/type_inferrer.rb @@ -89,7 +89,12 @@ def infer_receiver_for_call_node(node, node_context) Type.new("#{parts.join("::")}::#{last}::") else - raw_receiver = node.receiver&.slice + + raw_receiver = if receiver.is_a?(Prism::CallNode) + receiver.message + else + receiver&.slice + end if raw_receiver guessed_name = raw_receiver diff --git a/test/type_inferrer_test.rb b/test/type_inferrer_test.rb index 7eb5dc318..366e0363d 100644 --- a/test/type_inferrer_test.rb +++ b/test/type_inferrer_test.rb @@ -197,6 +197,17 @@ class User assert_equal("User", @type_inferrer.infer_receiver_type(node_context).name) end + def test_infer_guessed_types_for_chained_method_calls + node_context = index_and_locate(<<~RUBY, { line: 3, character: 15 }) + class User + end + + something.user.name + RUBY + + assert_equal("User", @type_inferrer.infer_receiver_type(node_context).name) + end + def test_infer_guessed_types_for_instance_variable_receiver node_context = index_and_locate(<<~RUBY, { line: 4, character: 6 }) class User