class RuboCop::Cop::Performance::Casecmp

‘abc’.casecmp(str).zero?
str.casecmp(‘ABC’).zero?
# good
str.downcase == str.downcase
’ABC’.eql? str.upcase
’abc’ == str.downcase
str.upcase.eql? ‘ABC’
str.downcase == ‘abc’
# bad
@example
differently when using Non-ASCII characters.
This cop is unsafe because ‘String#casecmp` and `String#casecmp?` behave
@safety
safely enabled.
If you are working only with ASCII characters, then this cop can be
ASCII characters. See github.com/rubocop/rubocop/issues/9753.
This cop is disabled by default because `String#casecmp` only works with
can better be implemented using `casecmp`.
Identifies places where a case-insensitive string comparison

def autocorrect(corrector, node, replacement)

def autocorrect(corrector, node, replacement)
  corrector.replace(node, replacement)
end

def build_good_method(method, arg, variable)

def build_good_method(method, arg, variable)
  bang = method == :!= ? '!' : ''
  # We want resulting call to be parenthesized
  # if arg already includes one or more sets of parens, don't add more
  # or if method call already used parens, again, don't add more
  if arg.send_type? || !parentheses?(arg)
    "#{bang}#{variable.source}.casecmp(#{arg.source}).zero?"
  else
    "#{bang}#{variable.source}.casecmp#{arg.source}.zero?"
  end
end

def on_send(node)

def on_send(node)
  return unless downcase_eq(node) || eq_downcase(node)
  return unless (parts = take_method_apart(node))
  _receiver, method, arg, variable = parts
  good_method = build_good_method(method, arg, variable)
  message = format(MSG, good: good_method, bad: node.source)
  add_offense(node, message: message) do |corrector|
    autocorrect(corrector, node, good_method)
  end
end

def take_method_apart(node)

def take_method_apart(node)
  if downcase_downcase(node)
    receiver, method, rhs = *node
    arg, = *rhs
  elsif downcase_eq(node)
    receiver, method, arg = *node
  elsif eq_downcase(node)
    arg, method, receiver = *node
  else
    return
  end
  variable, = *receiver
  [receiver, method, arg, variable]
end