Login
RT #74647: False positive in TestingAndDebugging::ProhibitNoWarnings
authorTom Wyant <harryfmudd@comcast.net>
Fri, 3 Feb 2012 20:11:27 +0000 (20:11 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Fri, 3 Feb 2012 20:11:27 +0000 (20:11 +0000)
commit84b4cc18d4c081ab3b73603909f34918127c1fbc
tree5e9d722ce2b6bf59c7cbc88fdb290b84f17032c7
parent88a869494ec18b4d49836acd17aab0cf514de0d5
RT #74647: False positive in TestingAndDebugging::ProhibitNoWarnings
(bad parsing)

The problem here was that the original code just stringified the
'no' statement, used a regular expression to extract all lowercase
strings, and then grep'ed out 'no', 'warnings', and 'qw'. Unfortunately,
'qw' is an actual warning category (believe it or not!), so the original
code saw

 no warnings 'qw';

as an unqualified 'no warnings'.

The patch recurses into the statement being analyzed, and finds all:
* PPI::Token::Word (because of 'foo => "bar"'),
* PPI::Token::Quote (because of "'foo'"), and
* PPI::Token::QuoteLike::Words (obviously).
The first two words (which are 'no' and 'warnings') are discarded, and
the rest are subjected to analysis. Note that, though the original code
rejects everything that is not entirely lower case alphabetic, the patch
accepts everything. My reason is that the difference was a "don't care",
becaue unknown warning categories don't compile, and thus are not
Perl::Critic's problem.
Changes
lib/Perl/Critic/Policy/TestingAndDebugging/ProhibitNoWarnings.pm
t/TestingAndDebugging/ProhibitNoWarnings.run