class RuboCop::Cop::Style::ParallelAssignment::AssignmentSorter

Newer versions have a better API, but that doesn’t help us
Helper class necessitated by silly design of TSort prior to Ruby 2.1

def accesses?(rhs, lhs)

Does `rhs` access the same value which is assigned by `lhs`?
`lhs` is an assignment method call like `obj.attr=` or `ary[idx]=`.
def accesses?(rhs, lhs)
  if lhs.method_name == :[]=
    matching_calls(rhs, lhs.receiver, :[]).any? do |args|
      args == lhs.method_args
    end
  else
    access_method = lhs.method_name.to_s.chop.to_sym
    matching_calls(rhs, lhs.receiver, access_method).any?
  end
end

def initialize(assignments)

def initialize(assignments)
  @assignments = assignments
end

def tsort_each_child(assignment)

def tsort_each_child(assignment)
  # yield all the assignments which must come after `assignment`
  # (due to dependencies on the previous value of the assigned var)
  my_lhs, _my_rhs = *assignment
  @assignments.each do |other|
    _other_lhs, other_rhs = *other
    if ((var = var_name(my_lhs)) && uses_var?(other_rhs, var)) ||
       (my_lhs.asgn_method_call? && accesses?(other_rhs, my_lhs))
      yield other
    end
  end
end

def tsort_each_node

def tsort_each_node
  @assignments.each { |a| yield a }
end