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