123456789_123456789_123456789_123456789_123456789_

Class: SyntaxSuggest::ParseBlocksFromIndentLine

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

Overview

This class is responsible for generating initial code blocks that will then later be expanded.

The biggest concern when guessing code blocks, is accidentally grabbing one that contains only an “end”. In this example:

def dog
  begonn # misspelled `begin`
  puts "bark"
  end
end

The following lines would be matched (from bottom to top):

1) end

2) puts "bark"
   end

3) begonn
   puts "bark"
   end

At this point it has no where else to expand, and it will yield this inner code as a block

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(code_lines:) ⇒ ParseBlocksFromIndentLine

[ GitHub ]

  
# File 'lib/syntax_suggest/parse_blocks_from_indent_line.rb', line 32

def initialize(code_lines:)
  @code_lines = code_lines
end

Instance Attribute Details

#code_lines (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/parse_blocks_from_indent_line.rb', line 30

attr_reader :code_lines

Instance Method Details

#each_neighbor_block(target_line)

Builds blocks from bottom up

[ GitHub ]

  
# File 'lib/syntax_suggest/parse_blocks_from_indent_line.rb', line 37

def each_neighbor_block(target_line)
  scan = AroundBlockScan.new(code_lines: code_lines, block: CodeBlock.new(lines: target_line))
    .force_add_empty
    .force_add_hidden
    .scan_while { |line| line.indent >= target_line.indent }

  neighbors = scan.code_block.lines

  block = CodeBlock.new(lines: neighbors)
  if neighbors.length <= 2 || block.valid?
    yield block
  else
    until neighbors.empty?
      lines = [neighbors.pop]
      while (block = CodeBlock.new(lines: lines)) && block.invalid? && neighbors.any?
        lines.prepend neighbors.pop
      end

      yield block if block
    end
  end
end