summaryrefslogtreecommitdiff
path: root/lib/irb/cmd
diff options
context:
space:
mode:
authorStan Lo <stan001212@gmail.com>2023-02-28 22:36:06 +0800
committergit <svn-admin@ruby-lang.org>2023-02-28 14:36:12 +0000
commit9ddd73060bb64ef6da38f77fc032ac852636de99 (patch)
tree430ec538a1e06577d95194bcaa3fe6c1cdb849ed /lib/irb/cmd
parent2d6097a0f588527a6b23679fc1503c361c068200 (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.rb27
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