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
hidden? ()
# File lib/syntax_suggest/code_block.rb, line 51
def hidden?
  @lines.all?(&:hidden?)
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