@@ -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