Login
RT #65663 RequireConsistentNewlines five-part PPI location
authorTom Wyant <harryfmudd@comcast.net>
Sun, 13 Feb 2011 00:10:17 +0000 (00:10 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Sun, 13 Feb 2011 00:10:17 +0000 (00:10 +0000)
This policy is a problem because it needs to bypass PPI to get at the
actual line endings. But since Perl::Critic needs a PPI::Element to
report a violation, it makes one up out of whole cloth, then reaches
into its innards to slam-dunk the information it wants to put in the
violation message.

Unfortunately, when it was coded it only slam-dunked three pieces of
information, not five. This may not have mattered before #file and #line
support, but it does now even if you are not using %f in the output
format as noted in the ticket -- at least, if you object to lots of
undefined value messages it matters.

The work in branches/violation_named_args/ was done to try to make it
possible to specify a violation position relative to the start of the
element, but until that makes it into the trunk I see no way to address
this other than to compound the felony.

This probably should be released fairly shortly. The symptoms are not
fatal, but are extremely annoying.

Changes
lib/Perl/Critic/Policy/CodeLayout/RequireConsistentNewlines.pm

diff --git a/Changes b/Changes
index a560b09..42b0a4a 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,9 @@
+Whatever is next
+
+    Bug fixes:
+    * CodeLayout::RequireConsistentNewlines produces multiple undefined
+      value errors when a violation is found. RT #65663
+
 [1.112_002] Released on 2011-02-09
 
     Minor code cleanups.
index 091682b..0ee5172 100644 (file)
@@ -57,7 +57,10 @@ sub violates {
         $newline ||= $nl;
         if ( $nl ne $newline ) {
             my $token = PPI::Token::Whitespace->new( $nl );
-            $token->{_location} = [$line, $col, $col];
+            # TODO this is a terrible violation of encapsulation, but absent a
+            # mechanism to override the line numbers in the violation, I do
+            # not know what to do about it.
+            $token->{_location} = [$line, $col, $col, $line, $filename];
             push @v, $self->violation( $DESC, $EXPL, $token );
         }
         $line++;