class RuboCop::Cop::Style::EvenOdd

This cop checks for places where Fixnum#even? or Fixnum#odd? should have been used.

@example

# bad
if x % 2 == 0

# good
if x.even?

Constants

MSG
ONE
TWO
ZERO

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 28
def autocorrect(node)
  correction = "#{base_number(node)}.#{offense_type(node)}?"
  ->(corrector) { corrector.replace(node.source_range, correction) }
end
on_send(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 23
def on_send(node)
  offense = offense_type(node)
  add_offense(node, :expression, format(MSG, offense)) if offense
end

Private Instance Methods

base_number(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 35
def base_number(node)
  receiver, = *node
  node = expression(receiver)
  node.children[0].source
end
div_by_2?(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 54
def div_by_2?(node)
  node = expression(node)

  _receiver, method, args = *node

  method == :% && args == TWO
end
expression(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 62
def expression(node)
  return unless node

  # check for scenarios like (x % 2) == 0
  if node.type == :begin && node.children.size == 1
    node = node.children.first
  end

  return unless node.type == :send
  node
end
offense_type(node) click to toggle source
# File lib/rubocop/cop/style/even_odd.rb, line 41
def offense_type(node)
  receiver, method, args = *node

  return unless [:==, :!=].include?(method)
  return unless div_by_2?(receiver)

  if args == ZERO
    method == :== ? :even : :odd
  elsif args == ONE
    method == :== ? :odd : :even
  end
end