Login
RT #70901: Policies missing operators
authorTom Wyant <harryfmudd@comcast.net>
Sun, 27 Nov 2011 00:35:48 +0000 (00:35 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Sun, 27 Nov 2011 00:35:48 +0000 (00:35 +0000)
The issue was missing augmented assignment operators. Patches were
included (and accepted). The only policy patched was
ControlStructures::ProhibitMutatingListFunctions, but '//=' was also
missing from Perl::Critic::Utils::precedence_of().

I'm not sure how serious this was, since PPI parses most of these as two
operators (that is, '+=' gets parsed as '+', '='). But '//=' appears to
be an exception, and is therefore missed both in the policy and anything
that uses precedence_of().

Changes
lib/Perl/Critic/Policy/ControlStructures/ProhibitMutatingListFunctions.pm
lib/Perl/Critic/Utils.pm
t/ControlStructures/ProhibitMutatingListFunctions.run

diff --git a/Changes b/Changes
index db553e4..b222164 100644 (file)
--- a/Changes
+++ b/Changes
@@ -7,6 +7,8 @@ Next release, whenever it is:
       RT #71093.
     * ControlStructures::ProhibitMutatingListFunctions now understands that
       tr///r (introduced in 5.13.7) does not change its operand.
+    * ControlStructures::ProhibitMutatingListFunctions now understands that
+      '//=', '<<=', and '>>=' are assignment operators. RT #70901.
     * ErrorHandling::RequireCheckingReturnValueOfEval now allows things
       like grep { eval $_ }. RT #69489.
     * RegularExpressions::ProhibitEnumeratedClasses no longer thinks
index 4ea536d..8553f26 100644 (file)
@@ -239,7 +239,9 @@ sub _is_topic_mutating_substr {
 {
     ##no critic(ArgUnpacking)
 
-    my %assignment_ops = hashify qw( = *= /= += -= %= **= x= .= &= |= ^=  &&= ||= ++ -- );
+    my %assignment_ops = hashify qw(
+        = *= /= += -= %= **= x= .= &= |= ^=  &&= ||= <<= >>= //= ++ --
+    );
     sub _is_assignment_operator { return exists $assignment_ops{$_[0]} }
 
     my %increment_ops = hashify qw( ++ -- );
index 3c6c185..93f1132 100644 (file)
@@ -307,6 +307,7 @@ Readonly::Hash my %PRECEDENCE_OF => (
     '^='   => 19,
     '<<='  => 19,
     '>>='  => 19,
+    '//='  => 19,
     ','    => 20,
     '=>'   => 20,
     'not'  => 22,
index db3ff9a..aab95b3 100644 (file)
@@ -1,10 +1,13 @@
 ## name Assignment and op-assignment
-## failures 3
+## failures 4
 ## cut
 
+# TODO: PPI as of 1.215 doesn't parse all of the augmented assignment
+# operators, so we can't do exhaustive testing. 
 @bar = map {$_ = 1} @foo;
 @bar = map {$_ *= 2} @foo;
 @bar = map {$_++} @foo;
+@bar = map {$_--} @foo;
 
 #-----------------------------------------------------------------------------