diff --git a/changelog/fix_false_negative_for_style_arguments_forwarding.md b/changelog/fix_false_negative_for_style_arguments_forwarding.md new file mode 100644 index 00000000000..d5924284a8a --- /dev/null +++ b/changelog/fix_false_negative_for_style_arguments_forwarding.md @@ -0,0 +1 @@ +* [#10090](https://github.com/rubocop/rubocop/issues/10090): Fix a false negative for `Style/ArgumentsForwarding` when using only kwrest arg. ([@koic][]) diff --git a/lib/rubocop/cop/style/arguments_forwarding.rb b/lib/rubocop/cop/style/arguments_forwarding.rb index ea486bab3c0..2c96536dabb 100644 --- a/lib/rubocop/cop/style/arguments_forwarding.rb +++ b/lib/rubocop/cop/style/arguments_forwarding.rb @@ -30,6 +30,10 @@ module Style # bar(*args) # end # + # def foo(**kwargs) + # bar(**kwargs) + # end + # # @example AllowOnlyRestArgument: false # # bad # # The following code can replace the arguments with `...`, @@ -38,6 +42,10 @@ module Style # bar(*args) # end # + # def foo(**kwargs) + # bar(**kwargs) + # end + # class ArgumentsForwarding < Base include RangeHelp extend AutoCorrector @@ -49,12 +57,15 @@ class ArgumentsForwarding < Base # @!method use_rest_arguments?(node) def_node_matcher :use_rest_arguments?, <<~PATTERN - (args (restarg $_) $...) + (args ({restarg kwrestarg} $_) $...) PATTERN # @!method only_rest_arguments?(node, name) def_node_matcher :only_rest_arguments?, <<~PATTERN - (send _ _ (splat (lvar %1))) + { + (send _ _ (splat (lvar %1))) + (send _ _ (hash (kwsplat (lvar %1)))) + } PATTERN # @!method forwarding_method_arguments?(node, rest_name, block_name, kwargs_name) diff --git a/spec/rubocop/cop/style/arguments_forwarding_spec.rb b/spec/rubocop/cop/style/arguments_forwarding_spec.rb index 5e078623c75..9268fb188c0 100644 --- a/spec/rubocop/cop/style/arguments_forwarding_spec.rb +++ b/spec/rubocop/cop/style/arguments_forwarding_spec.rb @@ -204,6 +204,14 @@ def foo(*args) end RUBY end + + it 'does not register an offense when using only kwrest arg' do + expect_no_offenses(<<~RUBY) + def foo(**kwargs) + bar(**kwargs) + end + RUBY + end end context 'AllowOnlyRestArgument: false' do @@ -224,6 +232,22 @@ def foo(...) end RUBY end + + it 'registers an offense when using only kwrest arg' do + expect_offense(<<~RUBY) + def foo(**kwargs) + ^^^^^^^^ Use arguments forwarding. + bar(**kwargs) + ^^^^^^^^ Use arguments forwarding. + end + RUBY + + expect_correction(<<~RUBY) + def foo(...) + bar(...) + end + RUBY + end end end end