Class: RuboCop::Cop::Ezcater::StyleDig

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector, TargetRubyVersion
Defined in:
lib/rubocop/cop/ezcater/style_dig.rb

Overview

Use ‘dig` for deeply nested access.

Examples:


# good
my_hash.dig('foo', 'bar')
my_array.dig(0, 1)

# bad
my_hash['foo']['bar']
my_hash['foo'] && my_hash['foo']['bar']
my_array[0][1]

Constant Summary collapse

MSG =
"Use `dig` for nested access."

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rubocop/cop/ezcater/style_dig.rb', line 31

def on_send(node)
  return unless nested_access_match(node) && !assignment?(node)

  match_node = node
  # walk to outermost access node
  match_node = match_node.parent while access_node?(match_node.parent)

  add_offense(match_node.loc.expression, message: MSG) do |corrector|
    access_node = match_node
    source_args = [access_node.first_argument.source]
    while access_node?(access_node.children.first)
      access_node = access_node.children.first
      source_args << access_node.first_argument.source
    end
    root_node = access_node.children.first

    range = Parser::Source::Range.new(match_node.source_range.source_buffer,
                                      root_node.source_range.end_pos,
                                      match_node.source_range.end_pos)
    corrector.replace(range, ".dig(#{source_args.reverse.join(', ')})")
  end
end