pry 0.10.3 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +439 -16
  3. data/LICENSE +1 -1
  4. data/README.md +362 -302
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +84 -97
  10. data/lib/pry/code/code_file.rb +37 -26
  11. data/lib/pry/code/code_range.rb +7 -5
  12. data/lib/pry/code/loc.rb +26 -13
  13. data/lib/pry/code.rb +42 -31
  14. data/lib/pry/code_object.rb +53 -28
  15. data/lib/pry/color_printer.rb +46 -35
  16. data/lib/pry/command.rb +197 -369
  17. data/lib/pry/command_set.rb +89 -114
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -72
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -46
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +62 -54
  27. data/lib/pry/commands/cd.rb +40 -35
  28. data/lib/pry/commands/change_inspector.rb +29 -22
  29. data/lib/pry/commands/change_prompt.rb +48 -23
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  36. data/lib/pry/commands/edit.rb +185 -157
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -16
  40. data/lib/pry/commands/find_method.rb +168 -162
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +151 -149
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +35 -28
  47. data/lib/pry/commands/ls/constants.rb +59 -31
  48. data/lib/pry/commands/ls/formatter.rb +42 -36
  49. data/lib/pry/commands/ls/globals.rb +38 -36
  50. data/lib/pry/commands/ls/grep.rb +17 -15
  51. data/lib/pry/commands/ls/instance_vars.rb +29 -28
  52. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  53. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  54. data/lib/pry/commands/ls/local_names.rb +26 -24
  55. data/lib/pry/commands/ls/local_vars.rb +38 -30
  56. data/lib/pry/commands/ls/ls_entity.rb +47 -52
  57. data/lib/pry/commands/ls/methods.rb +49 -51
  58. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  59. data/lib/pry/commands/ls/self_methods.rb +23 -21
  60. data/lib/pry/commands/ls.rb +124 -103
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +92 -82
  63. data/lib/pry/commands/pry_backtrace.rb +22 -17
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +60 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -42
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +56 -29
  71. data/lib/pry/commands/shell_mode.rb +22 -18
  72. data/lib/pry/commands/show_doc.rb +80 -70
  73. data/lib/pry/commands/show_info.rb +194 -155
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +110 -42
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +20 -16
  79. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  80. data/lib/pry/commands/watch_expression.rb +89 -84
  81. data/lib/pry/commands/whereami.rb +156 -141
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +310 -20
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +22 -9
  90. data/lib/pry/editor.rb +56 -34
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +13 -18
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +20 -62
  96. data/lib/pry/helpers/command_helpers.rb +52 -62
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -12
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -85
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +81 -55
  104. data/lib/pry/hooks.rb +60 -110
  105. data/lib/pry/indent.rb +74 -68
  106. data/lib/pry/input_completer.rb +199 -158
  107. data/lib/pry/input_lock.rb +7 -10
  108. data/lib/pry/inspector.rb +36 -24
  109. data/lib/pry/last_exception.rb +45 -45
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/method/patcher.rb +14 -8
  112. data/lib/pry/method/weird_method_locator.rb +79 -45
  113. data/lib/pry/method.rb +178 -124
  114. data/lib/pry/object_path.rb +37 -28
  115. data/lib/pry/output.rb +102 -16
  116. data/lib/pry/pager.rb +187 -174
  117. data/lib/pry/prompt.rb +213 -25
  118. data/lib/pry/pry_class.rb +119 -98
  119. data/lib/pry/pry_instance.rb +261 -224
  120. data/lib/pry/repl.rb +83 -29
  121. data/lib/pry/repl_file_loader.rb +27 -22
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +35 -32
  138. data/lib/pry/wrapped_module.rb +68 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +58 -69
  141. data/lib/pry/commands/disabled_commands.rb +0 -2
  142. data/lib/pry/commands/gem_cd.rb +0 -26
  143. data/lib/pry/commands/gem_install.rb +0 -32
  144. data/lib/pry/commands/gem_list.rb +0 -33
  145. data/lib/pry/commands/gem_open.rb +0 -29
  146. data/lib/pry/commands/gist.rb +0 -101
  147. data/lib/pry/commands/install_command.rb +0 -53
  148. data/lib/pry/commands/list_prompts.rb +0 -35
  149. data/lib/pry/commands/simple_prompt.rb +0 -22
  150. data/lib/pry/commands.rb +0 -6
  151. data/lib/pry/config/behavior.rb +0 -139
  152. data/lib/pry/config/convenience.rb +0 -25
  153. data/lib/pry/config/default.rb +0 -161
  154. data/lib/pry/history_array.rb +0 -121
  155. data/lib/pry/plugins.rb +0 -103
  156. data/lib/pry/rbx_path.rb +0 -22
  157. data/lib/pry/rubygem.rb +0 -82
  158. data/lib/pry/terminal.rb +0 -79
  159. data/lib/pry/test/helper.rb +0 -170
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # {Pry::LastException} is a proxy class who wraps an Exception object for
3
5
  # {Pry#last_exception}. it extends the exception object with methods that
