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