From 7d4f115f0569740f1f7fa194cf66861981fe820d Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Wed, 26 Feb 2025 16:00:05 +0900 Subject: [PATCH] Fix false positives for `Style/EndlessMethod` Follow-up to https://github.com/rubocop/rubocop/pull/13874#issuecomment-2684036210 This PR fixes false positives for `Style/EndlessMethod` when using assignment method definitions. Setter methods cannot be defined as endless methods. ```console $ ruby -vc -e "def foo=(arg) = bar" ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-darwin23] ruby: -e:1: syntax error found (SyntaxError) > 1 | def foo=(arg) = bar | ^~~~ invalid method name; a setter method cannot be defined in an endless method definition ``` --- ...false_positives_for_style_endless_method.md | 1 + lib/rubocop/cop/style/endless_method.rb | 2 ++ spec/rubocop/cop/style/endless_method_spec.rb | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 changelog/fix_false_positives_for_style_endless_method.md diff --git a/changelog/fix_false_positives_for_style_endless_method.md b/changelog/fix_false_positives_for_style_endless_method.md new file mode 100644 index 000000000000..a36c5248f63b --- /dev/null +++ b/changelog/fix_false_positives_for_style_endless_method.md @@ -0,0 +1 @@ +* [#13910](https://github.com/rubocop/rubocop/pull/13910): Fix false positives for `Style/EndlessMethod` when using setter method definitions. ([@koic][]) diff --git a/lib/rubocop/cop/style/endless_method.rb b/lib/rubocop/cop/style/endless_method.rb index e3af07529ef5..98ebad6d51cf 100644 --- a/lib/rubocop/cop/style/endless_method.rb +++ b/lib/rubocop/cop/style/endless_method.rb @@ -144,6 +144,8 @@ class EndlessMethod < Base MSG_REQUIRE_ALWAYS = 'Use endless method definitions.' def on_def(node) + return if node.assignment_method? + case style when :allow_single_line, :allow_always handle_allow_style(node) diff --git a/spec/rubocop/cop/style/endless_method_spec.rb b/spec/rubocop/cop/style/endless_method_spec.rb index 3b1d7d8a3656..319dafcce7d9 100644 --- a/spec/rubocop/cop/style/endless_method_spec.rb +++ b/spec/rubocop/cop/style/endless_method_spec.rb @@ -244,6 +244,14 @@ def my_method = x RUBY end + it 'does not register an offense for a single line setter method' do + expect_no_offenses(<<~RUBY) + def my_method=(arg) + arg.foo + end + RUBY + end + it 'does not register an offense when the endless version excess Metrics/MaxLineLength[Max]' do expect_no_offenses(<<~RUBY) def my_method @@ -392,6 +400,16 @@ def my_method = x.foo RUBY end + it 'does not register an offense for a multiline setter method' do + expect_no_offenses(<<~RUBY) + def my_method=(arg) + x.foo + .bar + .baz + end + RUBY + end + it 'does not register an offense when the endless version excess Metrics/MaxLineLength[Max]' do expect_no_offenses(<<~RUBY) def my_method