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