Login
RT #59112: ProhibitLvalueSubstr vs highest_explicit_perl_version
authorTom Wyant <harryfmudd@comcast.net>
Wed, 27 Apr 2011 14:59:08 +0000 (14:59 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Wed, 27 Apr 2011 14:59:08 +0000 (14:59 +0000)
The implementation adds a prepare_to_scan_document() which returns false
if the Perl version was specified as less than 5.005. The ticket talks
about an option to control whether documents are skipped based on Perl
version, but the two other policies (prior to today's work) which are
sensitive to Perl version do this.

Test provided and Changes updated.

Changes
lib/Perl/Critic/Policy/BuiltinFunctions/ProhibitLvalueSubstr.pm
t/BuiltinFunctions/ProhibitLvalueSubstr.run

diff --git a/Changes b/Changes
index 390193e..f735732 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,9 +1,12 @@
 Whenever the next release is
 
     Policy Changes:
+    * BuiltInFunctions::ProhibitLvalueSubstr does not report violations
+      if the document contains an explicit 'use n.nnn;' where the
+      version is before 5.005.  RT #59112
     * Variables::RequireLexicalLoopIterators does not report violations
       if the document contains an explicit 'use n.nnn;' where the
-      version is before 5.004.  RT # 67760
+      version is before 5.004.  RT #67760
     * RegularExpressions::ProhibitUnusedCapture should more reliably
       find things like s/(a)/${1}2/.  RT #67273.
     * Documentation::RequirePodSections no longer blows up on code
index df5dc48..0d8042b 100644 (file)
@@ -23,6 +23,7 @@ Readonly::Scalar my $DESC => q{Lvalue form of "substr" used};
 Readonly::Scalar my $EXPL => [ 165 ];
 
 Readonly::Scalar my $ASSIGNMENT_PRECEDENCE => precedence_of( q{=} );
+Readonly::Scalar my $MINIMUM_PERL_VERSION => version->new( 5.005 );
 
 #-----------------------------------------------------------------------------
 
@@ -33,6 +34,16 @@ sub applies_to           { return 'PPI::Token::Word'         }
 
 #-----------------------------------------------------------------------------
 
+sub prepare_to_scan_document {
+    my ( $self, $document ) = @_;
+    # perl5005delta says that is when the fourth argument to substr()
+    # was introduced, so ... (RT #59112)
+    my $version = $document->highest_explicit_perl_version();
+    return ! $version || $version >= $MINIMUM_PERL_VERSION;
+}
+
+#-----------------------------------------------------------------------------
+
 sub violates {
     my ($self, $elem, undef) = @_;
 
@@ -59,6 +70,8 @@ __END__
 
 =pod
 
+=for stopwords perlfunc substr
+
 =head1 NAME
 
 Perl::Critic::Policy::BuiltinFunctions::ProhibitLvalueSubstr - Use 4-argument C<substr> instead of writing C<substr($foo, 2, 6) = $bar>.
@@ -79,12 +92,22 @@ instead.
     substr($something, 1, 2) = $newvalue;     # not ok
     substr($something, 1, 2, $newvalue);      # ok
 
+The four-argument form of C<substr()> was introduced in Perl 5.005.
+This policy does not report violations on code which explicitly
+specifies an earlier version of Perl (e.g. C<use 5.004;>).
 
 =head1 CONFIGURATION
 
 This Policy is not configurable except for the standard options.
 
 
+=head1 SEE ALSO
+
+L<"substr" in perlfunc|perlfunc/substr> (or C<perldoc -f substr>).
+
+L<"4th argument to substr" in perl5005delta|perl5005delta/4th argument to substr>
+
+
 =head1 AUTHOR
 
 Graham TerMarsch <graham@howlingfrog.com>
index 2f4c0f7..e5d7df2 100644 (file)
@@ -46,6 +46,16 @@ $foo{substr};
 
 #-----------------------------------------------------------------------------
 
+## name allow under really old Perl. RT #59112
+## failures 0
+## cut
+
+use 5.004;
+
+substr( $foo, 0, 0 ) = 'bar';
+
+#-----------------------------------------------------------------------------
+
 ##############################################################################
 #      $URL$
 #     $Date$