diff --git a/changelog/fix_an_incorrect_for_style_object_then.md b/changelog/fix_an_incorrect_for_style_object_then.md new file mode 100644 index 000000000000..cdc931c9375f --- /dev/null +++ b/changelog/fix_an_incorrect_for_style_object_then.md @@ -0,0 +1 @@ +* [#12693](https://github.com/rubocop/rubocop/issues/12693): Fix an incorrect autocorrect for `Style/ObjectThen` when using `yield_self` without receiver. ([@koic][]) diff --git a/lib/rubocop/cop/style/object_then.rb b/lib/rubocop/cop/style/object_then.rb index 03a7e66372fb..080a528aae72 100644 --- a/lib/rubocop/cop/style/object_then.rb +++ b/lib/rubocop/cop/style/object_then.rb @@ -46,20 +46,22 @@ def on_send(node) private def check_method_node(node) - return unless preferred_method(node) + return if preferred_method?(node) message = message(node) add_offense(node.loc.selector, message: message) do |corrector| - corrector.replace(node.loc.selector, style.to_s) + prefer = style == :then && node.receiver.nil? ? 'self.then' : style + + corrector.replace(node.loc.selector, prefer) end end - def preferred_method(node) + def preferred_method?(node) case style when :then - node.method?(:yield_self) - when :yield_self node.method?(:then) + when :yield_self + node.method?(:yield_self) else false end diff --git a/spec/rubocop/cop/style/object_then_spec.rb b/spec/rubocop/cop/style/object_then_spec.rb index 99bf4aaa682c..38f7a758dca5 100644 --- a/spec/rubocop/cop/style/object_then_spec.rb +++ b/spec/rubocop/cop/style/object_then_spec.rb @@ -36,6 +36,17 @@ obj.then { _1.test } RUBY end + + it 'registers an offense for `yield_self` without receiver' do + expect_offense(<<~RUBY) + yield_self { |obj| obj.test } + ^^^^^^^^^^ Prefer `then` over `yield_self`. + RUBY + + expect_correction(<<~RUBY) + self.then { |obj| obj.test } + RUBY + end end it 'registers an offense for yield_self with proc param' do