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
Public Class Methods
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
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
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
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
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
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
Source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 70 def method?(node) METHOD_TYPES.include? node.type end
Source
# File lib/ndr_dev_support/rubocop/range_augmenter.rb, line 66 def module?(node) MODULE_TYPES.include? node.type end
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