diff options
author | Koichi ITO <koic.ito@gmail.com> | 2024-03-13 02:40:08 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2024-03-13 11:34:17 +0000 |
commit | 7eea268b70b0a401bc8b8094b4ecbaf34aac9fa8 (patch) | |
tree | b2c516f6d299aa10bf3ca2c2331e975b892653a6 /lib/prism/translation/parser | |
parent | a5c5f83b24a1b7024d4e7fe3bbce091634da53b2 (diff) |
[ruby/prism] Fix an AST incompatibility for `Prism::Translation::Parser`
Fixes ruby/prism#2480.
This PR fixes an AST incompatibility between Parser gem and `Prism::Translation::Parser`
for xstring literal with line breaks.
The following case in ruby/prism#2480 has already been addressed in ruby/prism#2576:
```ruby
"foo
bar"
```
https://github.com/ruby/prism/commit/cf85e72c55
Diffstat (limited to 'lib/prism/translation/parser')
-rw-r--r-- | lib/prism/translation/parser/compiler.rb | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb index bf5b85441b..cf628cddd4 100644 --- a/lib/prism/translation/parser/compiler.rb +++ b/lib/prism/translation/parser/compiler.rb @@ -1678,9 +1678,23 @@ module Prism children, closing = visit_heredoc(node.to_interpolated) builder.xstring_compose(token(node.opening_loc), children, closing) else + parts = if node.unescaped.lines.count <= 1 + [builder.string_internal([node.unescaped, srange(node.content_loc)])] + else + start_offset = node.content_loc.start_offset + + node.unescaped.lines.map do |line| + end_offset = start_offset + line.length + offsets = srange_offsets(start_offset, end_offset) + start_offset = end_offset + + builder.string_internal([line, offsets]) + end + end + builder.xstring_compose( token(node.opening_loc), - [builder.string_internal([node.unescaped, srange(node.content_loc)])], + parts, token(node.closing_loc) ) end |