diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb index cbec2bb062e..48f3d4db5cb 100644 --- a/lib/prism/translation/parser/compiler.rb +++ b/lib/prism/translation/parser/compiler.rb @@ -2040,6 +2040,13 @@ def visit_block(call, block) end end + # The parser gem automatically converts \r\n to \n, meaning our offsets + # need to be adjusted to always subtract 1 from the length. + def chomped_bytesize(line) + chomped = line.chomp + chomped.bytesize + (chomped == line ? 0 : 1) + end + # Visit a heredoc that can be either a string or an xstring. def visit_heredoc(node) children = Array.new @@ -2066,14 +2073,14 @@ def visit_heredoc(node) if node.opening.end_with?("'") escaped.each do |line| escaped_lengths << line.bytesize - normalized_lengths << (line.chomp.bytesize + 1) + normalized_lengths << chomped_bytesize(line) end else escaped .chunk_while { |before, after| before.match?(/(?