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.source_range.source_buffer, node.loc.dot.begin_pos, node.source_range.end_pos) corrector.remove(range) corrector.replace(array.loc.selector, 'flat_map') end end
def offense(node, expression, first_method, second_method, message)
def offense(node, expression, first_method, second_method, message) range = Parser::Source::Range.new(node.source_range.source_buffer, expression.loc.selector.begin_pos, node.loc.selector.end_pos) add_offense(node, range, format(message, first_method, second_method)) end
def offense_for_levels(node, expression, first_method, second_method)
def offense_for_levels(node, expression, first_method, second_method) message = MSG + FLATTEN_MULTIPLE_LEVELS offense(node, expression, first_method, second_method, message) end
def offense_for_method(node, expression, first_method, second_method)
def offense_for_method(node, expression, first_method, second_method) offense(node, expression, first_method, second_method, MSG) 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 if cop_config['EnabledForFlattenWithoutParams'] && flatten_level.nil? offense_for_levels(node, expression, first_method, second_method) elsif flatten_level == 1 offense_for_method(node, expression, first_method, second_method) end end