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
ends_at[R]
lines[R]
starts_at[R]
Public Class Methods
new(lines: [])
click to toggle source
# File 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
<=>(other)
click to toggle source
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 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
current_indent()
click to toggle source
# File syntax_suggest/code_block.rb, line 67 def current_indent @current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0 end
delete()
click to toggle source
# File syntax_suggest/code_block.rb, line 31 def delete @deleted = true end
deleted?()
click to toggle source
# File syntax_suggest/code_block.rb, line 35 def deleted? @deleted end
invalid?()
click to toggle source
# File syntax_suggest/code_block.rb, line 71 def invalid? !valid? end
is_end?()
click to toggle source
# File syntax_suggest/code_block.rb, line 47 def is_end? to_s.strip == "end" end
mark_invisible()
click to toggle source
# File syntax_suggest/code_block.rb, line 43 def mark_invisible @lines.map(&:mark_invisible) end
to_s()
click to toggle source
# File syntax_suggest/code_block.rb, line 96 def to_s @lines.join end
valid?()
click to toggle source
# File 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 ripper (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
visible_lines()
click to toggle source
# File syntax_suggest/code_block.rb, line 39 def visible_lines @lines.select(&:visible?).select(&:not_empty?) end