@@ -6,56 +8,54 @@
6
8
  # the original exception object is not modified and method calls are forwarded
7
9
  # to the wrapped exception object.
8
10
  #
9
- class Pry::LastException < BasicObject
10
- attr_accessor :bt_index
11
-
12
- def initialize(e)
13
- @e = e
14
- @bt_index = 0
15
- @file, @line = bt_source_location_for(0)
16
- end
17
-
18
- def method_missing(name, *args, &block)
19
- if @e.respond_to?(name)
20
- @e.public_send(name, *args, &block)
21
- else
22
- super
11
+ class Pry
12
+ class LastException < BasicObject
13
+ attr_accessor :bt_index
14
+
15
+ def initialize(exception)
16
+ @exception = exception
17
+ @bt_index = 0
18
+ @file, @line = bt_source_location_for(0)
23
19
  end
24
- end
25
-
26
- def respond_to_missing?(name, include_private = false)
27
- @e.respond_to?(name)
28
- end
29
20
 
30
- #
31
- # @return [String]
32
- # returns the path to a file for the current backtrace. see {#bt_index}.
33
- #
34
- def file
35
- @file
36
- end
21
+ def method_missing(name, *args, &block)
22
+ if @exception.respond_to?(name)
23
+ @exception.public_send(name, *args, &block)
24
+ else
25
+ super
26
+ end
27
+ end
37
28
 
38
- #
39
- # @return [Fixnum]
40
- # returns the line for the current backtrace. see {#bt_index}.
41
- #
42
- def line
43
- @line
44
- end
29
+ def respond_to_missing?(name, include_all = false)
30
+ @exception.respond_to?(name, include_all)
31
+ end
45
32
 
46
- # @return [Exception]
47
- # returns the wrapped exception
48
- #
49
- def wrapped_exception
50
- @e
51
- end
33
+ #
34
+ # @return [String]
35
+ # returns the path to a file for the current backtrace. see {#bt_index}.
36
+ #
37
+ attr_reader :file
38
+
39
+ #
40
+ # @return [Fixnum]
41
+ # returns the line for the current backtrace. see {#bt_index}.
42
+ #
43
+ attr_reader :line
44
+
45
+ # @return [Exception]
46
+ # returns the wrapped exception
47
+ #
48
+ def wrapped_exception
49
+ @exception
50
+ end
52
51
 
53
- def bt_source_location_for(index)
54
- backtrace[index] =~ /(.*):(\d+)/
55
- [$1, $2.to_i]
56
- end
52
+ def bt_source_location_for(index)
53
+ backtrace[index] =~ /(.*):(\d+)/
54
+ [::Regexp.last_match(1), ::Regexp.last_match(2).to_i]
55
+ end
57
56
 
58
- def inc_bt_index
59
- @bt_index = (@bt_index + 1) % backtrace.size
57
+ def inc_bt_index
58
+ @bt_index = (@bt_index + 1) % backtrace.size
59
+ end
60
60
  end
61
61
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class Method
3
5
  # A Disowned Method is one that's been removed from the class on which it was defined.
@@ -20,8 +22,10 @@ class Pry
20
22
  #
21
23
  # @param [Object] receiver
22
24
  # @param [String] method_name
23
- def initialize(receiver, method_name, binding=nil)
24
- @receiver, @name = receiver, method_name
25
+ def initialize(receiver, method_name)
26
+ @receiver = receiver
27
+ @name = method_name
28
+ @method = nil
25
29
  end
26
30
 
27
31
  # Is the method undefined? (aka `Disowned`)
