Class: RuboCop::Cop::Style::ParallelAssignment::AssignmentSorter

Inherits:
Object
  • Object
show all
Extended by:
Macros
Includes:
TSort
Defined in:
lib/rubocop/cop/style/parallel_assignment.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initialize(assignments) ⇒ AssignmentSorter

Returns a new instance of AssignmentSorter.



141
142
143
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 141

def initialize(assignments)
  @assignments = assignments
end

Instance Method Details

#accesses?(rhs, lhs) ⇒ Boolean

lhs is an assignment method call like obj.attr= or ary[idx]=. Does rhs access the same value which is assigned by lhs?

Returns:

  • (Boolean)


170
171
172
173
174
175
176
177
178
179
180
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 170

def accesses?(rhs, lhs)
  if lhs.method?(:[]=)
    # FIXME: Workaround `rubocop:disable` comment for JRuby.
    # rubocop:disable Performance/RedundantEqualityComparisonBlock
    matching_calls(rhs, lhs.receiver, :[]).any? { |args| args == lhs.arguments }
    # rubocop:enable Performance/RedundantEqualityComparisonBlock
  else
    access_method = lhs.method_name.to_s.chop.to_sym
    matching_calls(rhs, lhs.receiver, access_method).any?
  end
end

#dependency?(lhs, rhs) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
166
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 163

def dependency?(lhs, rhs)
  uses_var?(rhs, var_name(lhs)) ||
    (lhs.send_type? && lhs.assignment_method? && accesses?(rhs, lhs))
end

#matching_calls(node, receiver, method_name) ⇒ Object



139
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 139

def_node_search :matching_calls, '(send %1 %2 $...)'

#tsort_each_child(assignment) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 149

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

    next unless dependency?(my_lhs, other_rhs)

    yield other
  end
end

#tsort_each_node(&block) ⇒ Object



145
146
147
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 145

def tsort_each_node(&block)
  @assignments.each(&block)
end

#uses_var?(node) ⇒ Object



136
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 136

def_node_search :uses_var?, '{({lvar ivar cvar gvar} %) (const _ %)}'

#var_name(node) ⇒ Object



133
# File 'lib/rubocop/cop/style/parallel_assignment.rb', line 133

def_node_matcher :var_name, '{(casgn _ $_) (_ $_)}'