diff --git a/changelog/fix_an_error_for_style_single_argument_dig.md b/changelog/fix_an_error_for_style_single_argument_dig.md new file mode 100644 index 00000000000..ad7966abee5 --- /dev/null +++ b/changelog/fix_an_error_for_style_single_argument_dig.md @@ -0,0 +1 @@ +* [#10510](https://github.com/rubocop/rubocop/issues/10510): Fix an error for `Style/SingleArgumentDig` when using multiple `dig` in a method chain. ([@koic][]) diff --git a/lib/rubocop/cop/style/single_argument_dig.rb b/lib/rubocop/cop/style/single_argument_dig.rb index d31ba4f6ec3..f0a2d1ed1a3 100644 --- a/lib/rubocop/cop/style/single_argument_dig.rb +++ b/lib/rubocop/cop/style/single_argument_dig.rb @@ -50,9 +50,13 @@ def on_send(node) 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 end end diff --git a/spec/rubocop/cop/style/single_argument_dig_spec.rb b/spec/rubocop/cop/style/single_argument_dig_spec.rb index 7519072e77f..3de2cf3dfff 100644 --- a/spec/rubocop/cop/style/single_argument_dig_spec.rb +++ b/spec/rubocop/cop/style/single_argument_dig_spec.rb @@ -54,6 +54,20 @@ end end + context 'when using multiple `dig` in a method chain' do + it 'registers and corrects an offense' do + expect_offense(<<~RUBY) + data.dig(var1)[0].dig(var2) + ^^^^^^^^^^^^^^ Use `data[var1]` instead of `data.dig(var1)`. + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `data.dig(var1)[0][var2]` instead of `data.dig(var1)[0].dig(var2)`. + RUBY + + expect_correction(<<~RUBY) + data.dig(var1)[0][var2] + RUBY + end + end + context 'when using dig with splat operator' do it 'does not register an offense' do expect_no_offenses(<<~RUBY)