Class: SyntaxSuggest::LexAll
- Inherits:
-
Object
- Object
- SyntaxSuggest::LexAll
- Includes:
- Enumerable
- Defined in:
- lib/syntax_suggest/lex_all.rb
Overview
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
Class Method Summary collapse
Instance Method Summary collapse
- #[](index) ⇒ Object
- #each ⇒ Object
-
#initialize(source:, source_lines: nil) ⇒ LexAll
constructor
A new instance of LexAll.
- #last ⇒ Object
- #to_a ⇒ Object
Constructor Details
#initialize(source:, source_lines: nil) ⇒ LexAll
Returns a new instance of LexAll.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# 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 |
Class Method Details
.lex(source, line_number) ⇒ Object
44 45 46 |
# 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 |
Instance Method Details
#[](index) ⇒ Object
64 65 66 |
# File 'lib/syntax_suggest/lex_all.rb', line 64 def [](index) @lex[index] end |
#each ⇒ Object
57 58 59 60 61 62 |
# 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 |
#last ⇒ Object
68 69 70 |
# File 'lib/syntax_suggest/lex_all.rb', line 68 def last @lex.last end |
#to_a ⇒ Object
53 54 55 |
# File 'lib/syntax_suggest/lex_all.rb', line 53 def to_a @lex end |