Class: RuboCop::Cop::Performance::MapCompact

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector, TargetRubyVersion
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/performance/map_compact.rb

Overview

In Ruby 2.7, ‘Enumerable#filter_map` has been added.

This cop identifies places where ‘map { … }.compact` can be replaced by `filter_map`.

source,ruby

true, false, nil].compact #=> [true, false
true, false, nil].filter_map(&:itself) #=> [true

Examples:

# bad
ary.map(&:foo).compact
ary.collect(&:foo).compact

# good
ary.filter_map(&:foo)
ary.map(&:foo).compact!
ary.compact.map(&:foo)

Constant Summary collapse

MSG =
'Use `filter_map` instead.'
RESTRICT_ON_SEND =
%i[compact].freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object Also known as: on_csend



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rubocop/cop/performance/map_compact.rb', line 54

def on_send(node)
  return unless (map_node = map_compact(node))

  compact_loc = node.loc
  range = range_between(map_node.loc.selector.begin_pos, compact_loc.selector.end_pos)

  add_offense(range) do |corrector|
    corrector.replace(map_node.loc.selector, 'filter_map')
    remove_compact_method(corrector, map_node, node, node.parent)
  end
end