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
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.