class RuboCop::Cop::Performance::ArraySemiInfiniteRangeSlice


array.take(3)
array.drop(2)
array.drop(2)
array.take(2)
array.take(3)
# good

array.slice(..2)
array[2…]
array[2..]
array[…2]
array[..2]
# bad
@example
This cop is unsafe for string slices because strings do not have ‘#take` and `#drop` methods.
@safety
Refer github.com/rubocop/rubocop-performance/pull/175#issuecomment-731892717<br>This cop was created due to a mistake in microbenchmark and hence is disabled by default.
can be replaced by `Array#take` and `Array#drop`.
Identifies places where slicing arrays with semi-infinite ranges

def correction(receiver, range_node)

def correction(receiver, range_node)
  method_call = if range_node.begin
                  "drop(#{range_node.begin.value})"
                elsif range_node.irange_type?
                  "take(#{range_node.end.value + 1})"
                else
                  "take(#{range_node.end.value})"
                end
  "#{receiver.source}.#{method_call}"
end

def on_send(node)

def on_send(node)
  endless_range_slice?(node) do |receiver, method_name, range_node|
    prefer = range_node.begin ? :drop : :take
    message = format(MSG, prefer: prefer, current: method_name)
    add_offense(node, message: message) do |corrector|
      corrector.replace(node, correction(receiver, range_node))
    end
  end
end