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 51
def hidden?
  @lines.all?(&:hidden?)
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