class RuboCop::Cop::Lint::IdentityComparison


foo.equal?(bar)
# good
foo.object_id == bar.object_id
# bad
@example
`Object#==‘ is provided for the purpose of doing value comparison.
`Object#equal?` is provided to compare objects for identity, and in contrast
Prefer `equal?` over `==` when comparing `object_id`.

def compare_between_object_id_by_double_equal?(node)

def compare_between_object_id_by_double_equal?(node)
  object_id_method?(node.receiver) && object_id_method?(node.first_argument)
end

def object_id_method?(node)

def object_id_method?(node)
  node.send_type? && node.method?(:object_id)
end

def on_send(node)

def on_send(node)
  return unless compare_between_object_id_by_double_equal?(node)
  add_offense(node) do |corrector|
    receiver = node.receiver.receiver
    argument = node.first_argument.receiver
    return unless receiver && argument
    replacement = "#{receiver.source}.equal?(#{argument.source})"
    corrector.replace(node, replacement)
  end
end