class NdrDevSupport::Rubocop::RangeAugmenter

For a given file, and set of line ranges, computes a list of all lines covered, expanding the ranges to include full method defintions, and class/module headers.

Constants

METHOD_TYPES
MODULE_TYPES

Attributes

filename[R]

Public Class Methods

augmented_lines_for(file_ranges) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 13
def augmented_lines_for(file_ranges)
  output = {}
  file_ranges.each do |file, ranges|
    output[file] = new(file, ranges).lines
  end
  output
end
new(filename, ranges) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 22
def initialize(filename, ranges)
  @filename = filename
  @lines    = ranges.map(&:to_a).flatten
end

Public Instance Methods

augmented_lines() click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 27
def augmented_lines
  require 'parser/current'
  root  = Parser::CurrentRuby.parse IO.read(filename)
  nodes = extract_augmenting_nodes(root)

  lines_covering(@lines, nodes)
end

Private Instance Methods

dead_end?(node) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 74
def dead_end?(node)
  return true unless node.is_a?(Parser::AST::Node)
  location = node.location
  !(location && location.expression)
end
extract_augmenting_nodes(parent, result = []) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 59
def extract_augmenting_nodes(parent, result = [])
  return result if dead_end?(parent)
  result.push(parent) if method?(parent) || module?(parent)
  parent.children.each { |node| extract_augmenting_nodes(node, result) }
  result
end
lines_covering(lines, nodes) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 45
def lines_covering(lines, nodes)
  nodes.each do |node|
    range = range_for(node)
    next unless lines.detect { |line| range.cover?(line) }

    if method?(node)
      lines.concat(range.to_a)
    elsif module?(node)
      lines.push(range.begin)
    end
  end
  lines.uniq.sort
end
method?(node) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 70
def method?(node)
  METHOD_TYPES.include? node.type
end
module?(node) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 66
def module?(node)
  MODULE_TYPES.include? node.type
end
range_for(node) click to toggle source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 37
def range_for(node)
  expression = node.location.expression
  start_line = expression.line
  end_line, _column = expression.source_buffer.decompose_position(expression.end_pos)

  start_line..end_line
end