Login
Make Subroutines::ProhibitManyArgs aware of '+' as a prototype
authorTom Wyant <harryfmudd@comcast.net>
Sun, 29 May 2011 17:46:11 +0000 (17:46 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Sun, 29 May 2011 17:46:11 +0000 (17:46 +0000)
character. This was introduced with Perl 5.14.

Changes
TODO.pod
lib/Perl/Critic/Policy/Subroutines/ProhibitManyArgs.pm
t/Subroutines/ProhibitManyArgs.run

diff --git a/Changes b/Changes
index f9dc2bf..4cb40c9 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,9 @@ Next release, whenever it is:
     Policy Changes:
     * BuiltinFunctions::ProhibitLvalueSubstr: Add explicit 'use version'.
       RT #68498.
+    * Subroutines::ProhibitManyArgs now recognizes '+' as a prototype
+      character.
+
 [1.116] Released on 2011-05-15
 
     Policy Changes:
index f3db2aa..234238f 100644 (file)
--- a/TODO.pod
+++ b/TODO.pod
@@ -153,9 +153,6 @@ their operands.
 be required (e.g. C<push $stack, 'foo'> where C<$stack> is an array
 ref). Not sure what policies are affected, but it appears this implies
 
-A new prototype character '+' which acts like C<(\[@%])> if the actual
-argument is a scalar (C<Subroutines::ProhibitManyArgs>). 5.13.7.
-
 Lexical regular expression modifier defaults via (e.g.)
 C<use re '/smx'>). This also interacts with
 C<use feature 'unicode_strings'>. 5.13.7.
index 3979d98..20381aa 100644 (file)
@@ -62,7 +62,7 @@ sub violates {
     if ($elem->prototype) {
         my $prototype = $elem->prototype();
         $prototype =~ s/ \\ [[] .*? []] /*/smxg;    # Allow for grouping
-        $num_args = $prototype =~ tr/$@%&*_/$@%&*_/;    # RT 56627
+        $num_args = $prototype =~ tr/$@%&*_+/$@%&*_+/;    # RT 56627
     } else {
        $num_args = _count_args($elem->block->schildren);
     }
index 4354187..1f3d001 100644 (file)
@@ -115,6 +115,24 @@ sub foo (\[$@%]@) { return 1 }
 sub bar ( \[$@%] $ \[$@%] ) { return 1 }
 
 #-----------------------------------------------------------------------------
+
+## name single term prototype (Perl 5.14)
+## failures 0
+## parms {max_arguments => 2}
+## cut
+
+sub foo ($+) { return 1 }
+
+#-----------------------------------------------------------------------------
+
+## name single term prototype (Perl 5.14)
+## failures 1
+## parms {max_arguments => 2}
+## cut
+
+sub foo ($$+) { return 1 }
+
+#-----------------------------------------------------------------------------
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4