class RuboCop::Cop::Performance::FlatMap
- 1, 2, 3, 4].collect { |e| [e, e
-
}.flatten
[1, 2, 3, 4].map { |e| [e, e] }.flatten
[1, 2, 3, 4].flat_map { |e| [e, e] }
# good
[1, 2, 3, 4].collect { |e| [e, e] }.flatten(1)
[1, 2, 3, 4].map { |e| [e, e] }.flatten(1)
# bad
@example
This cop is used to identify usages of
def autocorrect(node)
def autocorrect(node) receiver, _flatten, flatten_param = *node flatten_level, = *flatten_param return if flatten_level.nil? array, = *receiver lambda do |corrector| range = Parser::Source::Range.new(node.loc.expression.source_buffer, node.loc.dot.begin_pos, node.loc.expression.end_pos) corrector.remove(range) corrector.replace(array.loc.selector, 'flat_map') end end
def on_send(node)
def on_send(node) left, second_method, flatten_param = *node return unless FLATTEN.include?(second_method) flatten_level, = *flatten_param expression, = *left _array, first_method = *expression return unless first_method == :map || first_method == :collect message = MSG if cop_config['EnabledForFlattenWithoutParams'] && flatten_level.nil? message = MSG + FLATTEN_MULTIPLE_LEVELS else return unless flatten_level == 1 end range = Parser::Source::Range.new(node.loc.expression.source_buffer, expression.loc.selector.begin_pos, node.loc.selector.end_pos) add_offense(node, range, format(message, first_method, second_method)) end