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.



318
319
320
321
# File 'lib/prism/lex_compat.rb', line 318

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

Instance Attribute Details

#splitObject (readonly)

:nodoc:



316
317
318
# File 'lib/prism/lex_compat.rb', line 316

def split
  @split
end

#tokensObject (readonly)

:nodoc:



316
317
318
# File 'lib/prism/lex_compat.rb', line 316

def tokens
  @tokens
end

Instance Method Details

#<<(token) ⇒ Object



323
324
325
# File 'lib/prism/lex_compat.rb', line 323

def <<(token)
  tokens << token
end

#to_aObject



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
# File 'lib/prism/lex_compat.rb', line 327

def to_a
  embexpr_balance = 0

  tokens.each_with_object([]) do |token, results| #$ Array[Token]
    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