class SyntaxSuggest::CodeBlock
Multiple lines form a singular CodeBlock
Source code is made of multiple CodeBlocks.
Example:
code_block.to_s # => # def foo # puts "foo" # end code_block.valid? # => true code_block.in_valid? # => false
Constants
- UNSET
Attributes
Public Class Methods
Source
# File lib/syntax_suggest/code_block.rb, line 23 def initialize(lines: []) @lines = Array(lines) @valid = UNSET @deleted = false @starts_at = @lines.first.number @ends_at = @lines.last.number end
Public Instance Methods
Source
# File lib/syntax_suggest/code_block.rb, line 59 def <=>(other) out = current_indent <=> other.current_indent return out if out != 0 # Stable sort starts_at <=> other.starts_at end
This is used for frontier ordering, we are searching from the largest indentation to the smallest. This allows us to populate an array with multiple code blocks then call ‘sort!` on it without having to specify the sorting criteria
Source
# File lib/syntax_suggest/code_block.rb, line 67 def current_indent @current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0 end
Source
# File lib/syntax_suggest/code_block.rb, line 47 def is_end? to_s.strip == "end" end
Source
# File lib/syntax_suggest/code_block.rb, line 43 def mark_invisible @lines.map(&:mark_invisible) end
Source
# File lib/syntax_suggest/code_block.rb, line 75 def valid? if @valid == UNSET # Performance optimization # # If all the lines were previously hidden # and we expand to capture additional empty # lines then the result cannot be invalid # # That means there's no reason to re-check all # lines with the parser (which is expensive). # Benchmark in commit message @valid = if lines.all? { |l| l.hidden? || l.empty? } true else SyntaxSuggest.valid?(lines.map(&:original).join) end else @valid end end
Source
# File lib/syntax_suggest/code_block.rb, line 39 def visible_lines @lines.select(&:visible?).select(&:not_empty?) end