irb 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/irb.gemspec +1 -0
- data/lib/irb.rb +57 -39
- data/lib/irb/color.rb +15 -2
- data/lib/irb/color_printer.rb +28 -0
- data/lib/irb/completion.rb +11 -11
- data/lib/irb/inspector.rb +12 -14
- data/lib/irb/ruby-lex.rb +106 -27
- data/lib/irb/version.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e147abaf69084b92f2f7accaf7d83014b6c0f7b3b6cbe0cc9b9878c52baee8af
|
4
|
+
data.tar.gz: 9a770f98f44f4bf498c91a3d8546d13a1db418daa034639646c0df0c3720d23e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f760ae68d08c7ae7f9f4ec07149935819f50df015a5f4a9453eca4a01574677ed5a29ae1c4eb8462b9cc92f5ad6b465b4e8b1c3f37748bd81ecde7159cf3a1c0
|
7
|
+
data.tar.gz: 3da91491f2e3928c8b619f120b6c6adcd020ed16760a4c176aee38bec5ca3964eb7cd0acc053a6a18dacec571b9a0b1e93d2a4c94a628a642b3b39bfd98b5284
|
data/irb.gemspec
CHANGED
data/lib/irb.rb
CHANGED
@@ -578,6 +578,29 @@ module IRB
|
|
578
578
|
end
|
579
579
|
end
|
580
580
|
|
581
|
+
def convert_invalid_byte_sequence(str)
|
582
|
+
str = str.force_encoding(Encoding::ASCII_8BIT)
|
583
|
+
conv = Encoding::Converter.new(Encoding::ASCII_8BIT, Encoding::UTF_8)
|
584
|
+
dst = String.new
|
585
|
+
begin
|
586
|
+
ret = conv.primitive_convert(str, dst)
|
587
|
+
case ret
|
588
|
+
when :invalid_byte_sequence
|
589
|
+
conv.insert_output(conf.primitive_errinfo[3].dump[1..-2])
|
590
|
+
redo
|
591
|
+
when :undefined_conversion
|
592
|
+
c = conv.primitive_errinfo[3].dup.force_encoding(conv.primitive_errinfo[1])
|
593
|
+
conv.insert_output(c.dump[1..-2])
|
594
|
+
redo
|
595
|
+
when :incomplete_input
|
596
|
+
conv.insert_output(conv.primitive_errinfo[3].dump[1..-2])
|
597
|
+
when :finished
|
598
|
+
end
|
599
|
+
break
|
600
|
+
end while nil
|
601
|
+
dst
|
602
|
+
end
|
603
|
+
|
581
604
|
def handle_exception(exc)
|
582
605
|
if exc.backtrace && exc.backtrace[0] =~ /\/irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
|
583
606
|
!(SyntaxError === exc) && !(EncodingError === exc)
|
@@ -587,49 +610,44 @@ module IRB
|
|
587
610
|
irb_bug = false
|
588
611
|
end
|
589
612
|
|
590
|
-
if STDOUT.tty?
|
591
|
-
attr = ATTR_TTY
|
592
|
-
print "#{attr[1]}Traceback#{attr[]} (most recent call last):\n"
|
593
|
-
else
|
594
|
-
attr = ATTR_PLAIN
|
595
|
-
end
|
596
|
-
messages = []
|
597
|
-
lasts = []
|
598
|
-
levels = 0
|
599
613
|
if exc.backtrace
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
614
|
+
order = nil
|
615
|
+
if '2.5.0' == RUBY_VERSION
|
616
|
+
# Exception#full_message doesn't have keyword arguments.
|
617
|
+
message = exc.full_message # the same of (highlight: true, order: bottom)
|
618
|
+
order = :bottom
|
619
|
+
elsif '2.5.1' <= RUBY_VERSION && RUBY_VERSION < '3.0.0'
|
620
|
+
if STDOUT.tty?
|
621
|
+
message = exc.full_message(order: :bottom)
|
622
|
+
order = :bottom
|
606
623
|
else
|
607
|
-
|
608
|
-
|
609
|
-
if messages.size < @context.back_trace_limit
|
610
|
-
messages.push(m)
|
611
|
-
elsif lasts.size < @context.back_trace_limit
|
612
|
-
lasts.push(m).shift
|
613
|
-
levels += 1
|
624
|
+
message = exc.full_message(order: :top)
|
625
|
+
order = :top
|
614
626
|
end
|
627
|
+
else # '3.0.0' <= RUBY_VERSION
|
628
|
+
message = exc.full_message(order: :top)
|
629
|
+
order = :top
|
615
630
|
end
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
631
|
+
message = convert_invalid_byte_sequence(message)
|
632
|
+
message = message.gsub(/((?:^\t.+$\n)+)/) { |m|
|
633
|
+
case order
|
634
|
+
when :top
|
635
|
+
lines = m.split("\n")
|
636
|
+
when :bottom
|
637
|
+
lines = m.split("\n").reverse
|
638
|
+
end
|
639
|
+
unless irb_bug
|
640
|
+
lines = lines.map { |l| @context.workspace.filter_backtrace(l) }.compact
|
641
|
+
if lines.size > @context.back_trace_limit
|
642
|
+
omit = lines.size - @context.back_trace_limit
|
643
|
+
lines = lines[0..(@context.back_trace_limit - 1)]
|
644
|
+
lines << "\t... %d levels..." % omit
|
645
|
+
end
|
646
|
+
end
|
647
|
+
lines = lines.reverse if order == :bottom
|
648
|
+
lines.map{ |l| l + "\n" }.join
|
649
|
+
}
|
650
|
+
puts message
|
633
651
|
end
|
634
652
|
print "Maybe IRB bug!\n" if irb_bug
|
635
653
|
end
|
data/lib/irb/color.rb
CHANGED
@@ -60,6 +60,10 @@ module IRB # :nodoc:
|
|
60
60
|
on_words_beg: [[RED, BOLD], ALL],
|
61
61
|
on_parse_error: [[RED, REVERSE], ALL],
|
62
62
|
compile_error: [[RED, REVERSE], ALL],
|
63
|
+
on_assign_error: [[RED, REVERSE], ALL],
|
64
|
+
on_alias_error: [[RED, REVERSE], ALL],
|
65
|
+
on_class_name_error:[[RED, REVERSE], ALL],
|
66
|
+
on_param_error: [[RED, REVERSE], ALL],
|
63
67
|
}
|
64
68
|
rescue NameError
|
65
69
|
# Give up highlighting Ripper-incompatible older Ruby
|
@@ -67,6 +71,9 @@ module IRB # :nodoc:
|
|
67
71
|
end
|
68
72
|
private_constant :TOKEN_SEQ_EXPRS
|
69
73
|
|
74
|
+
ERROR_TOKENS = TOKEN_SEQ_EXPRS.keys.select { |k| k.to_s.end_with?('error') }
|
75
|
+
private_constant :ERROR_TOKENS
|
76
|
+
|
70
77
|
class << self
|
71
78
|
def colorable?
|
72
79
|
$stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
|
@@ -107,7 +114,7 @@ module IRB # :nodoc:
|
|
107
114
|
# If `complete` is false (code is incomplete), this does not warn compile_error.
|
108
115
|
# This option is needed to avoid warning a user when the compile_error is happening
|
109
116
|
# because the input is not wrong but just incomplete.
|
110
|
-
def colorize_code(code, complete: true)
|
117
|
+
def colorize_code(code, complete: true, ignore_error: false)
|
111
118
|
return code unless colorable?
|
112
119
|
|
113
120
|
symbol_state = SymbolState.new
|
@@ -115,6 +122,11 @@ module IRB # :nodoc:
|
|
115
122
|
length = 0
|
116
123
|
|
117
124
|
scan(code, allow_last_error: !complete) do |token, str, expr|
|
125
|
+
# IRB::ColorPrinter skips colorizing fragments with any invalid token
|
126
|
+
if ignore_error && ERROR_TOKENS.include?(token)
|
127
|
+
return Reline::Unicode.escape_for_print(code)
|
128
|
+
end
|
129
|
+
|
118
130
|
in_symbol = symbol_state.scan_token(token)
|
119
131
|
str.each_line do |line|
|
120
132
|
line = Reline::Unicode.escape_for_print(line)
|
@@ -180,11 +192,12 @@ module IRB # :nodoc:
|
|
180
192
|
end
|
181
193
|
end
|
182
194
|
end
|
195
|
+
ensure
|
183
196
|
$VERBOSE = verbose
|
184
197
|
end
|
185
198
|
|
186
199
|
def dispatch_seq(token, expr, str, in_symbol:)
|
187
|
-
if token
|
200
|
+
if ERROR_TOKENS.include?(token)
|
188
201
|
TOKEN_SEQ_EXPRS[token][0]
|
189
202
|
elsif in_symbol
|
190
203
|
[YELLOW]
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'pp'
|
3
|
+
require 'irb/color'
|
4
|
+
|
5
|
+
module IRB
|
6
|
+
class ColorPrinter < ::PP
|
7
|
+
def self.pp(obj, out = $>, width = 79)
|
8
|
+
q = ColorPrinter.new(out, width)
|
9
|
+
q.guard_inspect_key {q.pp obj}
|
10
|
+
q.flush
|
11
|
+
out << "\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def text(str, width = nil)
|
15
|
+
unless str.is_a?(String)
|
16
|
+
str = str.inspect
|
17
|
+
end
|
18
|
+
width ||= str.length
|
19
|
+
|
20
|
+
case str
|
21
|
+
when /\A#</, '=', '>'
|
22
|
+
super(Color.colorize(str, [:GREEN]), width)
|
23
|
+
else
|
24
|
+
super(Color.colorize_code(str, ignore_error: true), width)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/irb/completion.rb
CHANGED
@@ -47,7 +47,7 @@ module IRB
|
|
47
47
|
when /^((["'`]).*\2)\.([^.]*)$/
|
48
48
|
# String
|
49
49
|
receiver = $1
|
50
|
-
message =
|
50
|
+
message = $3
|
51
51
|
|
52
52
|
candidates = String.instance_methods.collect{|m| m.to_s}
|
53
53
|
if doc_namespace
|
@@ -59,7 +59,7 @@ module IRB
|
|
59
59
|
when /^(\/[^\/]*\/)\.([^.]*)$/
|
60
60
|
# Regexp
|
61
61
|
receiver = $1
|
62
|
-
message =
|
62
|
+
message = $2
|
63
63
|
|
64
64
|
candidates = Regexp.instance_methods.collect{|m| m.to_s}
|
65
65
|
if doc_namespace
|
@@ -71,7 +71,7 @@ module IRB
|
|
71
71
|
when /^([^\]]*\])\.([^.]*)$/
|
72
72
|
# Array
|
73
73
|
receiver = $1
|
74
|
-
message =
|
74
|
+
message = $2
|
75
75
|
|
76
76
|
candidates = Array.instance_methods.collect{|m| m.to_s}
|
77
77
|
if doc_namespace
|
@@ -83,7 +83,7 @@ module IRB
|
|
83
83
|
when /^([^\}]*\})\.([^.]*)$/
|
84
84
|
# Proc or Hash
|
85
85
|
receiver = $1
|
86
|
-
message =
|
86
|
+
message = $2
|
87
87
|
|
88
88
|
proc_candidates = Proc.instance_methods.collect{|m| m.to_s}
|
89
89
|
hash_candidates = Hash.instance_methods.collect{|m| m.to_s}
|
@@ -117,7 +117,7 @@ module IRB
|
|
117
117
|
when /^([A-Z].*)::([^:.]*)$/
|
118
118
|
# Constant or class methods
|
119
119
|
receiver = $1
|
120
|
-
message =
|
120
|
+
message = $2
|
121
121
|
begin
|
122
122
|
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
123
123
|
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
@@ -134,7 +134,7 @@ module IRB
|
|
134
134
|
# Symbol
|
135
135
|
receiver = $1
|
136
136
|
sep = $2
|
137
|
-
message =
|
137
|
+
message = $3
|
138
138
|
|
139
139
|
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
140
140
|
if doc_namespace
|
@@ -147,7 +147,7 @@ module IRB
|
|
147
147
|
# Numeric
|
148
148
|
receiver = $~[:num]
|
149
149
|
sep = $~[:sep]
|
150
|
-
message =
|
150
|
+
message = $~[:mes]
|
151
151
|
|
152
152
|
begin
|
153
153
|
instance = eval(receiver, bind)
|
@@ -169,7 +169,7 @@ module IRB
|
|
169
169
|
# Numeric(0xFFFF)
|
170
170
|
receiver = $1
|
171
171
|
sep = $2
|
172
|
-
message =
|
172
|
+
message = $3
|
173
173
|
|
174
174
|
begin
|
175
175
|
instance = eval(receiver, bind)
|
@@ -201,7 +201,7 @@ module IRB
|
|
201
201
|
# variable.func or func.func
|
202
202
|
receiver = $1
|
203
203
|
sep = $2
|
204
|
-
message =
|
204
|
+
message = $3
|
205
205
|
|
206
206
|
gv = eval("global_variables", bind).collect{|m| m.to_s}.push("true", "false", "nil")
|
207
207
|
lv = eval("local_variables", bind).collect{|m| m.to_s}
|
@@ -244,7 +244,7 @@ module IRB
|
|
244
244
|
# unknown(maybe String)
|
245
245
|
|
246
246
|
receiver = ""
|
247
|
-
message =
|
247
|
+
message = $1
|
248
248
|
|
249
249
|
candidates = String.instance_methods(true).collect{|m| m.to_s}
|
250
250
|
if doc_namespace
|
@@ -294,7 +294,7 @@ module IRB
|
|
294
294
|
Operators = %w[% & * ** + - / < << <= <=> == === =~ > >= >> [] []= ^ ! != !~]
|
295
295
|
|
296
296
|
def self.select_message(receiver, message, candidates, sep = ".")
|
297
|
-
candidates.grep(/^#{message}/).collect do |e|
|
297
|
+
candidates.grep(/^#{Regexp.quote(message)}/).collect do |e|
|
298
298
|
case e
|
299
299
|
when /^[a-zA-Z_]/
|
300
300
|
receiver + sep + e
|
data/lib/irb/inspector.rb
CHANGED
@@ -100,29 +100,27 @@ module IRB # :nodoc:
|
|
100
100
|
# Proc to call when the input is evaluated and output in irb.
|
101
101
|
def inspect_value(v)
|
102
102
|
@inspect.call(v)
|
103
|
+
rescue
|
104
|
+
puts "(Object doesn't support #inspect)"
|
105
|
+
''
|
103
106
|
end
|
104
107
|
end
|
105
108
|
|
106
109
|
Inspector.def_inspector([false, :to_s, :raw]){|v| v.to_s}
|
107
|
-
Inspector.def_inspector([
|
108
|
-
|
109
|
-
result = v.inspect
|
110
|
-
if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v)
|
111
|
-
result = Color.colorize_code(result)
|
112
|
-
end
|
113
|
-
result
|
114
|
-
rescue NoMethodError
|
115
|
-
puts "(Object doesn't support #inspect)"
|
116
|
-
''
|
117
|
-
end
|
118
|
-
}
|
119
|
-
Inspector.def_inspector([:pp, :pretty_inspect], proc{require "pp"}){|v|
|
120
|
-
result = v.pretty_inspect.chomp
|
110
|
+
Inspector.def_inspector([:p, :inspect]){|v|
|
111
|
+
result = v.inspect
|
121
112
|
if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v)
|
122
113
|
result = Color.colorize_code(result)
|
123
114
|
end
|
124
115
|
result
|
125
116
|
}
|
117
|
+
Inspector.def_inspector([true, :pp, :pretty_inspect], proc{require "irb/color_printer"}){|v|
|
118
|
+
if IRB.conf[:MAIN_CONTEXT]&.use_colorize?
|
119
|
+
IRB::ColorPrinter.pp(v, '').chomp
|
120
|
+
else
|
121
|
+
v.pretty_inspect.chomp
|
122
|
+
end
|
123
|
+
}
|
126
124
|
Inspector.def_inspector([:yaml, :YAML], proc{require "yaml"}){|v|
|
127
125
|
begin
|
128
126
|
YAML.dump(v)
|
data/lib/irb/ruby-lex.rb
CHANGED
@@ -106,24 +106,72 @@ class RubyLex
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
+
ERROR_TOKENS = [
|
110
|
+
:on_parse_error,
|
111
|
+
:compile_error,
|
112
|
+
:on_assign_error,
|
113
|
+
:on_alias_error,
|
114
|
+
:on_class_name_error,
|
115
|
+
:on_param_error
|
116
|
+
]
|
117
|
+
|
109
118
|
def ripper_lex_without_warning(code)
|
110
119
|
verbose, $VERBOSE = $VERBOSE, nil
|
111
120
|
tokens = nil
|
112
121
|
self.class.compile_with_errors_suppressed(code) do |inner_code, line_no|
|
113
|
-
|
122
|
+
lexer = Ripper::Lexer.new(inner_code, '-', line_no)
|
123
|
+
if lexer.respond_to?(:scan) # Ruby 2.7+
|
124
|
+
tokens = []
|
125
|
+
pos_to_index = {}
|
126
|
+
lexer.scan.each do |t|
|
127
|
+
if pos_to_index.has_key?(t[0])
|
128
|
+
index = pos_to_index[t[0]]
|
129
|
+
found_tk = tokens[index]
|
130
|
+
if ERROR_TOKENS.include?(found_tk[1]) && !ERROR_TOKENS.include?(t[1])
|
131
|
+
tokens[index] = t
|
132
|
+
end
|
133
|
+
else
|
134
|
+
pos_to_index[t[0]] = tokens.size
|
135
|
+
tokens << t
|
136
|
+
end
|
137
|
+
end
|
138
|
+
else
|
139
|
+
tokens = lexer.parse
|
140
|
+
end
|
114
141
|
end
|
115
|
-
$VERBOSE = verbose
|
116
142
|
tokens
|
143
|
+
ensure
|
144
|
+
$VERBOSE = verbose
|
145
|
+
end
|
146
|
+
|
147
|
+
def find_prev_spaces(line_index)
|
148
|
+
return 0 if @tokens.size == 0
|
149
|
+
md = @tokens[0][2].match(/(\A +)/)
|
150
|
+
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
151
|
+
line_count = 0
|
152
|
+
@tokens.each_with_index do |t, i|
|
153
|
+
if t[2].include?("\n")
|
154
|
+
line_count += t[2].count("\n")
|
155
|
+
if line_count >= line_index
|
156
|
+
return prev_spaces
|
157
|
+
end
|
158
|
+
if (@tokens.size - 1) > i
|
159
|
+
md = @tokens[i + 1][2].match(/(\A +)/)
|
160
|
+
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
prev_spaces
|
117
165
|
end
|
118
166
|
|
119
167
|
def set_auto_indent(context)
|
120
168
|
if @io.respond_to?(:auto_indent) and context.auto_indent_mode
|
121
169
|
@io.auto_indent do |lines, line_index, byte_pointer, is_newline|
|
122
170
|
if is_newline
|
123
|
-
md = lines[line_index - 1].match(/(\A +)/)
|
124
|
-
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
125
171
|
@tokens = ripper_lex_without_warning(lines[0..line_index].join("\n"))
|
172
|
+
prev_spaces = find_prev_spaces(line_index)
|
126
173
|
depth_difference = check_newline_depth_difference
|
174
|
+
depth_difference = 0 if depth_difference < 0
|
127
175
|
prev_spaces + depth_difference * 2
|
128
176
|
else
|
129
177
|
code = line_index.zero? ? '' : lines[0..(line_index - 1)].map{ |l| l + "\n" }.join
|
@@ -360,14 +408,8 @@ class RubyLex
|
|
360
408
|
next if index > 0 and tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
361
409
|
case t[2]
|
362
410
|
when 'do'
|
363
|
-
|
364
|
-
|
365
|
-
indent += 1
|
366
|
-
else
|
367
|
-
# while cond do; end # also "until" or "for"
|
368
|
-
# This "do" doesn't increment indent because "while" already
|
369
|
-
# incremented.
|
370
|
-
end
|
411
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(tokens, index)
|
412
|
+
indent += 1 if syntax_of_do == :method_calling
|
371
413
|
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
372
414
|
indent += 1
|
373
415
|
when 'if', 'unless', 'while', 'until'
|
@@ -382,6 +424,40 @@ class RubyLex
|
|
382
424
|
indent
|
383
425
|
end
|
384
426
|
|
427
|
+
def take_corresponding_syntax_to_kw_do(tokens, index)
|
428
|
+
syntax_of_do = nil
|
429
|
+
# Finding a syntax correnponding to "do".
|
430
|
+
index.downto(0) do |i|
|
431
|
+
tk = tokens[i]
|
432
|
+
# In "continue", the token isn't the corresponding syntax to "do".
|
433
|
+
#is_continue = process_continue(@tokens[0..(i - 1)])
|
434
|
+
# continue ではなく、直前に (:on_ignored_nl|:on_nl|:on_comment):on_sp* みたいなのがあるかどうかを調べる
|
435
|
+
non_sp_index = tokens[0..(i - 1)].rindex{ |t| t[1] != :on_sp }
|
436
|
+
first_in_fomula = false
|
437
|
+
if non_sp_index.nil?
|
438
|
+
first_in_fomula = true
|
439
|
+
elsif [:on_ignored_nl, :on_nl, :on_comment].include?(tokens[non_sp_index][1])
|
440
|
+
first_in_fomula = true
|
441
|
+
end
|
442
|
+
if tk[3].anybits?(Ripper::EXPR_CMDARG) and tk[1] == :on_ident
|
443
|
+
# The target method call to pass the block with "do".
|
444
|
+
syntax_of_do = :method_calling
|
445
|
+
break if first_in_fomula
|
446
|
+
elsif tk[1] == :on_kw && %w{while until for}.include?(tk[2])
|
447
|
+
# A loop syntax in front of "do" found.
|
448
|
+
#
|
449
|
+
# while cond do # also "until" or "for"
|
450
|
+
# end
|
451
|
+
#
|
452
|
+
# This "do" doesn't increment indent because the loop syntax already
|
453
|
+
# incremented.
|
454
|
+
syntax_of_do = :loop_syntax
|
455
|
+
break if first_in_fomula
|
456
|
+
end
|
457
|
+
end
|
458
|
+
syntax_of_do
|
459
|
+
end
|
460
|
+
|
385
461
|
def check_newline_depth_difference
|
386
462
|
depth_difference = 0
|
387
463
|
open_brace_on_line = 0
|
@@ -410,7 +486,7 @@ class RubyLex
|
|
410
486
|
|
411
487
|
case t[1]
|
412
488
|
when :on_ignored_nl, :on_nl, :on_comment
|
413
|
-
if index != (@tokens.size - 1)
|
489
|
+
if index != (@tokens.size - 1) and in_oneliner_def != :BODY
|
414
490
|
depth_difference = 0
|
415
491
|
open_brace_on_line = 0
|
416
492
|
end
|
@@ -428,14 +504,8 @@ class RubyLex
|
|
428
504
|
next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
429
505
|
case t[2]
|
430
506
|
when 'do'
|
431
|
-
|
432
|
-
|
433
|
-
depth_difference += 1
|
434
|
-
else
|
435
|
-
# while cond do; end # also "until" or "for"
|
436
|
-
# This "do" doesn't increment indent because "while" already
|
437
|
-
# incremented.
|
438
|
-
end
|
507
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index)
|
508
|
+
depth_difference += 1 if syntax_of_do == :method_calling
|
439
509
|
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
440
510
|
depth_difference += 1
|
441
511
|
when 'if', 'unless', 'while', 'until', 'rescue'
|
@@ -445,6 +515,8 @@ class RubyLex
|
|
445
515
|
end
|
446
516
|
when 'else', 'elsif', 'ensure', 'when', 'in'
|
447
517
|
depth_difference += 1
|
518
|
+
when 'end'
|
519
|
+
depth_difference -= 1
|
448
520
|
end
|
449
521
|
end
|
450
522
|
end
|
@@ -488,11 +560,13 @@ class RubyLex
|
|
488
560
|
|
489
561
|
case t[1]
|
490
562
|
when :on_ignored_nl, :on_nl, :on_comment
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
563
|
+
if in_oneliner_def != :BODY
|
564
|
+
corresponding_token_depth = nil
|
565
|
+
spaces_at_line_head = 0
|
566
|
+
is_first_spaces_of_line = true
|
567
|
+
is_first_printable_of_line = true
|
568
|
+
open_brace_on_line = 0
|
569
|
+
end
|
496
570
|
next
|
497
571
|
when :on_sp
|
498
572
|
spaces_at_line_head = t[2].count(' ') if is_first_spaces_of_line
|
@@ -514,7 +588,12 @@ class RubyLex
|
|
514
588
|
when :on_kw
|
515
589
|
next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
516
590
|
case t[2]
|
517
|
-
when '
|
591
|
+
when 'do'
|
592
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index)
|
593
|
+
if syntax_of_do == :method_calling
|
594
|
+
spaces_of_nest.push(spaces_at_line_head)
|
595
|
+
end
|
596
|
+
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
518
597
|
spaces_of_nest.push(spaces_at_line_head)
|
519
598
|
when 'rescue'
|
520
599
|
unless t[3].allbits?(Ripper::EXPR_LABEL)
|
data/lib/irb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: irb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keiju ISHITSUKA
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reline
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- lib/irb/cmd/pushws.rb
|
82
82
|
- lib/irb/cmd/subirb.rb
|
83
83
|
- lib/irb/color.rb
|
84
|
+
- lib/irb/color_printer.rb
|
84
85
|
- lib/irb/completion.rb
|
85
86
|
- lib/irb/context.rb
|
86
87
|
- lib/irb/easter-egg.rb
|
@@ -135,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
136
|
- !ruby/object:Gem::Version
|
136
137
|
version: '0'
|
137
138
|
requirements: []
|
138
|
-
rubygems_version: 3.
|
139
|
+
rubygems_version: 3.2.3
|
139
140
|
signing_key:
|
140
141
|
specification_version: 4
|
141
142
|
summary: Interactive Ruby command-line tool for REPL (Read Eval Print Loop).
|