class RuboCop::Cop::Style::SingleArgumentDig

Sometimes using ‘dig` method ends up with just a single argument. In such cases, dig should be replaced with `[]`.

Since replacing ‘hash&.dig(:key)` with `hash` could potentially lead to error, calls to the `dig` method using safe navigation will be ignored.

@safety

This cop is unsafe because it cannot be guaranteed that the receiver
is an `Enumerable` or does not have a nonstandard implementation
of `dig`.

@example

# bad
{ key: 'value' }.dig(:key)
[1, 2, 3].dig(0)

# good
{ key: 'value' }[:key]
[1, 2, 3][0]

# good
{ key1: { key2: 'value' } }.dig(:key1, :key2)
[1, [2, [3]]].dig(1, 1)

# good
keys = %i[key1 key2]
{ key1: { key2: 'value' } }.dig(*keys)

Constants

IGNORED_ARGUMENT_TYPES
MSG
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/style/single_argument_dig.rb, line 46
def on_send(node)
  return unless node.receiver

  expression = single_argument_dig?(node)
  return unless expression
  return if IGNORED_ARGUMENT_TYPES.include?(expression.type)

  receiver = node.receiver.source
  argument = expression.source

  message = format(MSG, receiver: receiver, argument: argument, original: node.source)
  add_offense(node, message: message) do |corrector|
    next if part_of_ignored_node?(node)

    correct_access = "#{receiver}[#{argument}]"
    corrector.replace(node, correct_access)
  end

  ignore_node(node)
end