summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-06-07 15:27:21 -0400
committergit <svn-admin@ruby-lang.org>2024-06-07 19:46:27 +0000
commit41a36b68531dd1d9fa044c34ac40a5c4abedda2e (patch)
treeab3e11aff18caeb115df7576f0720d0c3f712e64
parent94e059797ae89b35a2c72bf1a4307766a1a9e960 (diff)
[ruby/prism] Handle chomped bytesize with lines without newlines
https://github.com/ruby/prism/commit/1528d3c019
-rw-r--r--lib/prism/translation/parser/compiler.rb11
-rw-r--r--test/prism/ruby/parser_test.rb2
2 files changed, 10 insertions, 3 deletions
diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb
index cbec2bb062..48f3d4db5c 100644
--- a/lib/prism/translation/parser/compiler.rb
+++ b/lib/prism/translation/parser/compiler.rb
@@ -2040,6 +2040,13 @@ module Prism
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 @@ module Prism
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?(/(?<!\\)\\\r?\n$/) }
.each do |lines|
escaped_lengths << lines.sum(&:bytesize)
- normalized_lengths << lines.sum { |line| line.chomp.bytesize + 1 }
+ normalized_lengths << lines.sum { |line| chomped_bytesize(line) }
end
end
diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb
index b3c0ef5fa6..65535af0fd 100644
--- a/test/prism/ruby/parser_test.rb
+++ b/test/prism/ruby/parser_test.rb
@@ -59,7 +59,6 @@ module Prism
# These files are either failing to parse or failing to translate, so we'll
# skip them for now.
skip_all = skip_incorrect | [
- "dash_heredocs.txt",
"regex.txt",
"regex_char_width.txt",
"unescaping.txt",
@@ -86,6 +85,7 @@ module Prism
# output expected by the parser gem, so we'll skip them for now.
skip_tokens = [
"comments.txt",
+ "dash_heredocs.txt",
"dos_endings.txt",
"embdoc_no_newline_at_end.txt",
"heredoc_with_comment.txt",