Login
RT #79289: False Postive in Perl::Critic::Utils::is_in_void_context()
[gknop/Perl-Critic.git] / TODO.pod
CommitLineData
9b8f64cf
CD
1# best viewed via "perldoc TODO.pod"
2
501ee198
JRT
3=pod
4
c0a66e50 5=for stopwords API LHS RHS REFACTORINGS FH SVN stopwords
501ee198 6
dae851e8
JRT
7=head1 NAME
8
369abea9 9Perl::Critic::TODO - Things for Perl::Critic developers to do
dae851e8
JRT
10
11=head1 SOURCE
daad783f 12
a4555ce4
ES
13 $URL$
14 $Date$
15 $Author$
16 $Revision$
daad783f 17
2b7b1533 18
de8cacdb
CD
19=head1 SEE ALSO
20
21Perl-Critic-More is a separate distribution for less-widely-accepted
ab1cd5d7 22policies. It contains its own TODO.pod.
de8cacdb 23
2b7b1533 24
daad783f
AL
25=head1 NEW FEATURES
26
2b7b1533 27=over
daad783f 28
989d5ea8
ES
29=item * Report PBP and Safari sections in addition to PBP page numbers.
30
31Something like
32
33 Readonly::Scalar my $EXPL => {
34 pbp_pages => [ 57 ],
35 pbp_section => '5.2',
36 safari_section => something,
37 };
9bc546d7 38
48664f9a
JRT
39=item * Include PBP references and Safari sections in the documentation.
40
16cc6570
ES
41Perhaps these could be injected into the POD at build time, based on the data
42in the code. But that data is not entirely static, so I'm not sure how it
43would work for Policies that dynamically determine the PBP references.
48664f9a 44
16cc6570
ES
45Perhaps it would be good enough to just create a one-off tool that would
46inject the PBP and/or Safari references into the POD one time, and we could
47manually deal with Policies that behave oddly.
48
366d0024 49Much better would be to put the information in the POD in a structured manner
16cc6570
ES
50and parse it out in the code, something along the lines of
51
52 =head1 METADATA
53
54 =over
55
56 =item Default Themes
57
58 core bugs pbp
59
60 =item Default Severity
61
62 3
63
64 =item Perl Best Practices Page Numbers
65
66 193, 195
67
68 =back
69
70and so on.
48664f9a 71
2b7b1533 72
a4555ce4 73=item * Add a file Parameter::Behavior.
0fe898d5
ES
74
75
76=item * Allow values of (at least) string-list Parameters to be specified in a file.
77
78For the benefit of PodSpelling, etc.
79
80
81=item * Enhance string-list Behavior to allow specification of delimiters.
82
83For things like RequirePodSections.
84
85
afceaa1d
ES
86=item * Add queries to --list option to F<perlcritic>.
87
88List Policies based upon severity, theme, and (what I want this second)
89applies_to.
90
a9243c21
ES
91=item * Add formatting of --list output.
92
93Support Jeff Bisbee's use case (he dumps all the policies in severity order
94with full descriptions and other metadata).
95
ad5f2c12
ES
96=item * Support for C<#line 123 "filename"> directives.
97
98For code generators and template languages that allow inline Perl code.
99
96fa2db5
ES
100Yes, somebody has an in-house templating system where they've written a custom
101test module that extracts the perl code from a template and critiques it.
102
1d077d29
ES
103Actually, this would be useful for programs: Module::Build "fixes" shebang
104lines so that there's the bit about invoking perl if the program is attempted
105to be run by a Bourne shell, which throws the line numbers off when using
106Test::P::C on the contents of a C<blib> directory.
107
6e840ee4
ES
108This has been implemented in PPI, but hasn't been released yet. When it does
109come out, we need to change the line and file reported by Violations.
a6539177 110
2b7b1533 111
a889d362
ES
112=item * Enhance statistics.
113
114- Blank line count
115
116- POD line count
117
118- Comment line count
119
120- Data section count
121
391fe02c 122Proposed implementation committed 15-Mar-2007 by wyant, about revision 3240.
6d683b93 123
a889d362 124
afb00bb2
ES
125=item * Detect 5.10 source and enable stuff for that.
126
127For example, treat C<say> as equivalent to C<print>.
128
7e6e302d
TW
129=item * Detect 5.12 source and enable stuff for that.
130
131Yes, this is long-term, and is really a list of stuff from 5.011 to enable if
132it makes it into 5.12, gleaned from the perl511xdelta files:
133
134'use 5.011;' implies 'use strict;' and 'use feature qw{ :5.11 };' per
135perl5110delta.
136
137'sub foo { ... }' (yes, with the subroutine body being an elipsis a.k.a. the
138'yada yada' operator) compiles but fails at runtime per perl5110delta. PPI
139seems to parse this sanely as of 1.206.
140
141'package Foo 1.23;' is equivalent to 'package Foo; our $VERSION = 1.23;' per
142perl5111delta. PPI seems to parse this sanely as of 1.206.
143
144Nothing additional found in perl5112delta, which is the most recent as of the
145addition of this item.
afb00bb2 146
adb621bc
TW
147=item * Detect 5.14 source and enable stuff for that.
148
adb621bc
TW
1495.13.7 allows references in many places where arrays or hashes used to
150be required (e.g. C<push $stack, 'foo'> where C<$stack> is an array
34db602d 151ref). Not sure what policies are affected.
adb621bc 152
adb621bc
TW
153Lexical regular expression modifier defaults via (e.g.)
154C<use re '/smx'>). This also interacts with
155C<use feature 'unicode_strings'>. 5.13.7.
156
1d077d29
ES
157=item * Support a means of failing if a Policy isn't installed.
158
159For example, the self compliance test now depends upon a Policy in the More
160distribution.
161
162Something like using a "+" sign in front of the Policy name in its
163configuration block, analogous to the "-" sign used for disabling a policy,
164e.g. "C<[+Example::Policy]>".
165
166
d02f63af
ES
167=item * Threading
168
c0a66e50 169Pretty obviously, Perl::Critic is readily parallelizable, just do a document per
366d0024 170thread. ("readily" being conceptual, not necessarily practical) Although
caf43c6b
ES
171there's now C<Policy::prepare_to_scan_document()>, given perl's thread data
172sharing model, this shouldn't be an issue.
d02f63af
ES
173
174
a6539177
ES
175=item * Add support in .run files for regexes for violation descriptions.
176
a4555ce4
ES
177=item * Add support for "## use critic (blah)".
178
179If I've got:
180
181 ## no critic (SomePolicy)
182
183 ...
184
185 ## no critic (ADifferentPolicy)
186
187 ...
188
189 ## no critic (YetAnotherPolicy)
190
191If I want to turn C<YetAnotherPolicy> back on but neither C<SomePolicy> nor
192C<ADifferentPolicy>, I've got to do this:
193
194 ## use critic
195 ## no critic (SomePolicy, ADifferentPolicy)
196
197Why can't I do this:
198
199 ## use critic (SomeOtherPolicy)
200
201
202=item * Make color work on Windows.
203
204Use L<Win32::Console::ANSI> like L<App::Ack>.
205
206
a7176318 207=item * Create P::C::Node and make P::C::Document a subclass and make use of PPIx::Utilities::Node::split_ppi_node_by_namespace() to provide per-namespace caching of lookups that are now on P::C::Document.
c429610c
ES
208
209This is necessary to get P::C::Moose Policies correct.
210
c429610c 211
c07b11ba 212=item * Use L<version|version> to declare C<$VERSION> numbers throughout P::C
48664f9a 213
c07b11ba
TW
214PBP recommends using the L<version|version> module. I chose not to follow that
215recommendation because L<version|version> didn't work with the Perl v5.6.1 that I had
48664f9a 216at $work at that time (and I really wanted to use Perl::Critic at work).
c07b11ba 217But now the L<version|version> has been updated and those bugs may have been fixed,
48664f9a 218or perhaps we just don't care about running on Perl v5.6.1 any more. So
c07b11ba 219maybe now we can go ahead and use L<version|version>.
48664f9a 220
d1d6429f
AL
221=back
222
2b7b1533 223
daad783f
AL
224=head1 BUGS/LIMITATIONS
225
5931cd9b
ES
226Document bugs for individual Policies in the Policies themselves. Users
227should be aware of limitations. (And, hey, we might get patches that way.)
365e3d9d 228
2b7b1533 229
daad783f
AL
230=head1 OTHER PBP POLICIES THAT SEEM FEASIBLE TO IMPLEMENT
231
5331273a
ES
232=over
233
234=item * Modules::RequireUseVersion [405-406]
235
236=item * Modules::RequireThreePartVersion [405-406]
237
6e840ee4
ES
238
239=item * NamingConventions::RequireArrayAndHashReferenceVariablesEndWith_Ref [41-42]
240
241Check for C<$variable = [...]>, C<$variable = {...}>, C<< $variable->[...] >>, and
242C<< $variable->{...} >>.
243
244
2abf2e40
ES
245=item * Objects::ProhibitRestrictedHashes [322-323]
246
247Look for use of the bad methods in Hash::Util.
248
249
250=item * Objects::ProhibitLValueAccessors [346-349]
251
252Look for the C<:lvalue> subroutine attribute.
253
254
5331273a 255=back
daad783f 256
2b7b1533 257
daad783f
AL
258=head1 NON-PBP POLICIES WANTED
259
2b7b1533 260=over
daad783f 261
0e8d71b1
JRT
262=item * Subroutines::RequireArgumentValidation
263
264Enforce the use of Params::Validate or Params::Util or some other
265argument validation mechanism. This could be one Policy that
266can be configured for different validation mechanisms, or we could
267have a separate Policy for each mechanism, and let the user choose
268which one they want to use (I think I prefer the later).
269
270
0d71785c
JRT
271=item * NamingConventions::ProhibitMisspelledSymbolNames
272
273The idea behind this policy is to encourage better names for variables
274and subroutines by enforcing correct spelling and prohibiting the use of
366d0024 275home-grown abbreviations. Assuming that the author uses underscores or
0d71785c
JRT
276camel-case, it should be possible to split symbols into words, and then look
277them up in a dictionary (see PodSpelling). This policy should probably have
278a similar stopwords feature as well.
279
22178e81 280
45136ef4
ES
281=item * Documentation::RequireModuleAbstract
282
283Require a C<=head1 NAME> POD section with content that matches
284C<\A \s* [\w:]+ \s+ - \s+ \S>. The single hyphen is the important bit. Also,
285must be a single line.
286
22178e81 287
be48b0c6
ES
288=item * Expressions::RequireFatCommasInHashConstructors
289
22178e81 290=item * ErrorHandling::RequireLocalizingGlobalErrorVariablesInDESTROY
f3bcb2ca 291
22178e81
ES
292Prevent C<$.>, C<$@>, C<$!>, C<$^E>, and C<$?> from being cleared unexpectedly
293by DESTROY methods.
f3bcb2ca
ES
294
295 package Foo;
296
297 sub DESTROY {
298 die "Died in Foo::DESTROY()";
299 }
300
301 package main;
302
303 eval {
304 my $foo = Foo->new();
305
306 die "Died in eval."
307 }
308 print $@; # "Died in Foo::DESTROY()", not "Died in eval.".
309
22178e81
ES
310See L<http://use.perl.org/~Ovid/journal/36767> and
311L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2008-06/msg00542.html>.
5931cd9b 312
effbbbb3 313
77fa21bd
ES
314=item * Expressions::ProhibitDecimalWithBitwiseOperator
315
316=item * Expressions::ProhibitStringsWithBitwiseOperator
317
2b7b1533 318
3264a614
ES
319=item * InputOutput::ProhibitMagicDiamond
320
11f53956 321Steal the idea from L<B::Lint|B::Lint>.
3264a614
ES
322
323
6e840ee4
ES
324=item * NamingConventions::RequireArrayAndHashReferenceVariablesEndWith_Ref
325
326
327=item * Programs::RequireShebang
d92d2828 328
11f53956
ES
329Anything that is a program should have a shebang line. This includes .t
330files.
d92d2828 331
2b7b1533 332
8fb5bd64 333=item * Modules::RequirePackageDeclarationAsFirstStatementInModule
f3c2ceb9
ES
334
335See L<http://blog.woobling.org/2009/11/scoping-of-current-package.html>.
336Ouch.
337
338
daad783f
AL
339=item * BuiltInFunctions::RequireConstantSprintfFormat
340
2b7b1533 341
daad783f
AL
342=item * BuiltInFunctions::RequireConstantUnpackFormat
343
1cc04072 344L<http://diotalevi.isa-geek.net/~josh/yapc-lint/slides/slide5.html>
daad783f 345
2b7b1533 346
dfe2eb3f
JRT
347=item * Miscellanea::ProhibitObnoxiousComments
348
349Forbid excessive hash marks e.g. "#### This is a loud comment ####".
350Make the obnoxious pattern configurable
351
2b7b1533 352
dfe2eb3f
JRT
353=item * ValuesAndExpressions::RequireNotOperator
354
355Require the use of "not" instead of "!", except when this would contradict
356ProhibitMixedBooleanOperators. This may be better suited for
357Perl::Critic::More.
358
2b7b1533 359
6e840ee4
ES
360=item * ValuesAndExpressions::ProhibitUnusedReadonlyConstants
361
362We'll only be able to look at lexicals. For similar reasons, we can't do
363anything about L<constant>.
364
365
dfe2eb3f
JRT
366=item * Modules::RequireExplicitImporting
367
368Require every C<use> statement to have an explicit import list. You could
369still get around this by calling C<import> directly.
370
2b7b1533 371
dfe2eb3f
JRT
372=item * Modules::ForbidImporting
373
374Require every C<use> to have an explicitly empty import list. This is for
375folks who like to see fully-qualified function names. Should probably provide
376a list of exempt modules (like FindBin);
377
2b7b1533 378
daad783f
AL
379=item * ControlStructures::ProhibitIncludeViaDo
380
381Forbid C<do "foo.pl">. Not sure about this policy name.
382
2b7b1533 383
daad783f
AL
384=item * Variables::ProhibitUseVars
385
f707b14a 386Disallow C<use vars qw(...)> and require C<our $foo> instead. This
11f53956
ES
387contradicts Miscellanea::Prohibit5006isms. Maybe verify C<use 5.6> before
388applying this policy. Low severity.
daad783f 389
2b7b1533 390
daad783f
AL
391=item * VariablesAndExpressions::ProhibitQuotedHashKeys
392
11f53956
ES
393Forbid quotes around hash keys, unless they are really needed. This is
394against what Damian says. Suggested by Adam Kennedy. Low severity.
daad783f 395
2b7b1533 396
b589a229 397=item * CodeLayout::ProhibitFunctionalNew
daad783f
AL
398
399Good: C<< Foo::Bar->new >>, Bad: C<< new Foo::Bar >>
400
2b7b1533 401
7eec5b31
ES
402=item * RegularExpressions::ProhibitSWSWSW
403
404Require C<split> instead of C<m/\s*\w*\s*\w*\s*/>. From MJD's Red Flags.
405
406
79b72614
CD
407=item * Documentation::RequireSynopsis
408
2b7b1533 409
79b72614
CD
410=item * Documentation::RequireLicense
411
412These are simplified versions of Documentation::RequirePodSections.
413
2b7b1533 414
6a4d1045
CD
415=item * Documentation::RequireValidSynopsis
416
417The Synopsis section must be all indented and must be syntactically valid Perl
418(as validated by PPI).
419
2b7b1533 420
90c0067c
CD
421=item * Documentation::ProhibitEmptySections
422
423Any C<=headN> and C<=over> sections must not be empty. This helps catch
366d0024 424boilerplate (although Test::Pod should catch empty C<=over> blocks).
90c0067c
CD
425
426On the other hand, C<=item ...> sections can be empty, since the item label is
427content.
428
2b7b1533 429
79b72614
CD
430=item * Miscellaneous::ProhibitBoilerplate
431
11f53956 432Complain about copy-and-paste code or docs from h2xs, Module::Starter::*, etc.
c6e7b236 433
ef919624
CD
434Here's a non-PPI implementation:
435L<http://search.cpan.org/src/JJORE/Carp-Clan-5.8/t/04boilerplate.t>
436
2b7b1533 437
a169bb61
ES
438=item * NamingConventions::ProhibitPackagesSubroutinesAndBarewordFileHandlesWithTheSameNames
439
440See
441L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2009-01/msg00685.html>.
442
443
956825ec
CD
444=item * BuiltinFunctions::ProhibitExtraneousScalarCall
445
446Recommend that C<if (scalar @array)> be rewritten as C<if (@array)>.
447
2b7b1533 448
6a4d1045
CD
449=item * RegularExpressions::ProhibitMixedDelimiters
450
451Ban s{foo}(bar)
452
2b7b1533 453
c79c8b5b
CD
454=item * RegularExpressions::ProhibitScalarAsRegexp
455
366d0024 456Ban naked strings as regexps, like:
c79c8b5b
CD
457
458 print 1 if $str =~ $regexp;
459
460Instead, it should be:
461
462 print 1 if $str =~ m/$regexp/;
463
464or
465
466 print 1 if $str =~ m/$regexp/xms;
467
468
6a4d1045
CD
469=item * ValuesAndExpressions::RequireInterpolatedStringyEval
470
471Ensure that the argument to a stringy eval is not a constant string. That's
472just wasteful. Real world examples include:
473
474 eval 'use Optional::Module';
475
476which is better written as
477
478 eval { require Optional::Module; Optional::Module->import };
479
480for performance gains and compile-time syntax checking.
481
804214f4
TW
482Question: This is very similar to BuiltInFunctions::ProhibitStringyEval. What
483does the new policy buy us? Could we get the same thing with an option on the
484latter to forbid un-interpolated includes even if C<allow_includes> is turned
485on?
486
2b7b1533 487
76a987f3
CD
488=item * RegularExpressions::ProhibitUnnecessaryEscapes
489
11f53956
ES
490Complain if user puts a backslash escape in front of non-special characters.
491For example:
76a987f3
CD
492
493 m/\!/;
494
495Make exceptions for C<\">, C<\'> and C<\`> since those are often inserted to
496workaround bugs in syntax highlighting.
497
498Note that this is different inside character classes, where only C<^>, C<]>
499and C<-> need to be escaped, I think. Caret only needs to be escaped at the
500beginning, and dash does NOT need to be escaped at the beginning and end. See
11f53956 501L<perlreref|perlreref>.
76a987f3 502
2b7b1533 503
11f53956 504=item * Steal ideas from L<Dunce::Files|Dunce::Files>.
fef95802 505
18658b1a
CD
506Can someone expand this entry, please?
507
508=item * ControlStructures::ProhibitAssigmentInConditional
509
510=item * ValuesAndExpressions::RequireConstantBeforeEquals
511
512=item * ValuesAndExpressions::RequireConstantBeforeOperator
513
514L<http://use.perl.org/~stu42j/journal/36412>
515
516Just about everyone has been bitten by C<if ($x = 10) { ... }> when they meant
517to use C<==>. A safer style is C<10 == $x> because omitting the second C<=>
518yields a noisy compile-time failure instead of silent runtime error.
519
520ProhibitAssigmentInConditional complains if the condition of a while, until,
521if or unless is solely an assignment. If it's anything more complex (like
522C<if (($x=10)){}> or C<while ($x=$y=$z){}>), there is no warning.
523
524RequireConstantBeforeEquals complains if the left side of an C<==> is a
525variable while the right side is a constant.
526
527RequireConstantBeforeOperator complains if the left side of any comparison
528operator (C<==>, C<eq>, C<&lt;>, etc) is a variable while the right side is a
529constant.
fef95802 530
3f64b6c8
ES
531
532=item * InputOutput::ProhibitUTF8IOLayer
533
534http://www.perlfoundation.org/perl5/index.cgi?the_utf8_perlio_layer
535
a4555ce4 536
b61a141c 537=item * BuiltinFunctions::ProhibitExit(?:InModules)?
f0a7988d
CD
538
539Forbid C<exit()> in files that lack a shebang. Inspired by
366d0024 540L<http://use.perl.org/~Ovid/journal/36746> and an analogous checker in
f0a7988d 541FindBugs.
3f64b6c8 542
a4555ce4 543
c7830a4f
JRT
544=item * Modules::ProhibitRedundantLoading
545
546Don't allow a package to "use" the same module more than once, unless
547there is a "no <module>" between them.
548
549See https://rt.cpan.org/Ticket/Display.html?id=38074.
550
a4555ce4
ES
551
552=item * ErrorHandling::RequireLocalizingEVAL_ERRORInDESTROY
553
554The opposite side of ErrorHandling::RequireCheckingReturnValueOfEval.
555
556
daad783f
AL
557=back
558
2b7b1533 559
daad783f
AL
560=head1 REFACTORINGS and ENHANCEMENTS
561
2b7b1533 562=over
daad783f 563
509c897d
ES
564=item * Reformat all the POD to use 78 columns instead of 70.
565
566This thing of having different widths for the documentation and the code is
567rediculous. Don't do this until after the next non-dev release. Elliot is
568considering doing a special release only including this change so that the
569search.cpan.org diff tool doesn't entirely break.
570
571
2ef39273 572=item * Eliminate use of IO::String
26926887 573
2ef39273
ES
574I'm pretty sure that opening references to scalars is in 5.6, so IO::String
575isn't necessary.
26926887 576
26926887 577
2ef39273
ES
578=item * Give L<Perl::Critic::Command> a proper API.
579
580Now that we've got the guts of L<perlcritic> in there, we should make the
581it available to users.
582
26926887 583
628facda
ES
584=item * Create constants for the PPI location array elements.
585
366d0024 586=item * Some means of detecting "runaway" C<##no critic>
aae75e29
ES
587
588Elliot was talking to a couple of users at ETech and one of their major
589concerns was that they were using C<##no critic> and forgetting to do a
590C<##use critic> after the problematic section. Perhaps an option to
591F<perlcritic> to scan for such things is in order.
592
2b7b1533 593
dfe2eb3f
JRT
594=item * Change API to use named parameters
595
596Most of the methods on the public classes use named parameters for passing
597arguments. I'd like to extend that pattern to include all object-methods.
598Static methods can still use positional parameters.
599
2b7b1533 600
dfe2eb3f 601=item * Enhance P::C::critique() to accept files, directories, or code strings
501ee198 602
9b8f64cf 603Just like F<bin/perlcritic> does now.
daad783f 604
2b7b1533 605
9b8f64cf
CD
606=item * Add C<-cache> flag to F<bin/perlcritic>
607
11f53956 608If enabled, this turns on L<PPI::Cache|PPI::Cache>:
9b8f64cf
CD
609
610 require PPI::Cache;
611 my $cache_path = "/tmp/test-perl-critic-cache-$ENV{USER}";
612 mkdir $cache_path, oct 700 if (! -d $cache_path);
613 PPI::Cache->import(path => $cache_path);
614
c0a66e50
JRT
615This cache directory should perhaps include the PPI version number! At least
616until PPI incorporates its own version number in the cache.
9b8f64cf 617
de8cacdb 618(see F<t/40_criticize.t> for a more robust implementation)
79b72614 619
2b7b1533 620
c5bd966c
JRT
621=item * Use hash-lookup instead of C<List::MoreUtils::any> function.
622
11f53956
ES
623In several places, Perl::Critic uses C<List::MoreUtils::any> to see if a
624string is a member of a list. Instead, I suggest using a named subroutine
625that does a hash-lookup like this:
c5bd966c
JRT
626
627 my %logical_ops = hashify( qw( ! || && ||= &&= and or not ) );
628 sub is_logical_op { return exists $logical_ops{ $_[0] }; }
629
c7830a4f 630Question: Why?
2b7b1533 631
c7830a4f 632Answer: Readability, mostly. Performance, maybe.
2b7b1533
ES
633
634
9b8f64cf
CD
635=back
636
637=head1 PPI BUGS
638
639We're waiting on the following bugs to get fixed in a CPAN release of PPI:
640
2b7b1533
ES
641
642=over
9b8f64cf 643
dd813c73
ES
644=item PPI::Token::descendant_of()
645
646Exists in svn. Replace _descendant_of() in RequireCheckingReturnValueOfEval
647with that, once it is released, because it's faster and native.
648
2ef39273 649
c38138ab 650=item Newlines
b589a229
CD
651
652PPI does not preserve newlines. That makes
c38138ab
CD
653CodeLayout::RequireConsistentNewlines impossible to implement under PPI. For
654now, it's implemented by pulling the source out of the file and skipping PPI.
655
366d0024 656It's unlikely that PPI will support mixed newlines anytime soon.
c38138ab 657
2b7b1533 658
ef919624
CD
659=item Operators
660
11f53956
ES
661ValuesAndExpressions::ProhibitMismatchedOperators has two workarounds for PPI
662bugs with parsing operators. Many of these bugs have been fixed in PPI, so it
663would be good to check if those workarounds are still needed.
ef919624 664
2b7b1533 665
6a4d1045
CD
666=item Regexp methods
667
668Not strictly a bug -- the PPI Regexp classes have a dearth of accessor methods
669as of v1.118, meaning that we have to do messy digging into internals. I
670wrote Perl::Critic:Utils::PPIRegexp to encapsulate this messiness, but it
671would be nicer to have an official interface in PPI.
672
2b7b1533 673
b5366318
ES
674=item QuoteLike::Words in the place of a ForLoop
675
c0a66e50 676PPI incorrectly parses C<<for qw<blah> {}>>.
b5366318
ES
677
678
daad783f 679=back
501ee198 680
85e38a07 681=cut
dfe2eb3f
JRT
682
683##############################################################################
684# Local Variables:
685# mode: cperl
686# cperl-indent-level: 4
687# fill-column: 78
688# indent-tabs-mode: nil
689# c-indentation-style: bsd
690# End:
96fed375 691# ex: set ts=8 sts=4 sw=4 tw=78 ft=pod expandtab shiftround :