@@ -2057,23 +2057,31 @@ def visit_heredoc(node)
2057
2057
node . parts . each do |part |
2058
2058
pushing =
2059
2059
if part . is_a? ( StringNode ) && part . unescaped . include? ( "\n " )
2060
- unescaped = part . unescaped . lines ( chomp : true )
2061
- escaped = part . content . lines ( chomp : true )
2060
+ unescaped = part . unescaped . lines
2061
+ escaped = part . content . lines
2062
2062
2063
- escaped_lengths =
2064
- if node . opening . end_with? ( "'" )
2065
- escaped . map { |line | line . bytesize + 1 }
2066
- else
2067
- escaped . chunk_while { |before , after | before . match? ( /(?<!\\ )\\ $/ ) } . map { |line | line . join . bytesize + line . length }
2063
+ escaped_lengths = [ ]
2064
+ normalized_lengths = [ ]
2065
+
2066
+ if node . opening . end_with? ( "'" )
2067
+ escaped . each do |line |
2068
+ escaped_lengths << line . bytesize
2069
+ normalized_lengths << ( line . chomp . bytesize + 1 )
2068
2070
end
2071
+ else
2072
+ escaped
2073
+ . chunk_while { |before , after | before . match? ( /(?<!\\ )\\ \r ?\n $/ ) }
2074
+ . each do |lines |
2075
+ escaped_lengths << lines . sum ( &:bytesize )
2076
+ normalized_lengths << lines . sum { |line | line . chomp . bytesize + 1 }
2077
+ end
2078
+ end
2069
2079
2070
2080
start_offset = part . location . start_offset
2071
- end_offset = nil
2072
2081
2073
- unescaped . zip ( escaped_lengths ) . map do |unescaped_line , escaped_length |
2074
- end_offset = start_offset + ( escaped_length || 0 )
2075
- inner_part = builder . string_internal ( [ "#{ unescaped_line } \n " , srange_offsets ( start_offset , end_offset ) ] )
2076
- start_offset = end_offset
2082
+ unescaped . map . with_index do |unescaped_line , index |
2083
+ inner_part = builder . string_internal ( [ unescaped_line , srange_offsets ( start_offset , start_offset + normalized_lengths . fetch ( index , 0 ) ) ] )
2084
+ start_offset += escaped_lengths . fetch ( index , 0 )
2077
2085
inner_part
2078
2086
end
2079
2087
else
0 commit comments