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
# 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
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
# 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
# File lib/syntax_suggest/code_block.rb, line 67 def current_indent @current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0 end
# File lib/syntax_suggest/code_block.rb, line 31 def delete @deleted = true end
# File lib/syntax_suggest/code_block.rb, line 35 def deleted? @deleted end
# File lib/syntax_suggest/code_block.rb, line 71 def invalid? !valid? end
# File lib/syntax_suggest/code_block.rb, line 47 def is_end? to_s.strip == "end" end
# File lib/syntax_suggest/code_block.rb, line 43 def mark_invisible @lines.map(&:mark_invisible) end
# File lib/syntax_suggest/code_block.rb, line 96 def to_s @lines.join end
# 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
# File lib/syntax_suggest/code_block.rb, line 39 def visible_lines @lines.select(&:visible?).select(&:not_empty?) end