class RuboCop::Cop::Performance::Caller

This cop identifies places where `caller` can be replaced by `caller(n..n).first`.

@example

# bad
caller[1]
caller.first
caller_locations[1]
caller_locations.first

# good
caller(2..2).first
caller(1..1).first
caller_locations(2..2).first
caller_locations(1..1).first

Constants

MSG_BRACE
MSG_FIRST

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/performance/caller.rb, line 40
def on_send(node)
  return unless caller_with_scope_method?(node)

  add_offense(node)
end

Private Instance Methods

int_value(node) click to toggle source
# File lib/rubocop/cop/performance/caller.rb, line 62
def int_value(node)
  node.children[0]
end
message(node) click to toggle source
# File lib/rubocop/cop/performance/caller.rb, line 48
def message(node)
  method_name = node.receiver.method_name
  caller_arg = node.receiver.first_argument
  n = caller_arg ? int_value(caller_arg) : 1

  if node.method_name == :[]
    m = int_value(node.first_argument)
    n += m
    format(MSG_BRACE, n: n, m: m, method: method_name)
  else
    format(MSG_FIRST, n: n, method: method_name)
  end
end