Sha256: 30498286c4dbf35c3e70f7a6066675a256598ee198267d64d9723129e07e9ce0

Contents?: true

Size: 1.02 KB

Versions: 2

Compression:

Stored size: 1.02 KB

Contents

# frozen_string_literal: true

module RuboCop
  module Cop
    module Performance
      # This cop identifies places where `caller[n]`
      # can be replaced by `caller(n..n).first`.
      #
      # @example
      #   # bad
      #   caller[n]
      #   caller.first
      #
      #   # good
      #   caller(n..n).first
      #   caller(1..1).first
      class Caller < Cop
        MSG = 'Use `caller(n..n)` instead of `caller[n]`.'.freeze
        SCOPE_METHODS = %i[first []].freeze

        def_node_matcher :caller_with_scope_method?, <<-PATTERN
          (send (send nil :caller ...) ${#{SCOPE_METHODS.map(&:inspect).join(' ')}} ...)
        PATTERN

        def on_send(node)
          return unless caller_with_scope_method?(node) && slow_caller?(node)
          add_offense(node, :selector)
        end

        private

        def slow_caller?(node)
          arguments = node.receiver.arguments

          arguments.empty? ||
            (arguments.length == 1 && arguments[0].int_type?)
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rubocop-0.49.1 lib/rubocop/cop/performance/caller.rb
rubocop-0.49.0 lib/rubocop/cop/performance/caller.rb