From cf166e26e23812d0bccba8c45ce26fc6580f41b1 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Mon, 29 Mar 2021 20:53:06 +0900 Subject: [PATCH] Fix an incorrect auto-correct for `Style/SingleLineMethods` Fix the following incorrect auto-correct for `Style/SingleLineMethods` when using single line class method definition. ```console % cat example.rb def self.some_method; body end % rubocop --only Style/SingleLineMethods -a (snip) Offenses: example.rb:1:1: C: [Corrected] Style/SingleLineMethods: Avoid single-line method definitions. def self.some_method; body end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1 file inspected, 1 offense detected, 1 offense corrected ``` ## Before ```console % cat example.rb def some_method() = body ``` `self` is lost due to auto-correction. ## After ```console % cat example.rb def self.some_method() = body ``` --- ...x_incorrect_autocorrect_for_style_single_line_methods.md | 1 + lib/rubocop/cop/style/single_line_methods.rb | 3 ++- spec/rubocop/cop/style/single_line_methods_spec.rb | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 changelog/fix_incorrect_autocorrect_for_style_single_line_methods.md diff --git a/changelog/fix_incorrect_autocorrect_for_style_single_line_methods.md b/changelog/fix_incorrect_autocorrect_for_style_single_line_methods.md new file mode 100644 index 00000000000..b95913135d0 --- /dev/null +++ b/changelog/fix_incorrect_autocorrect_for_style_single_line_methods.md @@ -0,0 +1 @@ +* [#9645](https://github.com/rubocop/rubocop/pull/9645): Fix an incorrect auto-correct for `Style/SingleLineMethods` when using single line class method definition. ([@koic][]) diff --git a/lib/rubocop/cop/style/single_line_methods.rb b/lib/rubocop/cop/style/single_line_methods.rb index 9a0b6c1d3f5..db1cba7194c 100644 --- a/lib/rubocop/cop/style/single_line_methods.rb +++ b/lib/rubocop/cop/style/single_line_methods.rb @@ -91,8 +91,9 @@ def correct_to_multiline(corrector, node) end def correct_to_endless(corrector, node) + self_receiver = node.self_receiver? ? 'self.' : '' arguments = node.arguments.any? ? node.arguments.source : '()' - replacement = "def #{node.method_name}#{arguments} = #{node.body.source}" + replacement = "def #{self_receiver}#{node.method_name}#{arguments} = #{node.body.source}" corrector.replace(node, replacement) end diff --git a/spec/rubocop/cop/style/single_line_methods_spec.rb b/spec/rubocop/cop/style/single_line_methods_spec.rb index f4deafe512a..a61ffaf4b31 100644 --- a/spec/rubocop/cop/style/single_line_methods_spec.rb +++ b/spec/rubocop/cop/style/single_line_methods_spec.rb @@ -168,6 +168,12 @@ def some_method() = body RUBY end + it 'corrects to an endless class method definition' do + expect_correction(<<~RUBY.strip, source: 'def self.some_method; body end') + def self.some_method() = body + RUBY + end + it 'retains comments' do source = 'def some_method; body end # comment' expect_correction(<<~RUBY.strip, source: source)