@@ -44,9 +48,19 @@ class Pry
44
48
  end
45
49
 
46
50
  # Raise a more useful error message instead of trying to forward to nil.
47
- def method_missing(meth_name, *args, &block)
48
- raise "Cannot call '#{meth_name}' on an undef'd method." if method(:name).respond_to?(meth_name)
49
- Object.instance_method(:method_missing).bind(self).call(meth_name, *args, &block)
51
+ # rubocop:disable Style/MethodMissingSuper
52
+ def method_missing(method_name, *args, &block)
53
+ if method(:name).respond_to?(method_name)
54
+ raise "Cannot call '#{method_name}' on an undef'd method."
55
+ end
56
+
57
+ method = Object.instance_method(:method_missing).bind(self)
58
+ method.call(method_name, *args, &block)
59
+ end
60
+ # rubocop:enable Style/MethodMissingSuper
61
+
62
+ def respond_to_missing?(method_name, include_private = false)
63
+ !method(:name).respond_to?(method_name) || super
50
64
  end
51
65
  end
52
66
  end
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class Method
3
5
  class Patcher
4
6
  attr_accessor :method
5
7
 
8
+ # rubocop:disable Style/ClassVars
6
9
  @@source_cache = {}
10
+ # rubocop:enable Style/ClassVars
7
11
 
8
12
  def initialize(method)
9
13
  @method = method
@@ -42,9 +46,6 @@ class Pry
42
46
  # transation we make that not happen, which means that alias_method_chains, etc.
43
47
  # continue to work.
44
48
  #
45
- # @param [String] meth_name The method name before aliasing
46
- # @param [Module] target The owner of the method
47
-
48
49
  def with_method_transaction
49
50
  temp_name = "__pry_#{method.original_name}__"
50
51
  method = self.method
@@ -54,9 +55,12 @@ class Pry
54
55
  alias_method method.name, method.original_name
55
56
  alias_method method.original_name, temp_name
56
57
  end
57
-
58
58
  ensure
59
- method.send(:remove_method, temp_name) rescue nil
59
+ begin
60
+ method.send(:remove_method, temp_name)
61
+ rescue StandardError
62
+ nil
63
+ end
60
64
  end
61
65
 
62
66
  # Update the definition line so that it can be eval'd directly on the Method's
@@ -75,7 +79,9 @@ class Pry
75
79
  if line =~ /\Adef (?:.*?\.)?#{Regexp.escape(method.original_name)}(?=[\(\s;]|$)/
76
80
  "def #{method.original_name}#{$'}"
77
81
  else
78
- raise CommandError, "Could not find original `def #{method.original_name}` line to patch."
82
+ raise CommandError,
83
+ "Could not find original `def #{method.original_name}` line " \
84
+ "to patch."
79
85
  end
80
86
  end
81
87
 
@@ -97,7 +103,7 @@ class Pry
97
103
  def wrap_for_owner(source)
98
104
  Pry.current[:pry_owner] = method.owner
99
105
  owner_source = definition_for_owner(source)
100
- visibility_fix = "#{method.visibility.to_s} #{method.name.to_sym.inspect}"
106
+ visibility_fix = "#{method.visibility} #{method.name.to_sym.inspect}"
101
107
  "Pry.current[:pry_owner].class_eval do; #{owner_source}\n#{visibility_fix}\nend"
102
108
  end
103
109
 
@@ -116,7 +122,7 @@ class Pry
116
122
  def wrap_for_nesting(source)
117
123
  nesting = Pry::Code.from_file(method.source_file).nesting_at(method.source_line)
118
124
 
119
- (nesting + [source] + nesting.map{ "end" } + [""]).join(";")
125
+ (nesting + [source] + nesting.map { "end" } + [""]).join(";")
120
126
  rescue Pry::Indent::UnparseableNestingError
121
127
  source
122
128
  end
@@ -1,38 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Pry
2
4
  class Method
3
-
4
5
  # This class is responsible for locating the *real* `Pry::Method`
5
6
  # object captured by a binding.
6
7
  #
7
8
  # Given a `Binding` from inside a method and a 'seed' Pry::Method object,
8
9
  # there are primarily two situations where the seed method doesn't match
9
10
  # the Binding:
