Class: DeadEnd::BlockExpand

Inherits:
Object
  • Object
show all
Defined in:
lib/dead_end/block_expand.rb

Overview

This class is responsible for taking a code block that exists at a far indentaion and then iteratively increasing the block so that it captures everything within the same indentation block.

def dog
  puts "bow"
  puts "wow"
end

block = BlockExpand.new(code_lines: code_lines)

.call(CodeBlock.new(lines: code_lines[1]))

puts block.to_s # => puts “bow”

puts "wow"

Once a code block has captured everything at a given indentation level then it will expand to capture surrounding indentation.

block = BlockExpand.new(code_lines: code_lines)

.call(block)

block.to_s # => def dog

  puts "bow"
  puts "wow"
end

Instance Method Summary collapse

Constructor Details

#initialize(code_lines:) ⇒ BlockExpand

Returns a new instance of BlockExpand.



34
35
36
# File 'lib/dead_end/block_expand.rb', line 34

def initialize(code_lines:)
  @code_lines = code_lines
end

Instance Method Details

#call(block) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/dead_end/block_expand.rb', line 38

def call(block)
  if (next_block = expand_neighbors(block))
    return next_block
  end

  expand_indent(block)
end

#expand_indent(block) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/dead_end/block_expand.rb', line 46

def expand_indent(block)
  AroundBlockScan.new(code_lines: @code_lines, block: block)
    .skip(:hidden?)
    .stop_after_kw
    .scan_adjacent_indent
    .code_block
end

#expand_neighbors(block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/dead_end/block_expand.rb', line 54

def expand_neighbors(block)
  expanded_lines = AroundBlockScan.new(code_lines: @code_lines, block: block)
    .skip(:hidden?)
    .stop_after_kw
    .scan_neighbors
    .scan_while { |line| line.empty? } # Slurp up empties
    .lines

  if block.lines == expanded_lines
    nil
  else
    CodeBlock.new(lines: expanded_lines)
  end
end

#inspectObject

Managable rspec errors



70
71
72
# File 'lib/dead_end/block_expand.rb', line 70

def inspect
  "#<DeadEnd::CodeBlock:0x0000123843lol >"
end