Skip to content

Commit 8e41f81

Browse files
committed
Re-implement prev_spaces feature for pasted code
1 parent 540b64c commit 8e41f81

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

lib/irb/ruby-lex.rb

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,16 @@ def free_indent_token?(token)
356356
%i[on_tstring_beg on_backtick on_regexp_beg on_symbeg].include?(token.event)
357357
end
358358

359+
def indent_difference(lines, line_results, open_token)
360+
return 0 unless open_token
361+
line_index = open_token.pos[0] - 1
362+
_tokens, prev_opens, _next_opens, min_depth = line_results[line_index]
363+
indent_level, _nesting_level = calc_nesting_depth(prev_opens.take(min_depth))
364+
calculated_indent = 2 * indent_level
365+
actual_indent = lines[line_index][/^ */].size
366+
actual_indent - calculated_indent
367+
end
368+
359369
def process_indent_level(tokens, lines, line_index, is_newline)
360370
line_results = IRB::NestingParser.parse_by_line(tokens)
361371
result = line_results[line_index]
@@ -374,10 +384,16 @@ def process_indent_level(tokens, lines, line_index, is_newline)
374384

375385
preserve_indent = lines[line_index - (is_newline ? 1 : 0)][/^ */].size
376386

387+
# Calculates base indent for pasted code
388+
# irb(main):001:1* if 1 # Base indent is 4
389+
# irb(main):002:1* 2
390+
# irb(main):003:0> end
391+
base_indent = [0, indent_difference(lines, line_results, prev_opens.last)].max
392+
377393
if free_indent_token?(prev_opens.last)
378394
if is_newline && prev_opens.last.pos[0] == line_index
379395
# First newline inside free-indent token
380-
indent
396+
base_indent + indent
381397
else
382398
# Accept any number of indent inside free-indent token
383399
preserve_indent
@@ -395,21 +411,21 @@ def process_indent_level(tokens, lines, line_index, is_newline)
395411
if prev_opens.size < next_opens.size || prev_opens.last == next_opens.last
396412
if is_newline && lines[line_index].empty? && line_results[line_index - 1][1].last != prev_opens.last
397413
# First line in heredoc
398-
indent
414+
tok.match?(/^<<[-~]/) ? base_indent + indent : indent
399415
elsif tok.match?(/^<<~/)
400416
# Accept extra indent spaces inside `<<~` heredoc
401-
[indent, preserve_indent].max
417+
[base_indent + indent, preserve_indent].max
402418
else
403419
# Accept any number of indent inside other heredoc
404420
preserve_indent
405421
end
406422
else
407423
# Heredoc close
408424
prev_line_indent_level, _prev_line_nesting_level = calc_nesting_depth(prev_opens)
409-
tok.match?(/^<<[~-]/) ? 2 * (prev_line_indent_level - 1) : 0
425+
tok.match?(/^<<[~-]/) ? base_indent + 2 * (prev_line_indent_level - 1) : 0
410426
end
411427
else
412-
indent
428+
base_indent + indent
413429
end
414430
end
415431

0 commit comments

Comments
 (0)