class RuboCop::Cop::Lint::BinaryOperatorWithIdenticalOperands

Checks for places where binary operator has identical operands.

It covers arithmetic operators: ‘-`, `/`, `%`; comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`, “<=“; bitwise operators: `|`, `^`, `&`; boolean operators: `&&`, `||` and “spaceship” operator - “<=>“.

Simple arithmetic operations are allowed by this cop: ‘+`, `*`, `**`, `<<` and `>>`. Although these can be rewritten in a different way, it should not be necessary to do so. This does not include operations such as `-` or `/` where the result will always be the same (`x - x` will always be 0; `x / x` will always be 1), and thus are legitimate offenses.

@safety

This cop is unsafe as it does not consider side effects when calling methods
and thus can generate false positives, for example:

[source,ruby]
----
if wr.take_char == '\0' && wr.take_char == '\0'
  # ...
end
----

@example

# bad
x / x
x.top >= x.top

if a.x != 0 && a.x != 0
  do_something
end

def child?
  left_child || left_child
end

# good
x + x
1 << 1

Constants

ALLOWED_MATH_OPERATORS
MSG

Public Instance Methods

on_and(node) click to toggle source
# File lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb, line 61
def on_and(node)
  add_offense(node, message: format(MSG, op: node.operator)) if node.lhs == node.rhs
end
Also aliased as: on_or
on_or(node)
Alias for: on_and
on_send(node) click to toggle source
# File lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb, line 52
def on_send(node)
  return unless node.binary_operation?

  lhs, operation, rhs = *node
  return if ALLOWED_MATH_OPERATORS.include?(node.method_name)

  add_offense(node, message: format(MSG, op: operation)) if lhs == rhs
end