This class is responsible for locating the real `Pry::Method` object captured by a binding.
Given a `Binding` from inside a method and a 'seed' Pry::Method object, there are primarily two situations where the seed method doesn't match the Binding:
The Pry::Method is from a subclass 2. The Pry::Method represents a method of the same name
while the original was renamed to something else. For 1. we search vertically up the inheritance chain, and for 2. we search laterally along the object's method table.
When we locate the method that matches the Binding we wrap it in Pry::Method and return it, or return nil if we fail.
@param [Pry::Method] method The seed method. @param [Binding] target The Binding that captures the method
we want to locate.
# File lib/pry/method/weird_method_locator.rb, line 45 def initialize(method, target) @method, @target = method, target end
Whether the given method object matches the associated binding. If the method object does not match the binding, then it's most likely not the method captured by the binding, and we must commence a search.
@param [Pry::Method] method @param [Binding] b @return [Boolean]
# File lib/pry/method/weird_method_locator.rb, line 28 def normal_method?(method, b) method && (method.source_file && method.source_range rescue false) && File.expand_path(method.source_file) == File.expand_path(b.eval('__FILE__')) && method.source_range.include?(b.eval('__LINE__')) end
# File lib/pry/method/weird_method_locator.rb, line 34 def weird_method?(method, b) !normal_method?(method, b) end
@return [Pry::Method, nil] The Pry::Method that matches the
given binding.
# File lib/pry/method/weird_method_locator.rb, line 51 def get_method find_method_in_superclass || find_renamed_method end
@return [Boolean] Whether the Pry::Method is unrecoverable
This usually happens when the method captured by the Binding has been subsequently deleted.
# File lib/pry/method/weird_method_locator.rb, line 58 def lost_method? !!(get_method.nil? && renamed_method_source_location) end