123456789_123456789_123456789_123456789_123456789_

Class: SyntaxSuggest::CodeBlock

Relationships & Source Files
Inherits: Object
Defined in: lib/syntax_suggest/code_block.rb

Overview

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

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(lines: []) ⇒ CodeBlock

[ GitHub ]

  
# 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

Instance Attribute Details

#deleted?Boolean (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 35

def deleted?
  @deleted
end

#ends_at (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 21

attr_reader :lines, :starts_at, :ends_at

#hidden?Boolean (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 51

def hidden?
  @lines.all?(&:hidden?)
end

#invalid?Boolean (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 71

def invalid?
  !valid?
end

#is_end?Boolean (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 47

def is_end?
  to_s.strip == "end"
end

#lines (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 21

attr_reader :lines, :starts_at, :ends_at

#starts_at (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 21

attr_reader :lines, :starts_at, :ends_at

#valid?Boolean (readonly)

[ GitHub ]

  
# 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

Instance Method Details

#<=>(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

[ GitHub ]

  
# 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

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 67

def current_indent
  @current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0
end

#delete

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 31

def delete
  @deleted = true
end

#mark_invisible

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 43

def mark_invisible
  @lines.map(&:mark_invisible)
end

#to_s

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 96

def to_s
  @lines.join
end

#visible_lines

[ GitHub ]

  
# File 'lib/syntax_suggest/code_block.rb', line 39

def visible_lines
  @lines.select(&:visible?).select(&:not_empty?)
end