diff --git a/CHANGELOG.md b/CHANGELOG.md index eeda5e479275..371248080453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * [#6763](https://github.com/rubocop-hq/rubocop/pull/6763): Fix false positives in range literals for `Style/MethodCallWithArgsParentheses` `omit_parentheses`. ([@gsamokovarov][]) * [#6748](https://github.com/rubocop-hq/rubocop/issues/6748): Fix `Style/RaiseArgs` auto-correction breaking in contexts that require parentheses. ([@drenmi][]) * [#6751](https://github.com/rubocop-hq/rubocop/issues/6751): Prevent `Style/OneLineConditional` from breaking on `retry` and `break` keywords. ([@drenmi][]) +* [#6755](https://github.com/rubocop-hq/rubocop/issues/6755): Prevent `Style/TrailingCommaInArgument` from breaking when a safe method call is chained on the offending method. ([@drenmi][], [@hoshinotsuyoshi][]) ### Changes diff --git a/lib/rubocop/cop/mixin/trailing_comma.rb b/lib/rubocop/cop/mixin/trailing_comma.rb index 4f8819dc9831..1b72976b3187 100644 --- a/lib/rubocop/cop/mixin/trailing_comma.rb +++ b/lib/rubocop/cop/mixin/trailing_comma.rb @@ -91,7 +91,7 @@ def multiline?(node) end def method_name_and_arguments_on_same_line?(node) - node.send_type? && + %i[send csend].include?(node.type) && node.loc.selector.line == node.arguments.last.last_line && node.last_line == node.arguments.last.last_line end @@ -104,7 +104,7 @@ def allowed_multiline_argument?(node) end def elements(node) - return node.children unless node.send_type? + return node.children unless %i[csend send].include?(node.type) node.arguments.flat_map do |argument| # For each argument, if it is a multi-line hash without braces, diff --git a/spec/rubocop/cop/style/trailing_comma_in_arguments_spec.rb b/spec/rubocop/cop/style/trailing_comma_in_arguments_spec.rb index a781a60f50d3..ee7da4b62de9 100644 --- a/spec/rubocop/cop/style/trailing_comma_in_arguments_spec.rb +++ b/spec/rubocop/cop/style/trailing_comma_in_arguments_spec.rb @@ -416,6 +416,31 @@ ) RUBY end + + it 'does not break when a method call is chaned on the offending one' do + expect_no_offenses(<<-RUBY.strip_indent) + foo.bar( + baz: 1, + ).fetch(:qux) + RUBY + end + + it 'does not break when a safe method call is chained on the ' \ + 'offending one', :ruby23 do + expect_no_offenses(<<-RUBY.strip_indent) + foo + &.do_something(:bar, :baz) + RUBY + end + + it 'does not break when a safe method call is chained on the ' \ + 'offending one', :ruby23 do + expect_no_offenses(<<-RUBY.strip_indent) + foo.bar( + baz: 1, + )&.fetch(:qux) + RUBY + end end context 'when EnforcedStyleForMultiline is consistent_comma' do