Class: YARP::LexCompat::Heredoc::DashHeredoc

Inherits:
Object
  • Object
show all
Defined in:
lib/yarp/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.



285
286
287
288
# File 'lib/yarp/lex_compat.rb', line 285

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

Instance Attribute Details

#splitObject (readonly)

Returns the value of attribute split.



283
284
285
# File 'lib/yarp/lex_compat.rb', line 283

def split
  @split
end

#tokensObject (readonly)

Returns the value of attribute tokens.



283
284
285
# File 'lib/yarp/lex_compat.rb', line 283

def tokens
  @tokens
end

Instance Method Details

#<<(token) ⇒ Object



290
291
292
# File 'lib/yarp/lex_compat.rb', line 290

def <<(token)
  tokens << token
end

#to_aObject



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/yarp/lex_compat.rb', line 294

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