mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parent
30d2d72663
commit
de96ae9b71
2 changed files with 48 additions and 3 deletions
|
@ -1,6 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "reline"
|
require "reline"
|
||||||
|
require 'set'
|
||||||
require_relative "nop"
|
require_relative "nop"
|
||||||
require_relative "../color"
|
require_relative "../color"
|
||||||
|
|
||||||
|
@ -16,13 +17,36 @@ module IRB
|
||||||
klass = (obj.class == Class || obj.class == Module ? obj : obj.class)
|
klass = (obj.class == Class || obj.class == Module ? obj : obj.class)
|
||||||
|
|
||||||
o.dump("constants", obj.constants) if obj.respond_to?(:constants)
|
o.dump("constants", obj.constants) if obj.respond_to?(:constants)
|
||||||
o.dump("#{klass}.methods", obj.singleton_methods(false))
|
dump_singleton_methods(o, klass, obj)
|
||||||
o.dump("#{klass}#methods", klass.public_instance_methods(false))
|
dump_instance_methods(o, klass)
|
||||||
o.dump("instance variables", obj.instance_variables)
|
o.dump("instance variables", obj.instance_variables)
|
||||||
o.dump("class variables", klass.class_variables)
|
o.dump("class variables", klass.class_variables)
|
||||||
o.dump("locals", locals)
|
o.dump("locals", locals)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def dump_singleton_methods(o, klass, obj)
|
||||||
|
maps = class_method_map(obj.singleton_class.ancestors.take_while { |c| c != klass })
|
||||||
|
maps.each do |mod, methods|
|
||||||
|
name = mod == obj.singleton_class ? "#{klass}.methods" : "#{mod}#methods"
|
||||||
|
o.dump(name, methods)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def dump_instance_methods(o, klass)
|
||||||
|
maps = class_method_map(klass.ancestors)
|
||||||
|
maps.each do |mod, methods|
|
||||||
|
o.dump("#{mod}#methods", methods)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def class_method_map(classes)
|
||||||
|
dumped = Set.new
|
||||||
|
classes.reject { |mod| mod >= Object }.map do |mod|
|
||||||
|
methods = mod.public_instance_methods(false).select { |m| dumped.add?(m) }
|
||||||
|
[mod, methods]
|
||||||
|
end.reverse
|
||||||
|
end
|
||||||
|
|
||||||
class Output
|
class Output
|
||||||
MARGIN = " "
|
MARGIN = " "
|
||||||
|
|
||||||
|
|
|
@ -377,7 +377,24 @@ module TestIRB
|
||||||
|
|
||||||
def test_ls
|
def test_ls
|
||||||
input = TestInputMethod.new([
|
input = TestInputMethod.new([
|
||||||
"ls Object.new.tap { |o| o.instance_variable_set(:@a, 1) }\n",
|
"class C\n",
|
||||||
|
" def m1() end\n",
|
||||||
|
"end\n",
|
||||||
|
|
||||||
|
"module M\n",
|
||||||
|
" def m2() end\n",
|
||||||
|
"end\n",
|
||||||
|
|
||||||
|
"module M2\n",
|
||||||
|
" include M\n",
|
||||||
|
" def m3() end\n",
|
||||||
|
"end\n",
|
||||||
|
|
||||||
|
"obj = C.new\n",
|
||||||
|
"obj.instance_variable_set(:@a, 1)\n",
|
||||||
|
"obj.extend M2\n",
|
||||||
|
"def obj.m4() end\n",
|
||||||
|
"ls obj\n",
|
||||||
])
|
])
|
||||||
IRB.init_config(nil)
|
IRB.init_config(nil)
|
||||||
workspace = IRB::WorkSpace.new(self)
|
workspace = IRB::WorkSpace.new(self)
|
||||||
|
@ -390,6 +407,10 @@ module TestIRB
|
||||||
end
|
end
|
||||||
assert_empty err
|
assert_empty err
|
||||||
assert_match(/^instance variables:\s+@a\n/m, out)
|
assert_match(/^instance variables:\s+@a\n/m, out)
|
||||||
|
assert_match(/C#methods: m1\n/m, out)
|
||||||
|
assert_match(/M#methods: m2\n/m, out)
|
||||||
|
assert_match(/M2#methods: m3\n/m, out)
|
||||||
|
assert_match(/C.methods: m4\n/m, out)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_show_source
|
def test_show_source
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue