Class: RDoc::RipperStateLex

Inherits:
Object
  • Object
show all
Defined in:
lib/rdoc/parser/ripper_state_lex.rb

Defined Under Namespace

Classes: InnerStateLex

Constant Summary collapse

RIPPER_HAS_LEX_STATE =

TODO: Remove this constants after Ruby 2.4 EOL

Ripper::Filter.method_defined?(:state)
EXPR_NONE =
0
EXPR_BEG =
1
EXPR_END =
2
EXPR_ENDARG =
4
EXPR_ENDFN =
8
EXPR_ARG =
16
EXPR_CMDARG =
32
EXPR_MID =
64
EXPR_FNAME =
128
EXPR_DOT =
256
EXPR_CLASS =
512
EXPR_LABEL =
1024
EXPR_LABELED =
2048
EXPR_FITEM =
4096
EXPR_VALUE =
EXPR_BEG
EXPR_BEG_ANY =
(EXPR_BEG | EXPR_MID | EXPR_CLASS)
EXPR_ARG_ANY =
(EXPR_ARG | EXPR_CMDARG)
EXPR_END_ANY =
(EXPR_END | EXPR_ENDARG | EXPR_ENDFN)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(code) ⇒ RipperStateLex

Returns a new instance of RipperStateLex.



579
580
581
582
583
584
585
586
587
588
# File 'lib/rdoc/parser/ripper_state_lex.rb', line 579

def initialize(code)
  @buf = []
  @heredoc_queue = []
  @inner_lex = InnerStateLex.new(code)
  @inner_lex_enumerator = Enumerator.new do |y|
    @inner_lex.each do |tk|
      y << tk
    end
  end
end

Class Method Details

.end?(token) ⇒ Boolean

Returns:

  • (Boolean)


602
603
604
# File 'lib/rdoc/parser/ripper_state_lex.rb', line 602

def self.end?(token)
  (token[:state] & EXPR_END)
end

.parse(code) ⇒ Object



590
591
592
593
594
595
596
597
598
599
600
# File 'lib/rdoc/parser/ripper_state_lex.rb', line 590

def self.parse(code)
  lex = self.new(code)
  tokens = []
  begin
    while tk = lex.get_squashed_tk
      tokens.push tk
    end
  rescue StopIteration
  end
  tokens
end

Instance Method Details

#get_squashed_tkObject



306
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
342
343
344
345
346
347
348
349
350
351
352
# File 'lib/rdoc/parser/ripper_state_lex.rb', line 306

def get_squashed_tk
  if @buf.empty?
    tk = @inner_lex_enumerator.next
  else
    tk = @buf.shift
  end
  case tk[:kind]
  when :on_symbeg then
    tk = get_symbol_tk(tk)
  when :on_tstring_beg then
    tk = get_string_tk(tk)
  when :on_backtick then
    if (tk[:state] & (EXPR_FNAME | EXPR_ENDFN)) != 0
      @inner_lex.lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
      tk[:kind] = :on_ident
      tk[:state] = Ripper::Lexer.const_defined?(:State) ? Ripper::Lexer::State.new(EXPR_ARG) : EXPR_ARG
    else
      tk = get_string_tk(tk)
    end
  when :on_regexp_beg then
    tk = get_regexp_tk(tk)
  when :on_embdoc_beg then
    tk = get_embdoc_tk(tk)
  when :on_heredoc_beg then
    @heredoc_queue << retrieve_heredoc_info(tk)
    @inner_lex.lex_state = EXPR_END unless RIPPER_HAS_LEX_STATE
  when :on_nl, :on_ignored_nl, :on_comment, :on_heredoc_end then
    unless @heredoc_queue.empty?
      get_heredoc_tk(*@heredoc_queue.shift)
    end
  when :on_words_beg then
    tk = get_words_tk(tk)
  when :on_qwords_beg then
    tk = get_words_tk(tk)
  when :on_symbols_beg then
    tk = get_words_tk(tk)
  when :on_qsymbols_beg then
    tk = get_words_tk(tk)
  when :on_op then
    if '&.' == tk[:text]
      tk[:kind] = :on_period
    else
      tk = get_op_tk(tk)
    end
  end
  tk
end