# 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 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) 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 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() click to toggle 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() click to toggle source

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

deleted?() click to toggle source

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

hidden?() click to toggle source

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

invalid?() click to toggle source

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

is_end?() click to toggle source

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

mark_invisible() click to toggle source

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

to_s() click to toggle source

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

valid?() click to toggle 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() click to toggle source

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