From bad82a0294e59e0ba5e39a1b4ae7fcec39773a91 Mon Sep 17 00:00:00 2001 From: Ryo Nakamura Date: Mon, 29 Aug 2022 17:46:49 +0900 Subject: [PATCH] Fix possible wrong autocorrection in namespace on `Style/PerlBackrefs` --- ...le_wrong_autocorrection_in_namespace_on.md | 1 + lib/rubocop/cop/style/perl_backrefs.rb | 23 ++++++++++++++++++- spec/rubocop/cop/style/perl_backrefs_spec.rb | 21 +++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 changelog/fix_possible_wrong_autocorrection_in_namespace_on.md diff --git a/changelog/fix_possible_wrong_autocorrection_in_namespace_on.md b/changelog/fix_possible_wrong_autocorrection_in_namespace_on.md new file mode 100644 index 00000000000..84d666a39dc --- /dev/null +++ b/changelog/fix_possible_wrong_autocorrection_in_namespace_on.md @@ -0,0 +1 @@ +* [#10975](https://github.com/rubocop/rubocop/pull/10975): Fix possible wrong autocorrection in namespace on `Style/PerlBackrefs`. ([@r7kamura][]) diff --git a/lib/rubocop/cop/style/perl_backrefs.rb b/lib/rubocop/cop/style/perl_backrefs.rb index f75314465e2..0db2181c862 100644 --- a/lib/rubocop/cop/style/perl_backrefs.rb +++ b/lib/rubocop/cop/style/perl_backrefs.rb @@ -83,10 +83,31 @@ def preferred_expression_to(node) end end + # @private + # @param [RuboCop::AST::Node] node + # @return [String, nil] + def preferred_expression_to_node_with_constant_prefix(node) + expression = preferred_expression_to(node) + return unless expression + + "#{constant_prefix(node)}#{expression}" + end + + # @private + # @param [RuboCop::AST::Node] node + # @return [String] + def constant_prefix(node) + if node.each_ancestor(:class, :module).any? + '::' + else + '' + end + end + # @private # @param [RuboCop::AST::Node] node def on_back_ref_or_gvar_or_nth_ref(node) - preferred_expression = preferred_expression_to(node) + preferred_expression = preferred_expression_to_node_with_constant_prefix(node) return unless preferred_expression add_offense( diff --git a/spec/rubocop/cop/style/perl_backrefs_spec.rb b/spec/rubocop/cop/style/perl_backrefs_spec.rb index c7fae8853f9..96fdbce2158 100644 --- a/spec/rubocop/cop/style/perl_backrefs_spec.rb +++ b/spec/rubocop/cop/style/perl_backrefs_spec.rb @@ -143,4 +143,25 @@ /#{Regexp.last_match(1)}/ RUBY end + + it 'autocorrects $1 to ::Regexp.last_match(1) in namespace' do + expect_offense(<<~RUBY) + module Foo + class Regexp + end + + puts $1 + ^^ Prefer `::Regexp.last_match(1)` over `$1`. + end + RUBY + + expect_correction(<<~RUBY) + module Foo + class Regexp + end + + puts ::Regexp.last_match(1) + end + RUBY + end end