Class: RuboCop::Cop::Performance::Casecmp
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
AutoCorrector,
Base
|
|
Instance Chain:
self,
Base
|
|
Inherits: |
Base
|
Defined in: | lib/rubocop/cop/performance/casecmp.rb |
Overview
Identifies places where a case-insensitive string comparison
can better be implemented using casecmp
.
This cop is disabled by default because String#casecmp
only works with
ASCII characters. See https://github.com/rubocop/rubocop/issues/9753.
If you are working only with ASCII characters, then this cop can be safely enabled.
Constant Summary
-
CASE_METHODS =
# File 'lib/rubocop/cop/performance/casecmp.rb', line 35%i[downcase upcase].freeze
-
MSG =
# File 'lib/rubocop/cop/performance/casecmp.rb', line 33'Use `%<good>s` instead of `%<bad>s`.'
-
RESTRICT_ON_SEND =
# File 'lib/rubocop/cop/performance/casecmp.rb', line 34%i[== eql? !=].freeze
Instance Method Summary
Instance Method Details
#autocorrect(corrector, node, replacement) (private)
[ GitHub ]# File 'lib/rubocop/cop/performance/casecmp.rb', line 90
def autocorrect(corrector, node, replacement) corrector.replace(node, replacement) end
#build_good_method(method, arg, variable) (private)
[ GitHub ]# File 'lib/rubocop/cop/performance/casecmp.rb', line 94
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
#on_send(node)
[ GitHub ]# File 'lib/rubocop/cop/performance/casecmp.rb', line 58
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) = format(MSG, good: good_method, bad: node.source) add_offense(node, message: ) do |corrector| autocorrect(corrector, node, good_method) end end
#take_method_apart(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/performance/casecmp.rb', line 73
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