123456789_123456789_123456789_123456789_123456789_

Class: RuboCop::Cop::Performance::Squeeze

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, AutoCorrector, Base
Instance Chain:
self, Base
Inherits: Base
  • Object
Defined in: lib/rubocop/cop/performance/squeeze.rb

Overview

Identifies places where gsub(/a+/, 'a') and gsub!(/a+/, 'a') can be replaced by squeeze('a') and squeeze!('a').

The squeeze('a') method is faster than gsub(/a+/, 'a').

Examples:

# bad
str.gsub(/a+/, 'a')
str.gsub!(/a+/, 'a')

# good
str.squeeze('a')
str.squeeze!('a')

Constant Summary

Instance Method Summary

Instance Method Details

#on_csend(node)

Alias for #on_send.

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/squeeze.rb', line 57

alias on_csend on_send

#on_send(node) Also known as: #on_csend

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/squeeze.rb', line 39

def on_send(node)
  squeeze_candidate?(node) do |receiver, bad_method, regexp_str, replace_str|
    regexp_str = regexp_str[0..-2] # delete '+' from the end
    regexp_str = interpret_string_escapes(regexp_str)
    return unless replace_str == regexp_str

    good_method = PREFERRED_METHODS[bad_method]
    message = format(MSG, current: bad_method, prefer: good_method)

    add_offense(node.loc.selector, message: message) do |corrector|
      string_literal = to_string_literal(replace_str)
      new_code = "#{receiver.source}#{node.loc.dot.source}#{good_method}(#{string_literal})"

      corrector.replace(node, new_code)
    end
  end
end

#repeating_literal?(regex_str) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/performance/squeeze.rb', line 61

def repeating_literal?(regex_str)
  regex_str.match?(/\A(?:#{Util::LITERAL_REGEX})\+\z/o)
end