[前][次][番号順一覧][スレッド一覧]

ruby-changes:73915

From: st0012 <ko1@a...>
Date: Sat, 8 Oct 2022 03:17:58 +0900 (JST)
Subject: [ruby-changes:73915] 7cafe09aec (master): [ruby/irb] Lazily evaluate candidates locals

https://git.ruby-lang.org/ruby.git/commit/?id=7cafe09aec

From 7cafe09aec76924eafe3ca46b0265de44930a67e Mon Sep 17 00:00:00 2001
From: st0012 <stan001212@g...>
Date: Thu, 6 Oct 2022 11:54:11 +0100
Subject: [ruby/irb] Lazily evaluate candidates locals

https://github.com/ruby/irb/commit/19a2fcbd87
---
 lib/irb/completion.rb | 54 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index 35767feeb7..9d386bbeca 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -171,10 +171,10 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L171
         receiver = $1
         message = $3
 
-        candidates = String.instance_methods.collect{|m| m.to_s}
         if doc_namespace
           "String.#{message}"
         else
+          candidates = String.instance_methods.collect{|m| m.to_s}
           select_message(receiver, message, candidates)
         end
 
@@ -183,10 +183,10 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L183
         receiver = $1
         message = $2
 
-        candidates = Regexp.instance_methods.collect{|m| m.to_s}
         if doc_namespace
           "Regexp.#{message}"
         else
+          candidates = Regexp.instance_methods.collect{|m| m.to_s}
           select_message(receiver, message, candidates)
         end
 
@@ -195,10 +195,10 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L195
         receiver = $1
         message = $2
 
-        candidates = Array.instance_methods.collect{|m| m.to_s}
         if doc_namespace
           "Array.#{message}"
         else
+          candidates = Array.instance_methods.collect{|m| m.to_s}
           select_message(receiver, message, candidates)
         end
 
@@ -207,29 +207,33 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L207
         receiver = $1
         message = $2
 
-        proc_candidates = Proc.instance_methods.collect{|m| m.to_s}
-        hash_candidates = Hash.instance_methods.collect{|m| m.to_s}
         if doc_namespace
           ["Proc.#{message}", "Hash.#{message}"]
         else
+          proc_candidates = Proc.instance_methods.collect{|m| m.to_s}
+          hash_candidates = Hash.instance_methods.collect{|m| m.to_s}
           select_message(receiver, message, proc_candidates | hash_candidates)
         end
 
       when /^(:[^:.]*)$/
         # Symbol
-        return nil if doc_namespace
-        sym = $1
-        candidates = Symbol.all_symbols.collect do |s|
-          ":" + s.id2name.encode(Encoding.default_external)
-        rescue EncodingError
-          # ignore
+        if doc_namespace
+          nil
+        else
+          sym = $1
+          candidates = Symbol.all_symbols.collect do |s|
+            ":" + s.id2name.encode(Encoding.default_external)
+          rescue EncodingError
+            # ignore
+          end
+          candidates.grep(/^#{Regexp.quote(sym)}/)
         end
-        candidates.grep(/^#{Regexp.quote(sym)}/)
-
       when /^::([A-Z][^:\.\(\)]*)$/
         # Absolute Constant or class methods
         receiver = $1
+
         candidates = Object.constants.collect{|m| m.to_s}
+
         if doc_namespace
           candidates.find { |i| i == receiver }
         else
@@ -240,15 +244,17 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L244
         # Constant or class methods
         receiver = $1
         message = $2
-        begin
-          candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
-          candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
-        rescue Exception
-          candidates = []
-        end
+
         if doc_namespace
           "#{receiver}::#{message}"
         else
+          begin
+            candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
+            candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
+          rescue Exception
+            candidates = []
+          end
+
           select_message(receiver, message, candidates, "::")
         end
 
@@ -258,10 +264,10 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L264
         sep = $2
         message = $3
 
-        candidates = Symbol.instance_methods.collect{|m| m.to_s}
         if doc_namespace
           "Symbol.#{message}"
         else
+          candidates = Symbol.instance_methods.collect{|m| m.to_s}
           select_message(receiver, message, candidates, sep)
         end
 
@@ -273,6 +279,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L279
 
         begin
           instance = eval(receiver, bind)
+
           if doc_namespace
             "#{instance.class.name}.#{message}"
           else
@@ -283,7 +290,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L290
           if doc_namespace
             nil
           else
-            candidates = []
+            []
           end
         end
 
@@ -305,7 +312,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L312
           if doc_namespace
             nil
           else
-            candidates = []
+            []
           end
         end
 
@@ -313,6 +320,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L320
         # global var
         gvar = $1
         all_gvars = global_variables.collect{|m| m.to_s}
+
         if doc_namespace
           all_gvars.find{ |i| i == gvar }
         else
@@ -356,6 +364,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L364
           candidates.sort!
           candidates.uniq!
         end
+
         if doc_namespace
           rec_class = rec.is_a?(Module) ? rec : rec.class
           "#{rec_class.name}#{sep}#{candidates.find{ |i| i == message }}"
@@ -370,6 +379,7 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/completion.rb#L379
         message = $1
 
         candidates = String.instance_methods(true).collect{|m| m.to_s}
+
         if doc_namespace
           "String.#{candidates.find{ |i| i == message }}"
         else
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]