🔍

No recent searches

# class SyntaxSuggest::ParseBlocksFromIndentLine

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

### Attributes

code_lines [R]

### Public Class Methods

new (code_lines:)
Source

    # File lib/syntax_suggest/parse_blocks_from_indent_line.rb, line 32
    def initialize(code_lines:)
      @code_lines = code_lines
    end

### Public Instance Methods

each_neighbor_block (target_line) { |block| ... }
Source

    # 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

Builds blocks from bottom up