class RuboCop::Cop::Performance::ReverseFirst
array.last
array.last(5).reverse
# good
array.reverse.first
array.reverse.first(5)
# bad
@example
can be replaced by ‘last(n).reverse` and `last`.
Identifies places where `reverse.first(n)` and `reverse.first`
def build_good_method(node)
def build_good_method(node) if node.arguments? "last(#{node.first_argument.source})#{node.loc.dot.source}reverse" else 'last' end end
def build_message(node, range)
def build_message(node, range) good_method = build_good_method(node) bad_method = range.source format(MSG, good_method: good_method, bad_method: bad_method) end
def correction_range(receiver, node)
def correction_range(receiver, node) range_between(receiver.loc.selector.begin_pos, node.source_range.end_pos) end
def on_send(node)
def on_send(node) reverse_first_candidate?(node) do |receiver| range = correction_range(receiver, node) message = build_message(node, range) add_offense(range, message: message) do |corrector| replacement = build_good_method(node) corrector.replace(range, replacement) end end end