From 191e4ae33f5160bdd6f313e752a4eb719c3707b2 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Sat, 4 Mar 2023 23:34:44 +0800 Subject: [PATCH] [ruby/irb] Drop chained methods' completion support (https://github.com/ruby/irb/pull/529) Consider completion for this example: `foo.bar.b` Without type information, it is hard to know the return value of the `bar` method, so the current implementation interates through `ObjectSpace` to get all possible candidates for the second method. In small projects, the performance and accuracy are acceptable. But in bigger projects, the performance is unacceptable and the accuracy is mostly poor. So this commit drops the support for chained methods' completion. --- lib/irb/completion.rb | 8 -------- test/irb/test_completion.rb | 2 -- 2 files changed, 10 deletions(-) diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb index b3b2ecf924..76111393b6 100644 --- a/lib/irb/completion.rb +++ b/lib/irb/completion.rb @@ -356,14 +356,6 @@ module IRB else # func1.func2 candidates = [] - to_ignore = ignored_modules - ObjectSpace.each_object(Module){|m| - next if (to_ignore.include?(m) rescue true) - next unless m.respond_to?(:instance_methods) # JRuby has modules that represent java packages. They don't include many common ruby methods - candidates.concat m.instance_methods(false).collect{|x| x.to_s} - } - candidates.sort! - candidates.uniq! end if doc_namespace diff --git a/test/irb/test_completion.rb b/test/irb/test_completion.rb index c909b143a4..a16ee5b079 100644 --- a/test/irb/test_completion.rb +++ b/test/irb/test_completion.rb @@ -336,11 +336,9 @@ module TestIRB bind = obj.instance_exec { binding } assert_include(IRB::InputCompletor.retrieve_completion_data("public_hog", bind: bind), "public_hoge") - assert_include(IRB::InputCompletor.retrieve_completion_data("public_hoge.to_s", bind: bind), "public_hoge.to_s") assert_include(IRB::InputCompletor.retrieve_completion_data("public_hoge", bind: bind, doc_namespace: true), "public_hoge") assert_include(IRB::InputCompletor.retrieve_completion_data("private_hog", bind: bind), "private_hoge") - assert_include(IRB::InputCompletor.retrieve_completion_data("private_hoge.to_s", bind: bind), "private_hoge.to_s") assert_include(IRB::InputCompletor.retrieve_completion_data("private_hoge", bind: bind, doc_namespace: true), "private_hoge") end end