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 57 def each return @lex.each unless block_given? @lex.each do |x| yield x end end