Login
RT #72086 - ProhibitUnusedCapture false positive with /e and parens
authorTom Wyant <harryfmudd@comcast.net>
Tue, 1 Nov 2011 15:48:42 +0000 (15:48 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Tue, 1 Nov 2011 15:48:42 +0000 (15:48 +0000)
The problem was that the policy was simply looking at the top level of
the replacement expression. Fortunately this was just a matter of
calling the right subroutine. This should cover (?{}) and (??{}) as
well, though I was not ambitious enough to add them to the tests.

Changes
lib/Perl/Critic/Policy/RegularExpressions/ProhibitUnusedCapture.pm
t/RegularExpressions/ProhibitUnusedCapture.run

diff --git a/Changes b/Changes
index 9bd3925..5c01957 100644 (file)
--- a/Changes
+++ b/Changes
@@ -12,6 +12,9 @@ Next release, whenever it is:
     * RegularExpressions::ProhibitUnusedCaptures now skips the first
       block of an 'if' or 'elsif' if the regular expression is bound to
       its operand with the '!~' operator. RT #69867.
+    * RegularExpressions::ProhibitUnusedCaptures now looks into lists
+      and blocks in the replacement portion of the regular expression if
+      /e is asserted. RT #72086.
     * Subroutines::ProhibitManyArgs now recognizes '+' as a prototype
       character.
     Other Changes:
index 03f96c9..0532dcb 100644 (file)
@@ -116,10 +116,12 @@ sub _enough_uses_in_regexp {
     foreach my $token ( @{ $re->find(
         'PPIx::Regexp::Token::Code' ) || [] } ) {
         my $ppi = $token->ppi() or next;
-        my $start = $ppi->schild( 0 ) or next;
-        $start = $start->schild( 0 ) or next;
-        _mark_magic( $start, $re, $captures, $named_captures, $doc );
-        _enough_magic( $start, $re, $captures, $named_captures, $doc );
+        _check_node_children( $ppi, {
+                regexp              => $re,
+                numbered_captures   => $captures,
+                named_captures      => $named_captures,
+                document            => $doc,
+            }, _make_regexp_checker() );
     }
 
     return ( none {not defined $_} @{$captures} )
index 6a31053..557958a 100644 (file)
@@ -561,6 +561,15 @@ if ( $ip !~ /^(.*?)::(.*)\z/sx ) {
 
 #-----------------------------------------------------------------------------
 
+## name RT #72086 - False positive with /e and parens
+## failures 0
+## cut
+
+s/(.)/($1)/e;
+s/(.)/ { $1 } /e;
+
+#-----------------------------------------------------------------------------
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4