class RuboCop::Cop::Performance::ReverseFirst
This cop identifies places where `reverse.first(n)` and `reverse.first` can be replaced by `last(n).reverse` and `last`.
@example
# bad array.reverse.first(5) array.reverse.first # good array.last(5).reverse array.last
Constants
- MSG
- RESTRICT_ON_SEND
Public Instance Methods
on_send(node)
click to toggle source
# File lib/rubocop/cop/performance/reverse_first.rb, line 30 def on_send(node) reverse_first_candidate?(node) do |receiver| range = correction_range(receiver, node) message = build_message(node) add_offense(range, message: message) do |corrector| replacement = build_good_method(node) corrector.replace(range, replacement) end end end
Private Instance Methods
build_bad_method(node)
click to toggle source
# File lib/rubocop/cop/performance/reverse_first.rb, line 63 def build_bad_method(node) if node.arguments? "reverse.first(#{node.arguments.first.source})" else 'reverse.first' end end
build_good_method(node)
click to toggle source
# File lib/rubocop/cop/performance/reverse_first.rb, line 55 def build_good_method(node) if node.arguments? "last(#{node.arguments.first.source}).reverse" else 'last' end end
build_message(node)
click to toggle source
# File lib/rubocop/cop/performance/reverse_first.rb, line 49 def build_message(node) good_method = build_good_method(node) bad_method = build_bad_method(node) format(MSG, good_method: good_method, bad_method: bad_method) end
correction_range(receiver, node)
click to toggle source
# File lib/rubocop/cop/performance/reverse_first.rb, line 45 def correction_range(receiver, node) range_between(receiver.loc.selector.begin_pos, node.loc.expression.end_pos) end