diff options
author | Stan Lo <stan001212@gmail.com> | 2023-02-28 22:36:06 +0800 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-02-28 14:36:12 +0000 |
commit | 9ddd73060bb64ef6da38f77fc032ac852636de99 (patch) | |
tree | 430ec538a1e06577d95194bcaa3fe6c1cdb849ed /lib/irb/cmd | |
parent | 2d6097a0f588527a6b23679fc1503c361c068200 (diff) |
[ruby/irb] Display and prioritise instance methods in `ls
<module/class>`
(https://github.com/ruby/irb/pull/496)
https://github.com/ruby/irb/commit/e3d21f9329
Diffstat (limited to 'lib/irb/cmd')
-rw-r--r-- | lib/irb/cmd/ls.rb | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/irb/cmd/ls.rb b/lib/irb/cmd/ls.rb index b65fae2bf1..d5a371a4d6 100644 --- a/lib/irb/cmd/ls.rb +++ b/lib/irb/cmd/ls.rb @@ -38,21 +38,34 @@ module IRB def dump_methods(o, klass, obj) singleton_class = begin obj.singleton_class; rescue TypeError; nil end - maps = class_method_map((singleton_class || klass).ancestors) + dumped_mods = Array.new + # singleton_class' ancestors should be at the front + maps = class_method_map(singleton_class&.ancestors || [], dumped_mods) + class_method_map(klass.ancestors, dumped_mods) maps.each do |mod, methods| name = mod == singleton_class ? "#{klass}.methods" : "#{mod}#methods" o.dump(name, methods) end end - def class_method_map(classes) - dumped = Array.new - classes.reject { |mod| mod >= Object }.map do |mod| - methods = mod.public_instance_methods(false).select do |m| - dumped.push(m) unless dumped.include?(m) + def class_method_map(classes, dumped_mods) + dumped_methods = Array.new + classes = classes.reject { |mod| mod >= Object } + classes.map do |mod| + next if dumped_mods.include? mod + + dumped_mods << mod + + methods = mod.public_instance_methods(false).select do |method| + if dumped_methods.include? method + false + else + dumped_methods << method + true + end end + [mod, methods] - end.reverse + end.compact end class Output |