class YARP::LexCompat::Heredoc::DashHeredoc
to keep track of the state that the heredoc was opened in.
that need to be split on “\n” to mimic Ripper’s behavior. We also need
Dash heredocs are a little more complicated. They are a list of tokens
def <<(token)
def <<(token) tokens << token end
def initialize(split)
def initialize(split) @split = split @tokens = [] end
def to_a
def to_a embexpr_balance = 0 tokens.each_with_object([]) do |token, results| case token.event when :on_embexpr_beg embexpr_balance += 1 results << token when :on_embexpr_end embexpr_balance -= 1 results << token when :on_tstring_content if embexpr_balance == 0 lineno = token[0][0] column = token[0][1] if split # Split on "\\\n" to mimic Ripper's behavior. Use a lookbehind # to keep the delimiter in the result. token.value.split(/(?<=[^\\]\\\n)|(?<=[^\\]\\\r\n)/).each_with_index do |value, index| column = 0 if index > 0 results << Token.new([[lineno, column], :on_tstring_content, value, token.state]) lineno += value.count("\n") end else results << token end else results << token end else results << token end end end