# 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: [])
Source

    # 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)
Source

    # 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

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

current_indent ()
Source

    # File lib/syntax_suggest/code_block.rb, line 67
    def current_indent
      @current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0
    end

delete ()
Source

    # File lib/syntax_suggest/code_block.rb, line 31
    def delete
      @deleted = true
    end

deleted? ()
Source

    # File lib/syntax_suggest/code_block.rb, line 35
    def deleted?
      @deleted
    end

hidden? ()
Source

    # File lib/syntax_suggest/code_block.rb, line 51
    def hidden?
      @lines.all?(&:hidden?)
    end

invalid? ()
Source

    # File lib/syntax_suggest/code_block.rb, line 71
    def invalid?
      !valid?
    end

is_end? ()
Source

    # File lib/syntax_suggest/code_block.rb, line 47
    def is_end?
      to_s.strip == "end"
    end

mark_invisible ()
Source

    # File lib/syntax_suggest/code_block.rb, line 43
    def mark_invisible
      @lines.map(&:mark_invisible)
    end

to_s ()
Source

    # File lib/syntax_suggest/code_block.rb, line 96
    def to_s
      @lines.join
    end

valid? ()
Source

    # 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 ()
Source

    # File lib/syntax_suggest/code_block.rb, line 39
    def visible_lines
      @lines.select(&:visible?).select(&:not_empty?)
    end