pry 0.9.12.2 → 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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1141 -0
- data/LICENSE +2 -2
- data/README.md +466 -0
- data/bin/pry +4 -7
- data/lib/pry/basic_object.rb +10 -0
- data/lib/pry/block_command.rb +22 -0
- data/lib/pry/class_command.rb +194 -0
- data/lib/pry/cli.rb +97 -92
- data/lib/pry/code/code_file.rb +114 -0
- data/lib/pry/code/code_range.rb +7 -4
- data/lib/pry/code/loc.rb +27 -14
- data/lib/pry/code.rb +62 -90
- data/lib/pry/code_object.rb +83 -39
- data/lib/pry/color_printer.rb +66 -0
- data/lib/pry/command.rb +202 -371
- data/lib/pry/command_set.rb +151 -133
- data/lib/pry/command_state.rb +31 -0
- data/lib/pry/commands/amend_line.rb +86 -82
- data/lib/pry/commands/bang.rb +18 -14
- data/lib/pry/commands/bang_pry.rb +15 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
- data/lib/pry/commands/cat/exception_formatter.rb +85 -73
- data/lib/pry/commands/cat/file_formatter.rb +56 -63
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cat.rb +64 -47
- data/lib/pry/commands/cd.rb +42 -26
- data/lib/pry/commands/change_inspector.rb +34 -0
- data/lib/pry/commands/change_prompt.rb +51 -0
- data/lib/pry/commands/clear_screen.rb +20 -0
- data/lib/pry/commands/code_collector.rb +148 -131
- data/lib/pry/commands/disable_pry.rb +23 -19
- data/lib/pry/commands/easter_eggs.rb +23 -34
- data/lib/pry/commands/edit/exception_patcher.rb +21 -17
- data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
- data/lib/pry/commands/edit.rb +183 -167
- data/lib/pry/commands/exit.rb +40 -35
- data/lib/pry/commands/exit_all.rb +24 -20
- data/lib/pry/commands/exit_program.rb +20 -17
- data/lib/pry/commands/find_method.rb +167 -167
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +153 -132
- data/lib/pry/commands/import_set.rb +20 -15
- data/lib/pry/commands/jump_to.rb +25 -21
- data/lib/pry/commands/list_inspectors.rb +42 -0
- data/lib/pry/commands/ls/constants.rb +75 -0
- data/lib/pry/commands/ls/formatter.rb +55 -0
- data/lib/pry/commands/ls/globals.rb +50 -0
- data/lib/pry/commands/ls/grep.rb +23 -0
- data/lib/pry/commands/ls/instance_vars.rb +40 -0
- data/lib/pry/commands/ls/interrogatable.rb +24 -0
- data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
- data/lib/pry/commands/ls/local_names.rb +37 -0
- data/lib/pry/commands/ls/local_vars.rb +47 -0
- data/lib/pry/commands/ls/ls_entity.rb +65 -0
- data/lib/pry/commands/ls/methods.rb +55 -0
- data/lib/pry/commands/ls/methods_helper.rb +50 -0
- data/lib/pry/commands/ls/self_methods.rb +34 -0
- data/lib/pry/commands/ls.rb +100 -303
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +93 -49
- data/lib/pry/commands/pry_backtrace.rb +22 -18
- data/lib/pry/commands/pry_version.rb +15 -11
- data/lib/pry/commands/raise_up.rb +33 -27
- data/lib/pry/commands/reload_code.rb +57 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +57 -38
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +66 -34
- data/lib/pry/commands/shell_mode.rb +22 -20
- data/lib/pry/commands/show_doc.rb +80 -65
- data/lib/pry/commands/show_info.rb +193 -159
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +113 -33
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +21 -13
- data/lib/pry/commands/watch_expression/expression.rb +43 -0
- data/lib/pry/commands/watch_expression.rb +110 -0
- data/lib/pry/commands/whereami.rb +157 -134
- data/lib/pry/commands/wtf.rb +78 -40
- data/lib/pry/config/attributable.rb +22 -0
- data/lib/pry/config/lazy_value.rb +29 -0
- data/lib/pry/config/memoized_value.rb +34 -0
- data/lib/pry/config/value.rb +24 -0
- data/lib/pry/config.rb +290 -220
- data/lib/pry/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +50 -27
- data/lib/pry/editor.rb +130 -102
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +73 -0
- data/lib/pry/forwardable.rb +27 -0
- data/lib/pry/helpers/base_helpers.rb +22 -151
- data/lib/pry/helpers/command_helpers.rb +55 -63
- data/lib/pry/helpers/documentation_helpers.rb +21 -13
- data/lib/pry/helpers/options_helpers.rb +15 -8
- data/lib/pry/helpers/platform.rb +55 -0
- data/lib/pry/helpers/table.rb +44 -32
- data/lib/pry/helpers/text.rb +96 -86
- data/lib/pry/helpers.rb +3 -0
- data/lib/pry/history.rb +101 -70
- data/lib/pry/hooks.rb +67 -137
- data/lib/pry/indent.rb +79 -73
- data/lib/pry/input_completer.rb +283 -0
- data/lib/pry/input_lock.rb +129 -0
- data/lib/pry/inspector.rb +39 -0
- data/lib/pry/last_exception.rb +61 -0
- data/lib/pry/method/disowned.rb +19 -5
- data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
- data/lib/pry/method/weird_method_locator.rb +80 -44
- data/lib/pry/method.rb +225 -176
- data/lib/pry/object_path.rb +91 -0
- data/lib/pry/output.rb +136 -0
- data/lib/pry/pager.rb +227 -68
- data/lib/pry/prompt.rb +214 -0
- data/lib/pry/pry_class.rb +216 -289
- data/lib/pry/pry_instance.rb +438 -500
- data/lib/pry/repl.rb +256 -0
- data/lib/pry/repl_file_loader.rb +34 -35
- data/lib/pry/ring.rb +89 -0
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +190 -0
- data/lib/pry/slop/option.rb +210 -0
- data/lib/pry/slop.rb +672 -0
- data/lib/pry/syntax_highlighter.rb +26 -0
- data/lib/pry/system_command_handler.rb +17 -0
- data/lib/pry/testable/evalable.rb +24 -0
- data/lib/pry/testable/mockable.rb +22 -0
- data/lib/pry/testable/pry_tester.rb +88 -0
- data/lib/pry/testable/utility.rb +34 -0
- data/lib/pry/testable/variables.rb +52 -0
- data/lib/pry/testable.rb +68 -0
- data/lib/pry/version.rb +3 -1
- data/lib/pry/warning.rb +20 -0
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
- data/lib/pry/wrapped_module.rb +102 -103
- data/lib/pry.rb +135 -261
- metadata +94 -283
- data/.document +0 -2
- data/.gitignore +0 -16
- data/.travis.yml +0 -21
- data/.yardopts +0 -1
- data/CHANGELOG +0 -534
- data/CONTRIBUTORS +0 -55
- data/Gemfile +0 -9
- data/Guardfile +0 -62
- data/README.markdown +0 -400
- data/Rakefile +0 -140
- data/TODO +0 -117
- data/lib/pry/commands/disabled_commands.rb +0 -2
- data/lib/pry/commands/gem_cd.rb +0 -26
- data/lib/pry/commands/gem_install.rb +0 -29
- data/lib/pry/commands/gem_list.rb +0 -33
- data/lib/pry/commands/gem_open.rb +0 -29
- data/lib/pry/commands/gist.rb +0 -102
- data/lib/pry/commands/install_command.rb +0 -51
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/commands.rb +0 -6
- data/lib/pry/completion.rb +0 -304
- data/lib/pry/custom_completions.rb +0 -6
- data/lib/pry/history_array.rb +0 -116
- data/lib/pry/plugins.rb +0 -103
- data/lib/pry/rbx_method.rb +0 -13
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/rubygem.rb +0 -74
- data/lib/pry/terminal.rb +0 -78
- data/lib/pry/test/helper.rb +0 -185
- data/man/pry.1 +0 -195
- data/man/pry.1.html +0 -204
- data/man/pry.1.ronn +0 -141
- data/pry.gemspec +0 -30
- data/spec/Procfile +0 -3
- data/spec/cli_spec.rb +0 -78
- data/spec/code_object_spec.rb +0 -277
- data/spec/code_spec.rb +0 -219
- data/spec/command_helpers_spec.rb +0 -29
- data/spec/command_integration_spec.rb +0 -644
- data/spec/command_set_spec.rb +0 -627
- data/spec/command_spec.rb +0 -821
- data/spec/commands/amend_line_spec.rb +0 -247
- data/spec/commands/bang_spec.rb +0 -19
- data/spec/commands/cat_spec.rb +0 -164
- data/spec/commands/cd_spec.rb +0 -250
- data/spec/commands/disable_pry_spec.rb +0 -25
- data/spec/commands/edit_spec.rb +0 -727
- data/spec/commands/exit_all_spec.rb +0 -34
- data/spec/commands/exit_program_spec.rb +0 -19
- data/spec/commands/exit_spec.rb +0 -34
- data/spec/commands/find_method_spec.rb +0 -70
- data/spec/commands/gem_list_spec.rb +0 -26
- data/spec/commands/gist_spec.rb +0 -79
- data/spec/commands/help_spec.rb +0 -56
- data/spec/commands/hist_spec.rb +0 -181
- data/spec/commands/jump_to_spec.rb +0 -15
- data/spec/commands/ls_spec.rb +0 -181
- data/spec/commands/play_spec.rb +0 -140
- data/spec/commands/raise_up_spec.rb +0 -56
- data/spec/commands/save_file_spec.rb +0 -177
- data/spec/commands/show_doc_spec.rb +0 -510
- data/spec/commands/show_input_spec.rb +0 -17
- data/spec/commands/show_source_spec.rb +0 -782
- data/spec/commands/whereami_spec.rb +0 -203
- data/spec/completion_spec.rb +0 -239
- data/spec/control_d_handler_spec.rb +0 -58
- data/spec/documentation_helper_spec.rb +0 -73
- data/spec/editor_spec.rb +0 -79
- data/spec/exception_whitelist_spec.rb +0 -21
- data/spec/fixtures/candidate_helper1.rb +0 -11
- data/spec/fixtures/candidate_helper2.rb +0 -8
- data/spec/fixtures/example.erb +0 -5
- data/spec/fixtures/example_nesting.rb +0 -33
- data/spec/fixtures/show_source_doc_examples.rb +0 -15
- data/spec/fixtures/testrc +0 -2
- data/spec/fixtures/testrcbad +0 -2
- data/spec/fixtures/whereami_helper.rb +0 -6
- data/spec/helper.rb +0 -34
- data/spec/helpers/bacon.rb +0 -86
- data/spec/helpers/mock_pry.rb +0 -43
- data/spec/helpers/table_spec.rb +0 -105
- data/spec/history_array_spec.rb +0 -67
- data/spec/hooks_spec.rb +0 -522
- data/spec/indent_spec.rb +0 -301
- data/spec/input_stack_spec.rb +0 -90
- data/spec/method_spec.rb +0 -482
- data/spec/prompt_spec.rb +0 -60
- data/spec/pry_defaults_spec.rb +0 -419
- data/spec/pry_history_spec.rb +0 -99
- data/spec/pry_output_spec.rb +0 -95
- data/spec/pry_spec.rb +0 -504
- data/spec/run_command_spec.rb +0 -25
- data/spec/sticky_locals_spec.rb +0 -157
- data/spec/syntax_checking_spec.rb +0 -81
- data/spec/wrapped_module_spec.rb +0 -261
- data/wiki/Customizing-pry.md +0 -397
- data/wiki/Home.md +0 -4
@@ -1,37 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class
|
3
|
-
class
|
4
|
-
attr_accessor :
|
5
|
-
|
4
|
+
class Method
|
5
|
+
class Patcher
|
6
|
+
attr_accessor :method
|
7
|
+
|
8
|
+
# rubocop:disable Style/ClassVars
|
9
|
+
@@source_cache = {}
|
10
|
+
# rubocop:enable Style/ClassVars
|
11
|
+
|
12
|
+
def initialize(method)
|
13
|
+
@method = method
|
14
|
+
end
|
6
15
|
|
7
|
-
def
|
8
|
-
|
9
|
-
@code_object = code_object
|
16
|
+
def self.code_for(filename)
|
17
|
+
@@source_cache[filename]
|
10
18
|
end
|
11
19
|
|
12
20
|
# perform the patch
|
13
|
-
def
|
14
|
-
if
|
21
|
+
def patch_in_ram(source)
|
22
|
+
if method.alias?
|
15
23
|
with_method_transaction do
|
16
|
-
|
24
|
+
redefine source
|
17
25
|
end
|
18
26
|
else
|
19
|
-
|
27
|
+
redefine source
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
31
|
private
|
24
32
|
|
25
|
-
def
|
26
|
-
|
33
|
+
def redefine(source)
|
34
|
+
@@source_cache[cache_key] = source
|
35
|
+
TOPLEVEL_BINDING.eval wrap(source), cache_key
|
27
36
|
end
|
28
37
|
|
29
|
-
|
30
|
-
|
31
|
-
def adjusted_lines
|
32
|
-
lines = code_object.source.lines.to_a
|
33
|
-
lines[0] = definition_line_for_owner(lines.first)
|
34
|
-
lines
|
38
|
+
def cache_key
|
39
|
+
"pry-redefined(0x#{method.owner.object_id.to_s(16)}##{method.name})"
|
35
40
|
end
|
36
41
|
|
37
42
|
# Run some code ensuring that at the end target#meth_name will not have changed.
|
@@ -41,21 +46,21 @@ class Pry
|
|
41
46
|
# transation we make that not happen, which means that alias_method_chains, etc.
|
42
47
|
# continue to work.
|
43
48
|
#
|
44
|
-
# @param [String] meth_name The method name before aliasing
|
45
|
-
# @param [Module] target The owner of the method
|
46
|
-
|
47
49
|
def with_method_transaction
|
48
|
-
temp_name = "__pry_#{
|
49
|
-
|
50
|
-
|
51
|
-
alias_method temp_name,
|
50
|
+
temp_name = "__pry_#{method.original_name}__"
|
51
|
+
method = self.method
|
52
|
+
method.owner.class_eval do
|
53
|
+
alias_method temp_name, method.original_name
|
52
54
|
yield
|
53
|
-
alias_method
|
54
|
-
alias_method
|
55
|
+
alias_method method.name, method.original_name
|
56
|
+
alias_method method.original_name, temp_name
|
55
57
|
end
|
56
|
-
|
57
58
|
ensure
|
58
|
-
|
59
|
+
begin
|
60
|
+
method.send(:remove_method, temp_name)
|
61
|
+
rescue StandardError
|
62
|
+
nil
|
63
|
+
end
|
59
64
|
end
|
60
65
|
|
61
66
|
# Update the definition line so that it can be eval'd directly on the Method's
|
@@ -68,13 +73,15 @@ class Pry
|
|
68
73
|
# This is necessarily done by String manipulation because we can't find out what
|
69
74
|
# syntax is needed for the argument list by ruby-level introspection.
|
70
75
|
#
|
71
|
-
# @param String
|
72
|
-
# @return String The new definition line. e.g. def foo(bar, baz=1)
|
73
|
-
def
|
74
|
-
if line =~
|
75
|
-
"def #{
|
76
|
+
# @param [String] line The original definition line. e.g. def self.foo(bar, baz=1)
|
77
|
+
# @return [String] The new definition line. e.g. def foo(bar, baz=1)
|
78
|
+
def definition_for_owner(line)
|
79
|
+
if line =~ /\Adef (?:.*?\.)?#{Regexp.escape(method.original_name)}(?=[\(\s;]|$)/
|
80
|
+
"def #{method.original_name}#{$'}"
|
76
81
|
else
|
77
|
-
raise CommandError,
|
82
|
+
raise CommandError,
|
83
|
+
"Could not find original `def #{method.original_name}` line " \
|
84
|
+
"to patch."
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
@@ -87,15 +94,17 @@ class Pry
|
|
87
94
|
|
88
95
|
# Update the source code so that when it has the right owner when eval'd.
|
89
96
|
#
|
90
|
-
# This (combined with
|
97
|
+
# This (combined with definition_for_owner) is backup for the case that
|
91
98
|
# wrap_for_nesting fails, to ensure that the method will stil be defined in
|
92
99
|
# the correct place.
|
93
100
|
#
|
94
101
|
# @param [String] source The source to wrap
|
95
102
|
# @return [String]
|
96
103
|
def wrap_for_owner(source)
|
97
|
-
Pry.current[:pry_owner] =
|
98
|
-
|
104
|
+
Pry.current[:pry_owner] = method.owner
|
105
|
+
owner_source = definition_for_owner(source)
|
106
|
+
visibility_fix = "#{method.visibility} #{method.name.to_sym.inspect}"
|
107
|
+
"Pry.current[:pry_owner].class_eval do; #{owner_source}\n#{visibility_fix}\nend"
|
99
108
|
end
|
100
109
|
|
101
110
|
# Update the new source code to have the correct Module.nesting.
|
@@ -111,10 +120,10 @@ class Pry
|
|
111
120
|
# @param [String] source The source to wrap.
|
112
121
|
# @return [String]
|
113
122
|
def wrap_for_nesting(source)
|
114
|
-
nesting = Pry::Code.from_file(
|
123
|
+
nesting = Pry::Code.from_file(method.source_file).nesting_at(method.source_line)
|
115
124
|
|
116
|
-
(nesting + [source] + nesting.map{ "end" } + [""]).join("
|
117
|
-
rescue Pry::Indent::UnparseableNestingError
|
125
|
+
(nesting + [source] + nesting.map { "end" } + [""]).join(";")
|
126
|
+
rescue Pry::Indent::UnparseableNestingError
|
118
127
|
source
|
119
128
|
end
|
120
129
|
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
|
11
|
-
#
|
12
|
-
# search vertically up the
|
13
|
-
# and for 2. we search laterally along the object's
|
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]
|
27
|
+
# @param [Binding] binding
|
27
28
|
# @return [Boolean]
|
28
|
-
def normal_method?(method,
|
29
|
-
method &&
|
30
|
-
|
31
|
-
|
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,
|
35
|
-
!normal_method?(method,
|
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
|
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
|
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
|
-
!!(
|
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,48 +86,64 @@ class Pry
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def target_file
|
73
|
-
|
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.
|
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
|
-
|
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
|
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
|
91
|
-
# __FILE__ and __LINE__ the binding is at, we can hope to
|
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,
|
94
|
-
# methods have the same __FILE__ and __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
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
138
|
+
return guess if normal_method?(guess)
|
139
|
+
break if guess == guess.super
|
140
|
+
|
141
|
+
guess = guess.super
|
110
142
|
end
|
111
143
|
|
112
|
-
# Uhoh... none of the methods in the chain had the right __FILE__ and
|
113
|
-
#
|
114
|
-
#
|
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.
|
115
147
|
nil
|
116
148
|
end
|
117
149
|
|
@@ -122,21 +154,23 @@ class Pry
|
|
122
154
|
# @return [Pry::Method, nil] The Pry::Method representing the
|
123
155
|
# renamed method
|
124
156
|
def find_renamed_method
|
125
|
-
return
|
157
|
+
return unless valid_file?(target_file)
|
158
|
+
|
126
159
|
alias_name = all_methods_for(target_self).find do |v|
|
127
|
-
|
160
|
+
location = target_self.method(v).source_location
|
161
|
+
location && expanded_source_location(location) == renamed_method_source_location
|
128
162
|
end
|
129
163
|
|
130
164
|
alias_name && Pry::Method(target_self.method(alias_name))
|
131
165
|
end
|
132
166
|
|
133
|
-
def expanded_source_location(
|
134
|
-
return
|
167
|
+
def expanded_source_location(source_location)
|
168
|
+
return unless source_location
|
135
169
|
|
136
170
|
if pry_file?
|
137
|
-
|
171
|
+
source_location
|
138
172
|
else
|
139
|
-
[File.expand_path(
|
173
|
+
[File.expand_path(source_location.first), source_location.last]
|
140
174
|
end
|
141
175
|
end
|
142
176
|
|
@@ -148,14 +182,16 @@ class Pry
|
|
148
182
|
# @return [Array<String, Fixnum>] The `source_location` of the
|
149
183
|
# renamed method
|
150
184
|
def renamed_method_source_location
|
151
|
-
|
185
|
+
if defined?(@original_method_source_location)
|
186
|
+
return @original_method_source_location
|
187
|
+
end
|
152
188
|
|
153
189
|
source_index = lines_for_file(target_file)[0..(target_line - 1)].rindex do |v|
|
154
190
|
Pry::Method.method_definition?(method.name, v)
|
155
191
|
end
|
156
192
|
|
157
|
-
@original_method_source_location =
|
158
|
-
[target_file, index_to_line_number(source_index)]
|
193
|
+
@original_method_source_location =
|
194
|
+
source_index && [target_file, index_to_line_number(source_index)]
|
159
195
|
end
|
160
196
|
|
161
197
|
def index_to_line_number(index)
|
@@ -164,7 +200,7 @@ class Pry
|
|
164
200
|
end
|
165
201
|
|
166
202
|
def valid_file?(file)
|
167
|
-
(File.
|
203
|
+
(File.exist?(file) && !File.directory?(file)) || Pry.eval_path == file
|
168
204
|
end
|
169
205
|
|
170
206
|
def lines_for_file(file)
|