class RuboCop::Cop::Performance::Squeeze
str.squeeze!(‘a’)
str.squeeze(‘a’)
# good
str.gsub!(/a+/, ‘a’)
str.gsub(/a+/, ‘a’)
# bad
@example
The ‘squeeze(’a’)‘ method is faster than `gsub(/a+/, ’a’)‘.
can be replaced by `squeeze(’a’)‘ and `squeeze!(’a’)‘.
Identifies places where `gsub(/a+/, ’a’)‘ and `gsub!(/a+/, ’a’)‘
def on_send(node)
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
def repeating_literal?(regex_str)
def repeating_literal?(regex_str) regex_str.match?(/\A(?:#{Util::LITERAL_REGEX})\+\z/o) end