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)
`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