10
- # 1. The Pry::Method is from a subclass 2. The Pry::Method represents a method of the same name
11
- # while the original was renamed to something else. For 1. we
12
- # search vertically up the inheritance chain,
13
- # and for 2. we search laterally along the object's method table.
11
+ # 1. The Pry::Method is from a subclass
12
+ # 2. The Pry::Method represents a method of the same name while the original
13
+ # was renamed to something else. For 1. we search vertically up the
14
+ # inheritance chain, and for 2. we search laterally along the object's
15
+ # method table.
14
16
  #
15
17
  # When we locate the method that matches the Binding we wrap it in
16
18
  # Pry::Method and return it, or return nil if we fail.
17
19
  class WeirdMethodLocator
18
20
  class << self
19
-
20
21
  # Whether the given method object matches the associated binding.
21
22
  # If the method object does not match the binding, then it's
22
23
  # most likely not the method captured by the binding, and we
23
24
  # must commence a search.
24
25
  #
25
26
  # @param [Pry::Method] method
26
- # @param [Binding] b
27
+ # @param [Binding] binding
27
28
  # @return [Boolean]
28
- def normal_method?(method, b)
29
- method && (method.source_file && method.source_range rescue false) &&
30
- File.expand_path(method.source_file) == File.expand_path(b.eval('__FILE__')) &&
31
- method.source_range.include?(b.eval('__LINE__'))
29
+ def normal_method?(method, binding)
30
+ if method && method.source_file && method.source_range
31
+ if binding.respond_to?(:source_location)
32
+ binding_file, binding_line = binding.source_location
33
+ else
34
+ binding_file = binding.eval('__FILE__')
35
+ binding_line = binding.eval('__LINE__')
36
+ end
37
+ (File.expand_path(method.source_file) == File.expand_path(binding_file)) &&
38
+ method.source_range.include?(binding_line)
39
+ end
40
+ rescue StandardError
41
+ false
32
42
  end
33
43
 
34
- def weird_method?(method, b)
35
- !normal_method?(method, b)
44
+ def weird_method?(method, binding)
45
+ !normal_method?(method, binding)
36
46
  end
37
47
  end
38
48
 
@@ -43,12 +53,13 @@ class Pry
43
53
  # @param [Binding] target The Binding that captures the method
44
54
  # we want to locate.
45
55
  def initialize(method, target)
46
- @method, @target = method, target
56
+ @method = method
57
+ @target = target
47
58
  end
48
59
 
49
60
  # @return [Pry::Method, nil] The Pry::Method that matches the
50
61
  # given binding.
51
- def get_method
62
+ def find_method
52
63
  find_method_in_superclass || find_renamed_method
53
64
  end
54
65
 
@@ -56,11 +67,16 @@ class Pry
56
67
  # This usually happens when the method captured by the Binding
57
68
  # has been subsequently deleted.
58
69
  def lost_method?
59
- !!(get_method.nil? && renamed_method_source_location)
70
+ !!(find_method.nil? && renamed_method_source_location)
60
71
  end
61
72
 
62
73
  private
63
74
 
75
+ def skip_superclass_search?
76
+ target_mod = @target.eval('self').class
77
+ target_mod.ancestors.take_while { |mod| mod != target_mod }.any?
78
+ end
79
+
64
80
  def normal_method?(method)
65
81
  self.class.normal_method?(method, target)
66
82
  end
@@ -70,50 +86,64 @@ class Pry
70
86
  end
71
87
 
72
88
  def target_file
73
- pry_file? ? target.eval('__FILE__') : File.expand_path(target.eval('__FILE__'))
89
+ file =
90
+ if target.respond_to?(:source_location)
91
+ target.source_location.first
92
+ else
93
+ target.eval('__FILE__')
94
+ end
95
+ pry_file? ? file : File.expand_path(file)
74
96
  end
75
97
 
76
98
  def target_line
77
- target.eval('__LINE__')
99
+ if target.respond_to?(:source_location)
100
+ target.source_location.last
101
+ else
102
+ target.eval('__LINE__')
103
+ end
78
104
  end
79
105
 
80
106
  def pry_file?
81
- Pry.eval_path == target.eval('__FILE__')
107
+ file =
108
+ if target.respond_to?(:source_location)
109
+ target.source_location.first
110
+ else
111
+ target.eval('__FILE__')
112
+ end
113
+ Pry.eval_path == file
82
114
  end
