Sha256: 02de44005f559be1d7122552eac9518194c16837e000c28d71e5eaa9d127f931

Contents?: true

Size: 1.77 KB

Versions: 11

Compression:

Stored size: 1.77 KB

Contents

# frozen_string_literal: true
module DeadEnd
  # 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
  #
  class BlockExpand
    def initialize(code_lines: )
      @code_lines = code_lines
    end

    def call(block)
      if (next_block = expand_neighbors(block, grab_empty: true))
        return next_block
      end

      expand_indent(block)
    end

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

    def expand_neighbors(block, grab_empty: true)
      scan = AroundBlockScan.new(code_lines: @code_lines, block: block)
        .skip(:hidden?)
        .stop_after_kw
        .scan_neighbors

      # Slurp up empties
      if grab_empty
        scan = AroundBlockScan.new(code_lines: @code_lines, block: scan.code_block)
          .scan_while {|line| line.empty? || line.hidden? }
      end

      new_block = scan.code_block

      if block.lines == new_block.lines
        return nil
      else
        return new_block
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
dead_end-1.1.7 lib/dead_end/block_expand.rb
dead_end-1.1.6 lib/dead_end/block_expand.rb
dead_end-1.1.5 lib/dead_end/block_expand.rb
dead_end-1.1.4 lib/dead_end/block_expand.rb
dead_end-1.1.3 lib/dead_end/block_expand.rb
dead_end-1.1.2 lib/dead_end/block_expand.rb
dead_end-1.1.1 lib/dead_end/block_expand.rb
dead_end-1.1.0 lib/dead_end/block_expand.rb
dead_end-1.0.2 lib/dead_end/block_expand.rb
dead_end-1.0.1 lib/dead_end/block_expand.rb
dead_end-1.0.0 lib/dead_end/block_expand.rb