class RuboCop::Cop::Performance::DeleteSuffix

In Ruby 2.5, `String#delete_suffix` has been added.

This cop identifies places where `gsub(/suffixz/, '')` and `sub(/suffixz/, '')` can be replaced by `delete_suffix('suffix')`. It is marked as unsafe by default because `Pathname` has `sub` but not `delete_suffix`.

This cop has `SafeMultiline` configuration option that `true` by default because `suffix$` is unsafe as it will behave incompatible with `delete_suffix?` for receiver is multiline string.

The `delete_suffix('suffix')` method is faster than `gsub(/suffixz/, '')`.

@example

# bad
str.gsub(/suffix\z/, '')
str.gsub!(/suffix\z/, '')

str.sub(/suffix\z/, '')
str.sub!(/suffix\z/, '')

# good
str.delete_suffix('suffix')
str.delete_suffix!('suffix')

@example SafeMultiline: true (default)

# good
str.gsub(/suffix$/, '')
str.gsub!(/suffix$/, '')
str.sub(/suffix$/, '')
str.sub!(/suffix$/, '')

@example SafeMultiline: false

# bad
str.gsub(/suffix$/, '')
str.gsub!(/suffix$/, '')
str.sub(/suffix$/, '')
str.sub!(/suffix$/, '')

Constants

MSG
PREFERRED_METHODS
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/performance/delete_suffix.rb, line 68
def on_send(node)
  return unless (receiver, bad_method, regexp_str, replace_string = delete_suffix_candidate?(node))
  return unless replace_string.empty?

  good_method = PREFERRED_METHODS[bad_method]

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

  add_offense(node.loc.selector, message: message) do |corrector|
    regexp_str = drop_end_metacharacter(regexp_str)
    regexp_str = interpret_string_escapes(regexp_str)
    string_literal = to_string_literal(regexp_str)

    new_code = "#{receiver.source}.#{good_method}(#{string_literal})"

    corrector.replace(node, new_code)
  end
end