Login
The Perl::Critic::Document method
authorTom Wyant <harryfmudd@comcast.net>
Tue, 7 Aug 2012 22:36:00 +0000 (22:36 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Tue, 7 Aug 2012 22:36:00 +0000 (22:36 +0000)
element_is_in_lexical_scope_after_statement_containing() goes into an
infinite loop if the parent of the second element does not define a
scope.

The only core policies that use this (so far!) are RegularExpressions
policies that are trying to determine if there are any default
modifiers, so this has not bitten us yet.

I discovered this when trying to revive the
Variables::ProhibitUnusedVariables work that has been languishing in
http://perlcritic.tigris.org/svn/perlcritic/branches/rt64929. The
original work used a Perl::Critic::Scope object to represent the scope,
but this turned out to be overkill, so it was not used in the regexp
default modifier work. The discovery was made because,
while
    ( use re '/smx'; )
is invalid Perl,
    open ( my $handle, $mode, $name );
is perfectly valid -- and more to the point it appears in
ProhibitUnusedVariables.run in the branch.

I have NOT put this into the Changes file, because I could not figure
out what to write.

lib/Perl/Critic/Document.pm

index 443df04..0a607be 100644 (file)
@@ -318,7 +318,7 @@ sub element_is_in_lexical_scope_after_statement_containing {
 
     my $parent = $stmt;
     while ( ! $parent->scope() ) {
-        $parent = $stmt->parent()
+        $parent = $parent->parent()
             or return;
     }