From fc47845b75902e834adfefb3767fa018dd4d3d5e Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Wed, 27 Oct 2021 21:21:22 +0900 Subject: [PATCH] [Fix #10216] Fix an incorrect autocorrect for `Style/SelectByRegexp` Fix #10216. This PR fixes an incorrect autocorrect for `Style/SelectByRegexp` when using `lvar =~ blockvar` in a block. --- ..._autocorrect_for_style_select_by_regexp.md | 1 + lib/rubocop/cop/style/select_by_regexp.rb | 7 ++--- .../cop/style/select_by_regexp_spec.rb | 26 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 changelog/fix_incorrect_autocorrect_for_style_select_by_regexp.md diff --git a/changelog/fix_incorrect_autocorrect_for_style_select_by_regexp.md b/changelog/fix_incorrect_autocorrect_for_style_select_by_regexp.md new file mode 100644 index 00000000000..26764d3f800 --- /dev/null +++ b/changelog/fix_incorrect_autocorrect_for_style_select_by_regexp.md @@ -0,0 +1 @@ +* [#10216](https://github.com/rubocop/rubocop/issues/10216): Fix an incorrect autocorrect for `Style/SelectByRegexp` when using `lvar =~ blockvar` in a block. ([@koic][]) diff --git a/lib/rubocop/cop/style/select_by_regexp.rb b/lib/rubocop/cop/style/select_by_regexp.rb index 52887ce635a..b5d9c9c54eb 100644 --- a/lib/rubocop/cop/style/select_by_regexp.rb +++ b/lib/rubocop/cop/style/select_by_regexp.rb @@ -85,7 +85,7 @@ def on_send(node) 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) + regexp = find_regexp(regexp_method_send_node, block_node) register_offense(node, block_node, regexp) end @@ -119,10 +119,11 @@ def extract_send_node(block_node) regexp_method_send_node end - def find_regexp(node) + def find_regexp(node, block) return node.child_nodes.first if node.match_with_lvasgn_type? - if node.receiver.lvar_type? + if node.receiver.lvar_type? && + (block.numblock_type? || node.receiver.source == block.arguments.first.source) node.first_argument elsif node.first_argument.lvar_type? node.receiver diff --git a/spec/rubocop/cop/style/select_by_regexp_spec.rb b/spec/rubocop/cop/style/select_by_regexp_spec.rb index 4c942ef3a46..4bbbb77f976 100644 --- a/spec/rubocop/cop/style/select_by_regexp_spec.rb +++ b/spec/rubocop/cop/style/select_by_regexp_spec.rb @@ -38,6 +38,19 @@ RUBY end + it 'registers an offense and corrects for `blockvar =~ lvar`' do + expect_offense(<<~RUBY, method: method) + lvar = /regexp/ + array.#{method} { |x| x =~ lvar } + ^^^^^^^{method}^^^^^^^^^^^^^^^^^^ #{message} + RUBY + + expect_correction(<<~RUBY) + lvar = /regexp/ + array.#{correction}(lvar) + RUBY + end + it 'registers an offense and corrects for `regexp =~ blockvar`' do expect_offense(<<~RUBY, method: method) array.#{method} { |x| /regexp/ =~ x } @@ -49,6 +62,19 @@ RUBY end + it 'registers an offense and corrects for `lvar =~ blockvar`' do + expect_offense(<<~RUBY, method: method) + lvar = /regexp/ + array.#{method} { |x| lvar =~ x } + ^^^^^^^{method}^^^^^^^^^^^^^^^^^^ #{message} + RUBY + + expect_correction(<<~RUBY) + lvar = /regexp/ + array.#{correction}(lvar) + RUBY + end + it 'registers an offense and corrects when there is no explicit regexp' do expect_offense(<<~RUBY, method: method) array.#{method} { |x| x =~ y }