83
115
 
84
- # it's possible in some cases that the method we find by this approach is a sub-method of
85
- # the one we're currently in, consider:
116
+ # it's possible in some cases that the method we find by this approach is
117
+ # a sub-method of the one we're currently in, consider:
86
118
  #
87
119
  # class A; def b; binding.pry; end; end
88
120
  # class B < A; def b; super; end; end
89
121
  #
90
- # Given that we can normally find the source_range of methods, and that we know which
91
- # __FILE__ and __LINE__ the binding is at, we can hope to disambiguate these cases.
122
+ # Given that we can normally find the source_range of methods, and that we
123
+ # know which __FILE__ and __LINE__ the binding is at, we can hope to
124
+ # disambiguate these cases.
92
125
  #
93
- # This obviously won't work if the source is unavaiable for some reason, or if both
94
- # methods have the same __FILE__ and __LINE__, or if we're in rbx where b.eval('__LINE__')
95
- # is broken.
126
+ # This obviously won't work if the source is unavaiable for some reason,
127
+ # or if both methods have the same __FILE__ and __LINE__.
96
128
  #
97
129
  # @return [Pry::Method, nil] The Pry::Method representing the
98
130
  # superclass method.
99
131
  def find_method_in_superclass
100
132
  guess = method
133
+ return guess if skip_superclass_search?
101
134
 
102
135
  while guess
103
136
  # needs rescue if this is a Disowned method or a C method or something...
104
137
  # TODO: Fix up the exception handling so we don't need a bare rescue
105
- if normal_method?(guess)
106
- return guess
107
- elsif guess != guess.super
108
- guess = guess.super
109
- else
110
- break
111
- end
138
+ return guess if normal_method?(guess)
139
+ break if guess == guess.super
140
+
141
+ guess = guess.super
112
142
  end
113
143
 
114
- # Uhoh... none of the methods in the chain had the right __FILE__ and __LINE__
115
- # This may be caused by rbx https://github.com/rubinius/rubinius/issues/953,
116
- # or other unknown circumstances (TODO: we should warn the user when this happens)
144
+ # Uhoh... none of the methods in the chain had the right `__FILE__` and
145
+ # `__LINE__` due to unknown circumstances.
146
+ # TODO: we should warn the user when this happens.
117
147
  nil
118
148
  end
119
149
 
@@ -124,21 +154,23 @@ class Pry
124
154
  # @return [Pry::Method, nil] The Pry::Method representing the
125
155
  # renamed method
126
156
  def find_renamed_method
127
- return if !valid_file?(target_file)
157
+ return unless valid_file?(target_file)
158
+
128
159
  alias_name = all_methods_for(target_self).find do |v|
129
- expanded_source_location(target_self.method(v).source_location) == renamed_method_source_location
160
+ location = target_self.method(v).source_location
161
+ location && expanded_source_location(location) == renamed_method_source_location
130
162
  end
131
163
 
132
164
  alias_name && Pry::Method(target_self.method(alias_name))
133
165
  end
134
166
 
135
- def expanded_source_location(sl)
136
- return if !sl
167
+ def expanded_source_location(source_location)
168
+ return unless source_location
137
169
 
138
170
  if pry_file?
139
- sl
171
+ source_location
140
172
  else
141
- [File.expand_path(sl.first), sl.last]
173
+ [File.expand_path(source_location.first), source_location.last]
142
174
  end
143
175
  end
144
176
 
@@ -150,14 +182,16 @@ class Pry
150
182
  # @return [Array<String, Fixnum>] The `source_location` of the
151
183
  # renamed method
152
184
  def renamed_method_source_location
153
- return @original_method_source_location if defined?(@original_method_source_location)
185
+ if defined?(@original_method_source_location)
186
+ return @original_method_source_location
187
+ end
154
188
 
155
189
  source_index = lines_for_file(target_file)[0..(target_line - 1)].rindex do |v|
156
190
  Pry::Method.method_definition?(method.name, v)
157
191
  end
158
192
 
159
- @original_method_source_location = source_index &&
160
- [target_file, index_to_line_number(source_index)]
193
+ @original_method_source_location =
194
+ source_index && [target_file, index_to_line_number(source_index)]
161
195
  end
162
196
 
163
197
  def index_to_line_number(index)