class RuboCop::Cop::Style::ZeroLengthPredicate

This cop checks for numeric comparisons that can be replaced by a predicate method, such as receiver.length == 0, receiver.length > 0, receiver.length != 0, receiver.length < 1 and receiver.size == 0 that can be replaced by receiver.empty? and !receiver.empty.

@example

@bad
[1, 2, 3].length == 0
0 == "foobar".length
array.length < 1
{a: 1, b: 2}.length != 0
string.length > 0
hash.size > 0

@good
[1, 2, 3].empty?
"foobar".empty?
array.empty?
!{a: 1, b: 2}.empty?
!string.empty?
!hash.empty?

Constants

NONZERO_MSG
ZERO_MSG

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/style/zero_length_predicate.rb, line 32
def on_send(node)
  check_zero_length_predicate(node)
  check_nonzero_length_predicate(node)
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/zero_length_predicate.rb, line 69
def autocorrect(node)
  lambda do |corrector|
    corrector.replace(node.loc.expression, replacement(node))
  end
end
check_nonzero_length_predicate(node) click to toggle source
# File lib/rubocop/cop/style/zero_length_predicate.rb, line 48
def check_nonzero_length_predicate(node)
  nonzero_length_predicate = nonzero_length_predicate(node)

  return unless nonzero_length_predicate

  add_offense(node,
              message: format(NONZERO_MSG, *nonzero_length_predicate))
end
check_zero_length_predicate(node) click to toggle source
# File lib/rubocop/cop/style/zero_length_predicate.rb, line 39
def check_zero_length_predicate(node)
  zero_length_predicate = zero_length_predicate(node)

  return unless zero_length_predicate

  add_offense(node,
              message: format(ZERO_MSG, *zero_length_predicate))
end
replacement(node) click to toggle source
# File lib/rubocop/cop/style/zero_length_predicate.rb, line 75
def replacement(node)
  receiver = zero_length_receiver(node)
  return "#{receiver.source}.empty?" if receiver

  "!#{other_receiver(node).source}.empty?"
end