@@ -16,7 +16,7 @@ def initialize(irb_context)
16
16
@irb_context = irb_context
17
17
end
18
18
19
- def find_source ( signature , s_count = nil )
19
+ def find_source ( signature , super_level = 0 )
20
20
context_binding = @irb_context . workspace . binding
21
21
case signature
22
22
when /\A [A-Z]\w *(::[A-Z]\w *)*\z / # Const::Name
@@ -27,12 +27,12 @@ def find_source(signature, s_count = nil)
27
27
owner = eval ( Regexp . last_match [ :owner ] , context_binding )
28
28
method = Regexp . last_match [ :method ]
29
29
return unless owner . respond_to? ( :instance_method )
30
- file , line = method_target ( owner , s_count , method , "owner" )
30
+ file , line = method_target ( owner , super_level , method , "owner" )
31
31
when /\A ((?<receiver>.+)(\. |::))?(?<method>[^ :.]+)\z / # method, receiver.method, receiver::method
32
32
receiver = eval ( Regexp . last_match [ :receiver ] || 'self' , context_binding )
33
33
method = Regexp . last_match [ :method ]
34
34
return unless receiver . respond_to? ( method , true )
35
- file , line = method_target ( receiver , s_count , method , "receiver" )
35
+ file , line = method_target ( receiver , super_level , method , "receiver" )
36
36
end
37
37
if file && line && File . exist? ( file )
38
38
Source . new ( file : file , first_line : line , last_line : find_end ( file , line ) )
@@ -60,20 +60,14 @@ def find_end(file, first_line)
60
60
first_line
61
61
end
62
62
63
- def method_target ( owner_receiver , s_count , method , type )
63
+ def method_target ( owner_receiver , super_level , method , type )
64
64
case type
65
65
when "owner"
66
66
target_method = owner_receiver . instance_method ( method )
67
- return target_method . source_location unless s_count
68
67
when "receiver"
69
- if s_count
70
- target_method = owner_receiver . class . instance_method ( method )
71
- else
72
- target_method = method
73
- return owner_receiver . method ( method ) . source_location
74
- end
68
+ target_method = owner_receiver . method ( method )
75
69
end
76
- s_count . times do |s |
70
+ super_level . times do |s |
77
71
target_method = target_method . super_method if target_method
78
72
end
79
73
target_method . nil? ? nil : target_method . source_location
0 commit comments