class GitDiffMap

Originally from rubocop-definition_validator

Encoding of `line` is changed: `line` in added line is the number of line in old file (not changed). `line` in deleted line is the number of line in new file (changed).

Originally from rubocop-definition_validator

This class override `changed_lines` method. The original method retuns only added lines. However we want added and removed lines.

Constants

VERSION

Attributes

patch[R]

Public Class Methods

new(patch:) click to toggle source
# File lib/git_diff_map.rb, line 8
def initialize(patch:)
  @patch = patch
end
parse(diff) click to toggle source
# File lib/git_diff_map.rb, line 12
def self.parse(diff)
  patch = GitDiffMap::Patch.new(GitDiffParser::Patch.new(diff))
  self.new(patch: patch)
end

Public Instance Methods

translate_new_lines_to_original_lines(lines) click to toggle source
# File lib/git_diff_map.rb, line 21
def translate_new_lines_to_original_lines(lines)
  results = []

  all_changes = patch.changed_lines.dup
  offset = 0

  lines.each do |new_line|
    while true
      if all_changes.empty?
        results << new_line + offset
        break
      else
        change = all_changes.first

        case change.type
        when '-'
          if new_line + offset < change.number
            results << new_line + offset
            break
          end

          offset += 1
        when '+'
          if new_line < change.number
            results << new_line + offset
            break
          end

          if new_line == change.number
            results << nil
            break
          end

          offset -= 1
        end

        all_changes.shift
      end
    end
  end

  results
end
translate_new_to_original(new_line) click to toggle source
# File lib/git_diff_map.rb, line 17
def translate_new_to_original(new_line)
  translate_new_lines_to_original_lines([new_line]).first
end
translate_original_lines_to_new_lines(lines) click to toggle source
# File lib/git_diff_map.rb, line 69
def translate_original_lines_to_new_lines(lines)
  results = []

  all_changes = patch.changed_lines.dup
  offset = 0

  lines.each do |original_line|
    while true
      if all_changes.empty?
        results << original_line + offset
        break
      else
        change = all_changes.first

        case change.type
        when '+'
          if original_line + offset < change.number
            results << original_line + offset
            break
          end

          offset += 1
        when '-'
          if original_line < change.number
            results << original_line + offset
            break
          end

          if original_line == change.number
            results << nil
            break
          end

          offset -= 1
        end

        all_changes.shift
      end
    end
  end

  results
end
translate_original_to_new(original_line) click to toggle source
# File lib/git_diff_map.rb, line 65
def translate_original_to_new(original_line)
  translate_original_lines_to_new_lines([original_line]).first
end