From abcf9d390e99257d4a7282e1120006f19a8b5c3a Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Mon, 11 Oct 2021 23:15:33 +0900 Subject: [PATCH] [Fix #10180] Fix an error for `Style/SelectByRegexp` Fixes #10180. This PR fixes an error for `Style/SelectByRegexp` when using `match?` without a receiver. --- changelog/fix_an_error_for_style_select_by_regexp.md | 1 + lib/rubocop/cop/style/select_by_regexp.rb | 5 +++++ spec/rubocop/cop/style/select_by_regexp_spec.rb | 6 ++++++ 3 files changed, 12 insertions(+) create mode 100644 changelog/fix_an_error_for_style_select_by_regexp.md diff --git a/changelog/fix_an_error_for_style_select_by_regexp.md b/changelog/fix_an_error_for_style_select_by_regexp.md new file mode 100644 index 00000000000..f6dfd943f9f --- /dev/null +++ b/changelog/fix_an_error_for_style_select_by_regexp.md @@ -0,0 +1 @@ +* [#10180](https://github.com/rubocop/rubocop/issues/10180): Fix an error for `Style/SelectByRegexp` when using `match?` without a receiver. ([@koic][]) diff --git a/lib/rubocop/cop/style/select_by_regexp.rb b/lib/rubocop/cop/style/select_by_regexp.rb index 50489dfb371..52887ce635a 100644 --- a/lib/rubocop/cop/style/select_by_regexp.rb +++ b/lib/rubocop/cop/style/select_by_regexp.rb @@ -83,6 +83,7 @@ def on_send(node) return if block_node.body.begin_type? return if receiver_allowed?(block_node.receiver) return unless (regexp_method_send_node = extract_send_node(block_node)) + return if match_predicate_without_receiver?(regexp_method_send_node) regexp = find_regexp(regexp_method_send_node) register_offense(node, block_node, regexp) @@ -127,6 +128,10 @@ def find_regexp(node) node.receiver end end + + def match_predicate_without_receiver?(node) + node.send_type? && node.method?(:match?) && node.receiver.nil? + end end end end diff --git a/spec/rubocop/cop/style/select_by_regexp_spec.rb b/spec/rubocop/cop/style/select_by_regexp_spec.rb index b3a2b51e98b..4c942ef3a46 100644 --- a/spec/rubocop/cop/style/select_by_regexp_spec.rb +++ b/spec/rubocop/cop/style/select_by_regexp_spec.rb @@ -279,6 +279,12 @@ array.#{method} { /regexp/.match?(foo(_1)) } RUBY end + + it 'does not register an offense when using `match?` without a receiver' do + expect_no_offenses(<<~RUBY) + array.#{method} { |item| match?(item) } + RUBY + end end end end