mbj / unparser

Turn Ruby AST into semantically equivalent Ruby source
MIT License
310 stars 52 forks source link

Some backslashes are dropped from heredocs #374

Open akimd opened 1 month ago

akimd commented 1 month ago

Hi Markus,

When there is an interpolation in the heredoc, it comes out underescaped.

require 'unparser'

ast = Unparser.parse(<<~'OUTER')
    <<~RUBY
        validates :#{field_sid}, format: {
            with: /\\A\\-+(\\w+\\-+)|(\\w+\\.)\\Z/i
         }
    RUBY
OUTER
p ast
puts Unparser.unparse(ast)
s(:dstr,
  s(:str, "validates :"),
  s(:begin,
    s(:send, nil, :field_sid)),
  s(:str, ", format: {\n"),
  s(:str, "    with: /\\A\\-+(\\w+\\-+)|(\\w+\\.)\\Z/i\n"),
  s(:str, " }\n"))
<<-HEREDOC
validates :#{field_sid}, format: {
    with: /\A\-+(\w+\-+)|(\w+\.)\Z/i
 }
HEREDOC

All the backslashes should be doubled. And they are if I remove the interpolation.

Cheers!

mbj commented 1 month ago

Its very likely this is solved by #366, will test it. Sadly #366 is not ready yet as its a deeper refactor.