Class: Prism::LexCompat::Heredoc::DashHeredoc

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/lex_compat.rb

Overview

Dash heredocs are a little more complicated. They are a list of tokens that need to be split on “\n” to mimic Ripper’s behavior. We also need to keep track of the state that the heredoc was opened in.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(split) ⇒ DashHeredoc

Returns a new instance of DashHeredoc.



298
299
300
301
# File 'lib/prism/lex_compat.rb', line 298

def initialize(split)
  @split = split
  @tokens = []
end

Instance Attribute Details

#splitObject (readonly)

:nodoc:



296
297
298
# File 'lib/prism/lex_compat.rb', line 296

def split
  @split
end

#tokensObject (readonly)

:nodoc:



296
297
298
# File 'lib/prism/lex_compat.rb', line 296

def tokens
  @tokens
end

Instance Method Details

#<<(token) ⇒ Object



303
304
305
# File 'lib/prism/lex_compat.rb', line 303

def <<(token)
  tokens << token
end

#to_aObject



307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# File 'lib/prism/lex_compat.rb', line 307

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