module RuboCop::Cop::Style::ConditionalAssignmentHelper

Helper module to provide common methods to classes needed for the ConditionalAssignment Cop.

Constants

ALIGN_WITH
END_ALIGNMENT
EQUAL
KEYWORD

Public Instance Methods

end_with_eq?(sym) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 64
def end_with_eq?(sym)
  sym.to_s.end_with?(EQUAL)
end
expand_elses(branch) click to toggle source

`elsif` branches show up in the `node` as an `else`. We need to recursively iterate over all `else` branches and consider all but the last `node` an `elsif` branch and consider the last `node` the actual `else` branch.

# File lib/rubocop/cop/style/conditional_assignment.rb, line 20
def expand_elses(branch)
  elsif_branches = expand_elsif(branch)
  else_branch = elsif_branches.any? ? elsif_branches.pop : branch
  [elsif_branches, else_branch]
end
expand_when_branches(when_branches) click to toggle source

`when` nodes contain the entire branch including the condition. We only need the contents of the branch, not the condition.

# File lib/rubocop/cop/style/conditional_assignment.rb, line 28
def expand_when_branches(when_branches)
  when_branches.map(&:body)
end
indent(cop, source) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/rubocop/cop/style/conditional_assignment.rb, line 55
def indent(cop, source)
  conf = cop.config.for_cop(END_ALIGNMENT)
  if conf[ALIGN_WITH] == KEYWORD
    ' ' * source.length
  else
    ''
  end
end
lhs(node) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/rubocop/cop/style/conditional_assignment.rb, line 37
def lhs(node)
  case node.type
  when :send
    lhs_for_send(node)
  when :op_asgn
    "#{node.children[0].source} #{node.children[1]}= "
  when :and_asgn, :or_asgn
    "#{node.children[0].source} #{node.loc.operator.source} "
  when :casgn
    lhs_for_casgn(node)
  when *ConditionalAssignment::VARIABLE_ASSIGNMENT_TYPES
    "#{node.children[0]} = "
  else
    node.source
  end
end
tail(branch) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 32
def tail(branch)
  branch.begin_type? ? Array(branch).last : branch
end

Private Instance Methods

assignment_rhs_exist?(node) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 109
def assignment_rhs_exist?(node)
  parent = node.parent
  return true unless parent

  !(parent.mlhs_type? || parent.resbody_type?)
end
expand_elsif(node, elsif_branches = []) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 70
def expand_elsif(node, elsif_branches = [])
  return [] if node.nil? || !node.if_type? || !node.elsif?

  elsif_branches << node.if_branch

  else_branch = node.else_branch
  if else_branch&.if_type? && else_branch&.elsif?
    expand_elsif(else_branch, elsif_branches)
  else
    elsif_branches << else_branch
  end
end
lhs_for_casgn(node) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 96
def lhs_for_casgn(node)
  namespace = node.children[0]
  if namespace.nil? || namespace.cbase_type?
    "#{namespace&.source}#{node.children[1]} = "
  else
    "#{namespace.source}::#{node.children[1]} = "
  end
end
lhs_for_send(node) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 83
def lhs_for_send(node)
  receiver = node.receiver ? node.receiver.source : ''

  if node.method?(:[]=)
    indices = node.arguments[0...-1].map(&:source).join(', ')
    "#{receiver}[#{indices}] = "
  elsif node.setter_method?
    "#{receiver}.#{node.method_name[0...-1]} = "
  else
    "#{receiver} #{node.method_name} "
  end
end
setter_method?(method_name) click to toggle source
# File lib/rubocop/cop/style/conditional_assignment.rb, line 105
def setter_method?(method_name)
  method_name.to_s.end_with?(EQUAL) && !%i[!= == === >= <=].include?(method_name)
end