irb 1.11.2 → 1.12.0
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 +4 -4
- data/README.md +10 -8
- data/lib/irb/cmd/nop.rb +3 -52
- data/lib/irb/{cmd → command}/backtrace.rb +1 -1
- data/lib/irb/command/base.rb +64 -0
- data/lib/irb/{cmd → command}/break.rb +1 -1
- data/lib/irb/{cmd → command}/catch.rb +1 -1
- data/lib/irb/{cmd → command}/chws.rb +4 -6
- data/lib/irb/{cmd → command}/continue.rb +1 -1
- data/lib/irb/{cmd → command}/debug.rb +3 -4
- data/lib/irb/{cmd → command}/delete.rb +1 -1
- data/lib/irb/command/edit.rb +70 -0
- data/lib/irb/{cmd → command}/exit.rb +2 -4
- data/lib/irb/{cmd → command}/finish.rb +1 -1
- data/lib/irb/command/force_exit.rb +20 -0
- data/lib/irb/command/help.rb +84 -0
- data/lib/irb/{cmd → command}/history.rb +3 -3
- data/lib/irb/{cmd → command}/info.rb +1 -1
- data/lib/irb/{cmd → command}/irb_info.rb +5 -6
- data/lib/irb/{cmd → command}/load.rb +3 -5
- data/lib/irb/{cmd → command}/ls.rb +10 -4
- data/lib/irb/{cmd → command}/measure.rb +2 -4
- data/lib/irb/{cmd → command}/next.rb +1 -1
- data/lib/irb/{cmd → command}/pushws.rb +20 -5
- data/lib/irb/{cmd → command}/show_doc.rb +17 -5
- data/lib/irb/{cmd → command}/show_source.rb +26 -10
- data/lib/irb/{cmd → command}/step.rb +1 -1
- data/lib/irb/{cmd → command}/subirb.rb +3 -5
- data/lib/irb/{cmd → command}/whereami.rb +2 -4
- data/lib/irb/{extend-command.rb → command.rb} +50 -85
- data/lib/irb/completion.rb +1 -1
- data/lib/irb/context.rb +56 -18
- data/lib/irb/ext/change-ws.rb +4 -4
- data/lib/irb/ext/eval_history.rb +3 -3
- data/lib/irb/ext/loader.rb +4 -4
- data/lib/irb/ext/multi-irb.rb +1 -1
- data/lib/irb/ext/tracer.rb +1 -1
- data/lib/irb/ext/use-loader.rb +6 -8
- data/lib/irb/ext/workspaces.rb +11 -34
- data/lib/irb/frame.rb +1 -1
- data/lib/irb/help.rb +1 -1
- data/lib/irb/history.rb +2 -2
- data/lib/irb/init.rb +22 -14
- data/lib/irb/input-method.rb +18 -2
- data/lib/irb/inspector.rb +2 -2
- data/lib/irb/lc/error.rb +1 -6
- data/lib/irb/lc/ja/error.rb +1 -6
- data/lib/irb/locale.rb +1 -1
- data/lib/irb/notifier.rb +1 -1
- data/lib/irb/output-method.rb +2 -8
- data/lib/irb/ruby-lex.rb +1 -1
- data/lib/irb/source_finder.rb +98 -38
- data/lib/irb/statement.rb +25 -3
- data/lib/irb/version.rb +3 -3
- data/lib/irb/workspace.rb +4 -4
- data/lib/irb/ws-for-case-2.rb +1 -1
- data/lib/irb/xmp.rb +1 -1
- data/lib/irb.rb +29 -22
- metadata +30 -29
- data/lib/irb/cmd/edit.rb +0 -60
- data/lib/irb/cmd/help.rb +0 -23
- data/lib/irb/cmd/show_cmds.rb +0 -59
data/lib/irb/ext/tracer.rb
CHANGED
data/lib/irb/ext/use-loader.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# use-loader.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
5
|
#
|
6
6
|
|
7
|
-
require_relative "../
|
7
|
+
require_relative "../command/load"
|
8
8
|
require_relative "loader"
|
9
9
|
|
10
10
|
class Object
|
@@ -17,12 +17,12 @@ module IRB
|
|
17
17
|
remove_method :irb_load if method_defined?(:irb_load)
|
18
18
|
# Loads the given file similarly to Kernel#load, see IrbLoader#irb_load
|
19
19
|
def irb_load(*opts, &b)
|
20
|
-
|
20
|
+
Command::Load.execute(irb_context, *opts, &b)
|
21
21
|
end
|
22
22
|
remove_method :irb_require if method_defined?(:irb_require)
|
23
23
|
# Loads the given file similarly to Kernel#require
|
24
24
|
def irb_require(*opts, &b)
|
25
|
-
|
25
|
+
Command::Require.execute(irb_context, *opts, &b)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -49,14 +49,12 @@ module IRB
|
|
49
49
|
if IRB.conf[:USE_LOADER] != opt
|
50
50
|
IRB.conf[:USE_LOADER] = opt
|
51
51
|
if opt
|
52
|
-
|
53
|
-
end
|
54
|
-
(class<<@workspace.main;self;end).instance_eval {
|
52
|
+
(class<<workspace.main;self;end).instance_eval {
|
55
53
|
alias_method :load, :irb_load
|
56
54
|
alias_method :require, :irb_require
|
57
55
|
}
|
58
56
|
else
|
59
|
-
(class
|
57
|
+
(class<<workspace.main;self;end).instance_eval {
|
60
58
|
alias_method :load, :__original__load__IRB_use_loader__
|
61
59
|
alias_method :require, :__original__require__IRB_use_loader__
|
62
60
|
}
|
data/lib/irb/ext/workspaces.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# push-ws.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -6,21 +6,6 @@
|
|
6
6
|
|
7
7
|
module IRB # :nodoc:
|
8
8
|
class Context
|
9
|
-
|
10
|
-
# Size of the current WorkSpace stack
|
11
|
-
def irb_level
|
12
|
-
workspace_stack.size
|
13
|
-
end
|
14
|
-
|
15
|
-
# WorkSpaces in the current stack
|
16
|
-
def workspaces
|
17
|
-
if defined? @workspaces
|
18
|
-
@workspaces
|
19
|
-
else
|
20
|
-
@workspaces = []
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
9
|
# Creates a new workspace with the given object or binding, and appends it
|
25
10
|
# onto the current #workspaces stack.
|
26
11
|
#
|
@@ -28,20 +13,16 @@ module IRB # :nodoc:
|
|
28
13
|
# information.
|
29
14
|
def push_workspace(*_main)
|
30
15
|
if _main.empty?
|
31
|
-
if
|
32
|
-
|
33
|
-
|
16
|
+
if @workspace_stack.size > 1
|
17
|
+
# swap the top two workspaces
|
18
|
+
previous_workspace, current_workspace = @workspace_stack.pop(2)
|
19
|
+
@workspace_stack.push current_workspace, previous_workspace
|
20
|
+
end
|
21
|
+
else
|
22
|
+
@workspace_stack.push WorkSpace.new(workspace.binding, _main[0])
|
23
|
+
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
|
24
|
+
main.extend ExtendCommandBundle
|
34
25
|
end
|
35
|
-
ws = workspaces.pop
|
36
|
-
workspaces.push @workspace
|
37
|
-
@workspace = ws
|
38
|
-
return workspaces
|
39
|
-
end
|
40
|
-
|
41
|
-
workspaces.push @workspace
|
42
|
-
@workspace = WorkSpace.new(@workspace.binding, _main[0])
|
43
|
-
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
|
44
|
-
main.extend ExtendCommandBundle
|
45
26
|
end
|
46
27
|
end
|
47
28
|
|
@@ -50,11 +31,7 @@ module IRB # :nodoc:
|
|
50
31
|
#
|
51
32
|
# Also, see #push_workspace.
|
52
33
|
def pop_workspace
|
53
|
-
if
|
54
|
-
print "workspace stack empty\n"
|
55
|
-
return
|
56
|
-
end
|
57
|
-
@workspace = workspaces.pop
|
34
|
+
@workspace_stack.pop if @workspace_stack.size > 1
|
58
35
|
end
|
59
36
|
end
|
60
37
|
end
|
data/lib/irb/frame.rb
CHANGED
data/lib/irb/help.rb
CHANGED
data/lib/irb/history.rb
CHANGED
@@ -16,7 +16,7 @@ module IRB
|
|
16
16
|
if history_file = IRB.conf[:HISTORY_FILE]
|
17
17
|
history_file = File.expand_path(history_file)
|
18
18
|
end
|
19
|
-
history_file = IRB.
|
19
|
+
history_file = IRB.rc_files("_history").first unless history_file
|
20
20
|
if File.exist?(history_file)
|
21
21
|
File.open(history_file, "r:#{IRB.conf[:LC_MESSAGES].encoding}") do |f|
|
22
22
|
f.each { |l|
|
@@ -41,7 +41,7 @@ module IRB
|
|
41
41
|
if history_file = IRB.conf[:HISTORY_FILE]
|
42
42
|
history_file = File.expand_path(history_file)
|
43
43
|
end
|
44
|
-
history_file = IRB.
|
44
|
+
history_file = IRB.rc_files("_history").first unless history_file
|
45
45
|
|
46
46
|
# Change the permission of a file that already exists[BUG #7694]
|
47
47
|
begin
|
data/lib/irb/init.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/init.rb - irb initialize module
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -395,33 +395,41 @@ module IRB # :nodoc:
|
|
395
395
|
# Run the config file
|
396
396
|
def IRB.run_config
|
397
397
|
if @CONF[:RC]
|
398
|
-
|
399
|
-
file = rc_file
|
398
|
+
rc_files.each do |rc|
|
400
399
|
# Because rc_file always returns `HOME/.irbrc` even if no rc file is present, we can't warn users about missing rc files.
|
401
400
|
# Otherwise, it'd be very noisy.
|
402
|
-
load
|
401
|
+
load rc if File.exist?(rc)
|
403
402
|
rescue StandardError, ScriptError => e
|
404
|
-
warn "Error loading RC file '#{
|
403
|
+
warn "Error loading RC file '#{rc}':\n#{e.full_message(highlight: false)}"
|
405
404
|
end
|
406
405
|
end
|
407
406
|
end
|
408
407
|
|
409
408
|
IRBRC_EXT = "rc"
|
410
409
|
def IRB.rc_file(ext = IRBRC_EXT)
|
410
|
+
warn "rc_file is deprecated, please use rc_files instead."
|
411
|
+
rc_files(ext).first
|
412
|
+
end
|
413
|
+
|
414
|
+
def IRB.rc_files(ext = IRBRC_EXT)
|
411
415
|
if !@CONF[:RC_NAME_GENERATOR]
|
416
|
+
@CONF[:RC_NAME_GENERATOR] ||= []
|
417
|
+
existing_rc_file_generators = []
|
418
|
+
|
412
419
|
rc_file_generators do |rcgen|
|
413
|
-
@CONF[:RC_NAME_GENERATOR]
|
414
|
-
if File.exist?(rcgen.call(
|
415
|
-
|
416
|
-
|
417
|
-
|
420
|
+
@CONF[:RC_NAME_GENERATOR] << rcgen
|
421
|
+
existing_rc_file_generators << rcgen if File.exist?(rcgen.call(ext))
|
422
|
+
end
|
423
|
+
|
424
|
+
if existing_rc_file_generators.any?
|
425
|
+
@CONF[:RC_NAME_GENERATOR] = existing_rc_file_generators
|
418
426
|
end
|
419
427
|
end
|
420
|
-
|
421
|
-
|
428
|
+
|
429
|
+
@CONF[:RC_NAME_GENERATOR].map do |rc|
|
430
|
+
rc_file = rc.call(ext)
|
431
|
+
fail IllegalRCNameGenerator unless rc_file.is_a?(String)
|
422
432
|
rc_file
|
423
|
-
else
|
424
|
-
fail IllegalRCNameGenerator
|
425
433
|
end
|
426
434
|
end
|
427
435
|
|
data/lib/irb/input-method.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/input-method.rb - input methods used irb
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -20,7 +20,7 @@ module IRB
|
|
20
20
|
#
|
21
21
|
# See IO#gets for more information.
|
22
22
|
def gets
|
23
|
-
fail NotImplementedError
|
23
|
+
fail NotImplementedError
|
24
24
|
end
|
25
25
|
public :gets
|
26
26
|
|
@@ -44,6 +44,10 @@ module IRB
|
|
44
44
|
false
|
45
45
|
end
|
46
46
|
|
47
|
+
def prompting?
|
48
|
+
false
|
49
|
+
end
|
50
|
+
|
47
51
|
# For debug message
|
48
52
|
def inspect
|
49
53
|
'Abstract InputMethod'
|
@@ -91,6 +95,10 @@ module IRB
|
|
91
95
|
true
|
92
96
|
end
|
93
97
|
|
98
|
+
def prompting?
|
99
|
+
STDIN.tty?
|
100
|
+
end
|
101
|
+
|
94
102
|
# Returns the current line number for #io.
|
95
103
|
#
|
96
104
|
# #line counts the number of times #gets is called.
|
@@ -220,6 +228,10 @@ module IRB
|
|
220
228
|
@eof
|
221
229
|
end
|
222
230
|
|
231
|
+
def prompting?
|
232
|
+
true
|
233
|
+
end
|
234
|
+
|
223
235
|
# For debug message
|
224
236
|
def inspect
|
225
237
|
readline_impl = (defined?(Reline) && Readline == Reline) ? 'Reline' : 'ext/readline'
|
@@ -467,6 +479,10 @@ module IRB
|
|
467
479
|
@eof
|
468
480
|
end
|
469
481
|
|
482
|
+
def prompting?
|
483
|
+
true
|
484
|
+
end
|
485
|
+
|
470
486
|
# For debug message
|
471
487
|
def inspect
|
472
488
|
config = Reline::Config.new
|
data/lib/irb/inspector.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/inspector.rb - inspect methods
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -113,7 +113,7 @@ module IRB # :nodoc:
|
|
113
113
|
Color.colorize_code(v.inspect, colorable: Color.colorable? && Color.inspect_colorable?(v))
|
114
114
|
}
|
115
115
|
Inspector.def_inspector([true, :pp, :pretty_inspect], proc{require_relative "color_printer"}){|v|
|
116
|
-
IRB::ColorPrinter.pp(v, '').chomp
|
116
|
+
IRB::ColorPrinter.pp(v, +'').chomp
|
117
117
|
}
|
118
118
|
Inspector.def_inspector([:yaml, :YAML], proc{require "yaml"}){|v|
|
119
119
|
begin
|
data/lib/irb/lc/error.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/lc/error.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -12,11 +12,6 @@ module IRB
|
|
12
12
|
super("Unrecognized switch: #{val}")
|
13
13
|
end
|
14
14
|
end
|
15
|
-
class NotImplementedError < StandardError
|
16
|
-
def initialize(val)
|
17
|
-
super("Need to define `#{val}'")
|
18
|
-
end
|
19
|
-
end
|
20
15
|
class CantReturnToNormalMode < StandardError
|
21
16
|
def initialize
|
22
17
|
super("Can't return to normal mode.")
|
data/lib/irb/lc/ja/error.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/lc/ja/error.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -12,11 +12,6 @@ module IRB
|
|
12
12
|
super("スイッチ(#{val})が分りません")
|
13
13
|
end
|
14
14
|
end
|
15
|
-
class NotImplementedError < StandardError
|
16
|
-
def initialize(val)
|
17
|
-
super("`#{val}'の定義が必要です")
|
18
|
-
end
|
19
|
-
end
|
20
15
|
class CantReturnToNormalMode < StandardError
|
21
16
|
def initialize
|
22
17
|
super("Normalモードに戻れません.")
|
data/lib/irb/locale.rb
CHANGED
data/lib/irb/notifier.rb
CHANGED
data/lib/irb/output-method.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# output-method.rb - output methods used by irb
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -9,16 +9,10 @@ module IRB
|
|
9
9
|
# IRB::Notifier. You can define your own output method to use with Irb.new,
|
10
10
|
# or Context.new
|
11
11
|
class OutputMethod
|
12
|
-
class NotImplementedError < StandardError
|
13
|
-
def initialize(val)
|
14
|
-
super("Need to define `#{val}'")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
12
|
# Open this method to implement your own output method, raises a
|
19
13
|
# NotImplementedError if you don't define #print in your own class.
|
20
14
|
def print(*opts)
|
21
|
-
raise NotImplementedError
|
15
|
+
raise NotImplementedError
|
22
16
|
end
|
23
17
|
|
24
18
|
# Prints the given +opts+, with a newline delimiter.
|
data/lib/irb/ruby-lex.rb
CHANGED
data/lib/irb/source_finder.rb
CHANGED
@@ -4,12 +4,63 @@ require_relative "ruby-lex"
|
|
4
4
|
|
5
5
|
module IRB
|
6
6
|
class SourceFinder
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
:
|
11
|
-
|
12
|
-
|
7
|
+
class EvaluationError < StandardError; end
|
8
|
+
|
9
|
+
class Source
|
10
|
+
attr_reader :file, :line
|
11
|
+
def initialize(file, line, ast_source = nil)
|
12
|
+
@file = file
|
13
|
+
@line = line
|
14
|
+
@ast_source = ast_source
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_exist?
|
18
|
+
File.exist?(@file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def binary_file?
|
22
|
+
# If the line is zero, it means that the target's source is probably in a binary file.
|
23
|
+
@line.zero?
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_content
|
27
|
+
@file_content ||= File.read(@file)
|
28
|
+
end
|
29
|
+
|
30
|
+
def colorized_content
|
31
|
+
if !binary_file? && file_exist?
|
32
|
+
end_line = find_end
|
33
|
+
# To correctly colorize, we need to colorize full content and extract the relevant lines.
|
34
|
+
colored = IRB::Color.colorize_code(file_content)
|
35
|
+
colored.lines[@line - 1...end_line].join
|
36
|
+
elsif @ast_source
|
37
|
+
IRB::Color.colorize_code(@ast_source)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def find_end
|
44
|
+
lex = RubyLex.new
|
45
|
+
code = file_content
|
46
|
+
lines = code.lines[(@line - 1)..-1]
|
47
|
+
tokens = RubyLex.ripper_lex_without_warning(lines.join)
|
48
|
+
prev_tokens = []
|
49
|
+
|
50
|
+
# chunk with line number
|
51
|
+
tokens.chunk { |tok| tok.pos[0] }.each do |lnum, chunk|
|
52
|
+
code = lines[0..lnum].join
|
53
|
+
prev_tokens.concat chunk
|
54
|
+
continue = lex.should_continue?(prev_tokens)
|
55
|
+
syntax = lex.check_code_syntax(code, local_variables: [])
|
56
|
+
if !continue && syntax == :valid
|
57
|
+
return @line + lnum
|
58
|
+
end
|
59
|
+
end
|
60
|
+
@line
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
13
64
|
private_constant :Source
|
14
65
|
|
15
66
|
def initialize(irb_context)
|
@@ -17,50 +68,47 @@ module IRB
|
|
17
68
|
end
|
18
69
|
|
19
70
|
def find_source(signature, super_level = 0)
|
20
|
-
context_binding = @irb_context.workspace.binding
|
21
71
|
case signature
|
22
|
-
when /\A(::)?[A-Z]\w*(::[A-Z]\w*)*\z/ #
|
23
|
-
|
24
|
-
|
25
|
-
|
72
|
+
when /\A(::)?[A-Z]\w*(::[A-Z]\w*)*\z/ # ConstName, ::ConstName, ConstPath::ConstName
|
73
|
+
eval_receiver_or_owner(signature) # trigger autoload
|
74
|
+
*parts, name = signature.split('::', -1)
|
75
|
+
base =
|
76
|
+
if parts.empty? # ConstName
|
77
|
+
find_const_owner(name)
|
78
|
+
elsif parts == [''] # ::ConstName
|
79
|
+
Object
|
80
|
+
else # ConstPath::ConstName
|
81
|
+
eval_receiver_or_owner(parts.join('::'))
|
82
|
+
end
|
83
|
+
file, line = base.const_source_location(name)
|
26
84
|
when /\A(?<owner>[A-Z]\w*(::[A-Z]\w*)*)#(?<method>[^ :.]+)\z/ # Class#method
|
27
|
-
owner =
|
85
|
+
owner = eval_receiver_or_owner(Regexp.last_match[:owner])
|
28
86
|
method = Regexp.last_match[:method]
|
29
87
|
return unless owner.respond_to?(:instance_method)
|
30
|
-
|
88
|
+
method = method_target(owner, super_level, method, "owner")
|
89
|
+
file, line = method&.source_location
|
31
90
|
when /\A((?<receiver>.+)(\.|::))?(?<method>[^ :.]+)\z/ # method, receiver.method, receiver::method
|
32
|
-
receiver =
|
91
|
+
receiver = eval_receiver_or_owner(Regexp.last_match[:receiver] || 'self')
|
33
92
|
method = Regexp.last_match[:method]
|
34
93
|
return unless receiver.respond_to?(method, true)
|
35
|
-
|
94
|
+
method = method_target(receiver, super_level, method, "receiver")
|
95
|
+
file, line = method&.source_location
|
36
96
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
97
|
+
return unless file && line
|
98
|
+
|
99
|
+
if File.exist?(file)
|
100
|
+
Source.new(file, line)
|
101
|
+
elsif method
|
102
|
+
# Method defined with eval, probably in IRB session
|
103
|
+
source = RubyVM::AbstractSyntaxTree.of(method)&.source rescue nil
|
104
|
+
Source.new(file, line, source)
|
40
105
|
end
|
106
|
+
rescue EvaluationError
|
107
|
+
nil
|
41
108
|
end
|
42
109
|
|
43
110
|
private
|
44
111
|
|
45
|
-
def find_end(file, first_line)
|
46
|
-
lex = RubyLex.new
|
47
|
-
lines = File.read(file).lines[(first_line - 1)..-1]
|
48
|
-
tokens = RubyLex.ripper_lex_without_warning(lines.join)
|
49
|
-
prev_tokens = []
|
50
|
-
|
51
|
-
# chunk with line number
|
52
|
-
tokens.chunk { |tok| tok.pos[0] }.each do |lnum, chunk|
|
53
|
-
code = lines[0..lnum].join
|
54
|
-
prev_tokens.concat chunk
|
55
|
-
continue = lex.should_continue?(prev_tokens)
|
56
|
-
syntax = lex.check_code_syntax(code, local_variables: [])
|
57
|
-
if !continue && syntax == :valid
|
58
|
-
return first_line + lnum
|
59
|
-
end
|
60
|
-
end
|
61
|
-
first_line
|
62
|
-
end
|
63
|
-
|
64
112
|
def method_target(owner_receiver, super_level, method, type)
|
65
113
|
case type
|
66
114
|
when "owner"
|
@@ -71,9 +119,21 @@ module IRB
|
|
71
119
|
super_level.times do |s|
|
72
120
|
target_method = target_method.super_method if target_method
|
73
121
|
end
|
74
|
-
target_method
|
122
|
+
target_method
|
75
123
|
rescue NameError
|
76
124
|
nil
|
77
125
|
end
|
126
|
+
|
127
|
+
def eval_receiver_or_owner(code)
|
128
|
+
context_binding = @irb_context.workspace.binding
|
129
|
+
eval(code, context_binding)
|
130
|
+
rescue NameError
|
131
|
+
raise EvaluationError
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_const_owner(name)
|
135
|
+
module_nesting = @irb_context.workspace.binding.eval('::Module.nesting')
|
136
|
+
module_nesting.find { |mod| mod.const_defined?(name, false) } || module_nesting.find { |mod| mod.const_defined?(name) } || Object
|
137
|
+
end
|
78
138
|
end
|
79
139
|
end
|
data/lib/irb/statement.rb
CHANGED
@@ -20,6 +20,29 @@ module IRB
|
|
20
20
|
raise NotImplementedError
|
21
21
|
end
|
22
22
|
|
23
|
+
class EmptyInput < Statement
|
24
|
+
def is_assignment?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def suppresses_echo?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
# Debugger takes empty input to repeat the last command
|
33
|
+
def should_be_handled_by_debugger?
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def code
|
38
|
+
""
|
39
|
+
end
|
40
|
+
|
41
|
+
def evaluable_code
|
42
|
+
code
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
23
46
|
class Expression < Statement
|
24
47
|
def initialize(code, is_assignment)
|
25
48
|
@code = code
|
@@ -60,9 +83,8 @@ module IRB
|
|
60
83
|
end
|
61
84
|
|
62
85
|
def should_be_handled_by_debugger?
|
63
|
-
require_relative '
|
64
|
-
|
65
|
-
IRB::ExtendCommand::DebugCommand > @command_class || IRB::ExtendCommand::Help == @command_class
|
86
|
+
require_relative 'command/debug'
|
87
|
+
IRB::Command::DebugCommand > @command_class
|
66
88
|
end
|
67
89
|
|
68
90
|
def evaluable_code
|
data/lib/irb/version.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/version.rb - irb version definition file
|
4
4
|
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
|
5
5
|
#
|
6
6
|
|
7
7
|
module IRB # :nodoc:
|
8
|
-
VERSION = "1.
|
8
|
+
VERSION = "1.12.0"
|
9
9
|
@RELEASE_VERSION = VERSION
|
10
|
-
@LAST_UPDATE_DATE = "2024-
|
10
|
+
@LAST_UPDATE_DATE = "2024-03-06"
|
11
11
|
end
|
data/lib/irb/workspace.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/workspace-binding.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -90,11 +90,11 @@ EOF
|
|
90
90
|
IRB.conf[:__MAIN__] = @main
|
91
91
|
@main.singleton_class.class_eval do
|
92
92
|
private
|
93
|
-
define_method(:exit) do |*a, &b|
|
94
|
-
# Do nothing, will be overridden
|
95
|
-
end
|
96
93
|
define_method(:binding, Kernel.instance_method(:binding))
|
97
94
|
define_method(:local_variables, Kernel.instance_method(:local_variables))
|
95
|
+
# Define empty method to avoid delegator warning, will be overridden.
|
96
|
+
define_method(:exit) {|*a, &b| }
|
97
|
+
define_method(:exit!) {|*a, &b| }
|
98
98
|
end
|
99
99
|
@binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
|
100
100
|
end
|
data/lib/irb/ws-for-case-2.rb
CHANGED
data/lib/irb/xmp.rb
CHANGED