class SyntaxSuggest::LexAll

Ripper.lex is not guaranteed to lex the entire source document

This class guarantees the whole document is lex-ed by iteratively lexing the document where ripper stopped.

Prism likely doesn’t have the same problem. Once ripper support is removed we can likely reduce the complexity here if not remove the whole concept.

Example usage:

lex = LexAll.new(source: source)
lex.each do |value|
  puts value.line
end

Public Class Methods

Source
# File lib/syntax_suggest/lex_all.rb, line 44
def self.lex(source, line_number)
  Prism.lex_compat(source, line: line_number).value.sort_by { |values| values[0] }
end
Source
# File lib/syntax_suggest/lex_all.rb, line 21
def initialize(source:, source_lines: nil)
  @lex = self.class.lex(source, 1)
  lineno = @lex.last[0][0] + 1
  source_lines ||= source.lines
  last_lineno = source_lines.length

  until lineno >= last_lineno
    lines = source_lines[lineno..]

    @lex.concat(
      self.class.lex(lines.join, lineno + 1)
    )

    lineno = @lex.last[0].first + 1
  end

  last_lex = nil
  @lex.map! { |elem|
    last_lex = LexValue.new(elem[0].first, elem[1], elem[2], elem[3], last_lex)
  }
end

Public Instance Methods

Source
# File lib/syntax_suggest/lex_all.rb, line 64
def [](index)
  @lex[index]
end
Source
# File lib/syntax_suggest/lex_all.rb, line 57
def each
  return @lex.each unless block_given?
  @lex.each do |x|
    yield x
  end
end
Source
# File lib/syntax_suggest/lex_all.rb, line 68
def last
  @lex.last
end
Source
# File lib/syntax_suggest/lex_all.rb, line 53
def to_a
  @lex
end