File Coverage

blib/lib/Perl/Critic/Document.pm
Criterion Covered Total %
statement 262 299 87.6
branch 86 130 66.1
condition 39 57 68.4
subroutine 50 53 94.3
pod 21 21 100.0
total 458 560 81.7


line stmt bran cond sub pod time code
1             package Perl::Critic::Document;
2              
3 40     40   4507 use 5.010001;
  40         240  
4 40     40   307 use strict;
  40         97  
  40         910  
5 40     40   249 use warnings;
  40         135  
  40         1358  
6              
7 40     40   282 use Carp qw< confess >;
  40         176  
  40         2398  
8              
9 40     40   309 use List::Util qw< reduce >;
  40         148  
  40         3027  
10 40     40   352 use Scalar::Util qw< blessed refaddr weaken >;
  40         149  
  40         2645  
11 40     40   294 use version;
  40         136  
  40         358  
12              
13 40     40   4373 use PPI::Document;
  40         121387  
  40         1359  
14 40     40   293 use PPI::Document::File;
  40         123  
  40         1952  
15 40     40   21542 use PPIx::Utilities::Node qw< split_ppi_node_by_namespace >;
  40         105309  
  40         781  
16              
17 40     40   19906 use Perl::Critic::Annotation;
  40         133  
  40         1641  
18 40     40   16448 use Perl::Critic::Exception::Parse qw< throw_parse >;
  40         152  
  40         819  
19 40     40   2339 use Perl::Critic::Utils qw< :booleans :characters hashify shebang_line >;
  40         121  
  40         3411  
20              
21 40     40   9795 use PPIx::Regexp 0.010 qw< >;
  40         1366  
  40         123156  
22              
23             #-----------------------------------------------------------------------------
24              
25             our $VERSION = '1.148';
26              
27             #-----------------------------------------------------------------------------
28              
29             our $AUTOLOAD;
30             sub AUTOLOAD { ## no critic (ProhibitAutoloading,ArgUnpacking)
31 13939     13939   123343 my ( $function_name ) = $AUTOLOAD =~ m/ ([^:\']+) \z /xms;
32 13939 100       81238 return if $function_name eq 'DESTROY';
33 11156         17393 my $self = shift;
34 11156         46786 return $self->{_doc}->$function_name(@_);
35             }
36              
37             #-----------------------------------------------------------------------------
38              
39             sub new {
40 2780     2780 1 50716 my ($class, @args) = @_;
41              
42 2780         7228 my $self = bless {}, $class;
43              
44 2780         8950 $self->_init_common();
45 2780         8085 $self->_init_from_external_source(@args);
46              
47 2780         9789 return $self;
48             }
49              
50             #-----------------------------------------------------------------------------
51              
52             sub _new_for_parent_document {
53 4     4   9 my ($class, $ppi_document, $parent_document) = @_;
54              
55 4         8 my $self = bless {}, $class;
56              
57 4         12 $self->_init_common();
58              
59 4         8 $self->{_doc} = $ppi_document;
60 4         11 $self->{_is_module} = $parent_document->is_module();
61              
62 4         16 return $self;
63             }
64              
65             #-----------------------------------------------------------------------------
66              
67             sub _init_common {
68 2784     2784   5414 my ($self) = @_;
69              
70 2784         6547 $self->{_annotations} = [];
71 2784         5967 $self->{_suppressed_violations} = [];
72 2784         5451 $self->{_disabled_line_map} = {};
73              
74 2784         4611 return;
75             }
76              
77             #-----------------------------------------------------------------------------
78              
79             sub _init_from_external_source { ## no critic (Subroutines::RequireArgUnpacking)
80 2780     2780   5390 my $self = shift;
81 2780         3981 my %args;
82              
83 2780 50       7188 if (@_ == 1) {
84 0         0 warnings::warnif(
85             'deprecated',
86             'Perl::Critic::Document->new($source) deprecated, use Perl::Critic::Document->new(-source => $source) instead.' ## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)
87             );
88 0         0 %args = ('-source' => shift);
89             } else {
90 2780         8744 %args = @_;
91             }
92              
93 2780         5371 my $source_code = $args{'-source'};
94              
95             # $source_code can be a file name, or a reference to a
96             # PPI::Document, or a reference to a scalar containing source
97             # code. In the last case, PPI handles the translation for us.
98              
99 2780 100       7719 my $ppi_document =
    100          
100             _is_ppi_doc($source_code)
101             ? $source_code
102             : ref $source_code
103             ? PPI::Document->new($source_code)
104             : PPI::Document::File->new($source_code);
105              
106             # Bail on error
107 2780 50       16660813 if (not defined $ppi_document) {
108 0         0 my $errstr = PPI::Document::errstr();
109 0 0       0 my $file = ref $source_code ? undef : $source_code;
110 0         0 throw_parse
111             message => qq<Can't parse code: $errstr>,
112             file_name => $file;
113             }
114              
115 2780         7900 $self->{_doc} = $ppi_document;
116 2780         20275 $self->index_locations();
117 2780         3700493 $self->_disable_shebang_fix();
118 2780         8359 $self->{_filename_override} = $args{'-filename-override'};
119 2780         10110 $self->{_is_module} = $self->_determine_is_module(\%args);
120              
121 2780         7916 return;
122             }
123              
124             #-----------------------------------------------------------------------------
125              
126             sub _is_ppi_doc {
127 2780     2780   6008 my ($ref) = @_;
128 2780   66     21503 return blessed($ref) && $ref->isa('PPI::Document');
129             }
130              
131             #-----------------------------------------------------------------------------
132              
133             sub ppi_document {
134 13     13 1 33 my ($self) = @_;
135 13         59 return $self->{_doc};
136             }
137              
138             #-----------------------------------------------------------------------------
139              
140             sub isa { ## no critic ( Subroutines::ProhibitBuiltinHomonyms )
141 21     21 1 1137 my ($self, @args) = @_;
142             return $self->SUPER::isa(@args)
143 21   66     218 || ( (ref $self) && $self->{_doc} && $self->{_doc}->isa(@args) );
144             }
145              
146             #-----------------------------------------------------------------------------
147              
148             sub find {
149 19402     19402 1 40077 my ($self, $wanted, @more_args) = @_;
150              
151             # This method can only find elements by their class names. For
152             # other types of searches, delegate to the PPI::Document
153 19402 100 100     116534 if ( ( ref $wanted ) || !$wanted || $wanted !~ m/ \A PPI:: /xms ) {
      100        
154 130         560 return $self->{_doc}->find($wanted, @more_args);
155             }
156              
157             # Build the class cache if it doesn't exist. This happens at most
158             # once per Perl::Critic::Document instance. %elements of will be
159             # populated as a side-effect of calling the $finder_sub coderef
160             # that is produced by the caching_finder() closure.
161 19272 100       44386 if ( !$self->{_elements_of} ) {
162              
163 2738         10206 my %cache = ( 'PPI::Document' => [ $self ] );
164              
165             # The cache refers to $self, and $self refers to the cache. This
166             # creates a circular reference that leaks memory (i.e. $self is not
167             # destroyed until execution is complete). By weakening the reference,
168             # we allow perl to collect the garbage properly.
169 2738         12576 weaken( $cache{'PPI::Document'}->[0] );
170              
171 2738         9300 my $finder_coderef = _caching_finder( \%cache );
172 2738         11762 $self->{_doc}->find( $finder_coderef );
173 2738         64824 $self->{_elements_of} = \%cache;
174             }
175              
176             # find() must return false-but-defined on fail
177 19272   100     90790 return $self->{_elements_of}->{$wanted} || q{};
178             }
179              
180             #-----------------------------------------------------------------------------
181              
182             sub find_first {
183 312     312 1 4034 my ($self, $wanted, @more_args) = @_;
184              
185             # This method can only find elements by their class names. For
186             # other types of searches, delegate to the PPI::Document
187 312 100 100     1629 if ( ( ref $wanted ) || !$wanted || $wanted !~ m/ \A PPI:: /xms ) {
      100        
188 198         858 return $self->{_doc}->find_first($wanted, @more_args);
189             }
190              
191 114         347 my $result = $self->find($wanted);
192 114 100       572 return $result ? $result->[0] : $result;
193             }
194              
195             #-----------------------------------------------------------------------------
196              
197             sub find_any {
198 4     4 1 2175 my ($self, $wanted, @more_args) = @_;
199              
200             # This method can only find elements by their class names. For
201             # other types of searches, delegate to the PPI::Document
202 4 100 100     31 if ( ( ref $wanted ) || !$wanted || $wanted !~ m/ \A PPI:: /xms ) {
      100        
203 3         21 return $self->{_doc}->find_any($wanted, @more_args);
204             }
205              
206 1         5 my $result = $self->find($wanted);
207 1 50       6 return $result ? 1 : $result;
208             }
209              
210             #-----------------------------------------------------------------------------
211              
212             sub namespaces {
213 2     2 1 388 my ($self) = @_;
214              
215 2         3 return keys %{ $self->_nodes_by_namespace() };
  2         7  
216             }
217              
218             #-----------------------------------------------------------------------------
219              
220             sub subdocuments_for_namespace {
221 0     0 1 0 my ($self, $namespace) = @_;
222              
223 0         0 my $subdocuments = $self->_nodes_by_namespace()->{$namespace};
224              
225 0 0       0 return $subdocuments ? @{$subdocuments} : ();
  0         0  
226             }
227              
228             #-----------------------------------------------------------------------------
229              
230             sub ppix_regexp_from_element {
231 354     354 1 830 my ( $self, $element ) = @_;
232              
233 354 50 33     2643 if ( blessed( $element ) && $element->isa( 'PPI::Element' ) ) {
234 354         931 my $addr = refaddr( $element );
235             return $self->{_ppix_regexp_from_element}{$addr}
236 354 50       1238 if exists $self->{_ppix_regexp_from_element}{$addr};
237 354         940 return ( $self->{_ppix_regexp_from_element}{$addr} =
238             PPIx::Regexp->new( $element,
239             default_modifiers =>
240             $self->_find_use_re_modifiers_in_scope_from_element(
241             $element ),
242             ) );
243             } else {
244 0         0 return PPIx::Regexp->new( $element );
245             }
246             }
247              
248             sub _find_use_re_modifiers_in_scope_from_element {
249 354     354   648 my ( $self, $elem ) = @_;
250 354         521 my @found;
251 354 100       507 foreach my $use_re ( @{ $self->find( 'PPI::Statement::Include' ) || [] } )
  354         697  
252             {
253 23 100       107 're' eq $use_re->module()
254             or next;
255 15 100       480 $self->element_is_in_lexical_scope_after_statement_containing(
256             $elem, $use_re )
257             or next;
258 12 100       227 my $prefix = 'no' eq $use_re->type() ? q{-} : $EMPTY;
259             push @found,
260 12         55 map { "$prefix$_" }
261 48         160 grep { m{ \A / }smx }
262             map {
263 12 100       330 $_->isa( 'PPI::Token::Quote' ) ? $_->string() :
  48 100       1031  
264             $_->isa( 'PPI::Token::QuoteLike::Words' ) ? $_->literal() :
265             $_->content() }
266             $use_re->schildren();
267             }
268 354         2005 return \@found;
269             }
270              
271             #-----------------------------------------------------------------------------
272              
273             # This got hung on the Perl::Critic::Document, rather than living in
274             # Perl::Critic::Utils::PPI, because of the possibility that caching of scope
275             # objects would turn out to be desirable.
276              
277             sub element_is_in_lexical_scope_after_statement_containing {
278 15     15 1 35 my ( $self, $inner_elem, $outer_elem ) = @_;
279              
280             # If the outer element defines a scope, we're true if and only if
281             # the outer element contains the inner element, and the inner
282             # element is not somewhere that is hidden from the scope.
283 15 50       61 if ( $outer_elem->scope() ) {
284 0         0 return _inner_element_is_in_outer_scope_really(
285             $inner_elem, $outer_elem );
286             }
287              
288             # In the more general case:
289              
290             # The last element of the statement containing the outer element
291             # must be before the inner element. If not, we know we're false,
292             # without walking the parse tree.
293              
294 15 50       43 my $stmt = $outer_elem->statement()
295             or return;
296              
297 15         216 my $last_elem = $stmt;
298 15         62 while ( $last_elem->isa( 'PPI::Node' ) ) {
299 15 50       40 $last_elem = $last_elem->last_element()
300             or return;
301             }
302              
303 15 50       138 my $stmt_loc = $last_elem->location()
304             or return;
305              
306 15 50       227 my $inner_loc = $inner_elem->location()
307             or return;
308              
309 15 50       210 $stmt_loc->[0] > $inner_loc->[0]
310             and return;
311 15 50 33     48 $stmt_loc->[0] == $inner_loc->[0]
312             and $stmt_loc->[1] >= $inner_loc->[1]
313             and return;
314              
315             # Since we know the inner element is after the outer element, find
316             # the element that defines the scope of the statement that contains
317             # the outer element.
318              
319 15         27 my $parent = $stmt;
320 15         43 while ( ! $parent->scope() ) {
321             # Things appearing in the right-hand side of a
322             # PPI::Statement::Variable are not in-scope to its left-hand
323             # side. RESTRICTION -- this code does not handle truly
324             # pathological stuff like
325             # my ( $c, $d ) = qw{ e f };
326             # my ( $a, $b ) = my ( $c, $d ) = ( $c, $d );
327 15 50 33     40 _inner_is_defined_by_outer( $inner_elem, $parent )
328             and _location_is_in_right_hand_side_of_assignment(
329             $parent, $inner_elem )
330             and return;
331 15 50       47 $parent = $parent->parent()
332             or return;
333             }
334              
335             # We're true if and only if the scope of the outer element contains
336             # the inner element.
337              
338 15         163 return $inner_elem->descendant_of( $parent );
339              
340             }
341              
342             # Helper for element_is_in_lexical_scope_after_statement_containing().
343             # Return true if and only if $outer_elem is a statement that defines
344             # variables and $inner_elem is actually a variable defined in that
345             # statement.
346             sub _inner_is_defined_by_outer {
347 15     15   39 my ( $inner_elem, $outer_elem ) = @_;
348 15 50 33     93 $outer_elem->isa( 'PPI::Statement::Variable' )
349             and $inner_elem->isa( 'PPI::Token::Symbol' )
350             or return;
351 0         0 my %defines = hashify( $outer_elem->variables() );
352 0         0 return $defines{$inner_elem->symbol()};
353             }
354              
355             # Helper for element_is_in_lexical_scope_after_statement_containing().
356             # Given that the outer element defines a scope, there are still things
357             # that are lexically inside it but outside the scope. We return true if
358             # and only if the inner element is inside the outer element, but not
359             # inside one of the excluded elements. The cases handled so far:
360             # for ----- the list is not part of the scope
361             # foreach - the list is not part of the scope
362              
363             sub _inner_element_is_in_outer_scope_really {
364 0     0   0 my ( $inner_elem, $outer_elem ) = @_;
365 0 0       0 $outer_elem->scope()
366             or return;
367 0 0       0 $inner_elem->descendant_of( $outer_elem )
368             or return;
369 0 0       0 if ( $outer_elem->isa( 'PPI::Statement::Compound' ) ) {
370 0 0       0 my $first = $outer_elem->schild( 0 )
371             or return;
372 0 0       0 if ( { for => 1, foreach => 1 }->{ $first->content() } ) {
373 0         0 my $next = $first;
374 0         0 while ( $next = $next->snext_sibling() ) {
375 0 0       0 $next->isa( 'PPI::Structure::List' )
376             or next;
377 0         0 return ! $inner_elem->descendant_of( $next );
378             }
379             }
380             }
381 0         0 return $TRUE;
382             }
383              
384             # Helper for element_is_in_lexical_scope_after_statement_containing().
385             # Given and element that represents an assignment or assignment-ish
386             # statement, and a location, return true if the location is to the right
387             # of the equals sign, and false otherwise (including the case where
388             # there is no equals sign). Only the leftmost equals is considered. This
389             # is a restriction.
390             sub _location_is_in_right_hand_side_of_assignment {
391 0     0   0 my ( $elem, $inner_elem ) = @_;
392 0         0 my $inner_loc = $inner_elem->location();
393 0         0 my $kid = $elem->schild( 0 );
394 0         0 while ( $kid ) {
395 0 0 0     0 $kid->isa( 'PPI::Token::Operator' )
396             and q{=} eq $kid->content()
397             or next;
398 0         0 my $l = $kid->location();
399 0 0       0 $l->[0] > $inner_loc->[0]
400             and return;
401 0 0 0     0 $l->[0] == $inner_loc->[0]
402             and $l->[1] >= $inner_loc->[1]
403             and return;
404 0         0 return $inner_elem->descendant_of( $elem );
405             } continue {
406 0         0 $kid = $kid->snext_sibling();
407             }
408 0         0 return;
409             }
410              
411             #-----------------------------------------------------------------------------
412              
413             sub filename {
414 2872     2872 1 6663 my ($self) = @_;
415              
416 2872 100       8469 if (defined $self->{_filename_override}) {
417 2         19 return $self->{_filename_override};
418             }
419             else {
420 2870         5381 my $doc = $self->{_doc};
421 2870 50       14233 return $doc->can('filename') ? $doc->filename() : undef;
422             }
423             }
424              
425             #-----------------------------------------------------------------------------
426              
427             sub highest_explicit_perl_version {
428 234     234 1 498 my ($self) = @_;
429              
430             my $highest_explicit_perl_version =
431 234         528 $self->{_highest_explicit_perl_version};
432              
433 234 100       690 if ( not exists $self->{_highest_explicit_perl_version} ) {
434 93         317 my $includes = $self->find( \&_is_a_version_statement );
435              
436 93 100       1412 if ($includes) {
437             # Note: this doesn't use List::Util::max() because that function
438             # doesn't use the overloaded ">=" etc of a version object. The
439             # reduce() style lets version.pm take care of all comparing.
440             #
441             # For reference, max() ends up looking at the string converted to
442             # an NV, or something like that. An underscore like "5.005_04"
443             # provokes a warning and is chopped off at "5.005" thus losing the
444             # minor part from the comparison.
445             #
446             # An underscore "5.005_04" is supposed to mean an alpha release
447             # and shouldn't be used in a perl version. But it's shown in
448             # perlfunc under "use" (as a number separator), and appears in
449             # several modules supplied with perl 5.10.0 (like version.pm
450             # itself!). At any rate if version.pm can understand it then
451             # that's enough for here.
452             $highest_explicit_perl_version =
453 4 100   4   97 reduce { $a >= $b ? $a : $b }
454 16         147 map { version->new( $_->version() ) }
455 12         69 @{$includes};
  12         33  
456             }
457             else {
458 81         187 $highest_explicit_perl_version = undef;
459             }
460              
461             $self->{_highest_explicit_perl_version} =
462 93         820 $highest_explicit_perl_version;
463             }
464              
465 234 100       770 return $highest_explicit_perl_version if $highest_explicit_perl_version;
466 222         644 return;
467             }
468              
469             #-----------------------------------------------------------------------------
470              
471             sub uses_module {
472 468     468 1 856 my ($self, $module_name) = @_;
473              
474 468         894 return exists $self->_modules_used()->{$module_name};
475             }
476              
477             #-----------------------------------------------------------------------------
478              
479             sub process_annotations {
480 2721     2721 1 6526 my ($self) = @_;
481              
482 2721         13221 my @annotations = Perl::Critic::Annotation->create_annotations($self);
483 2721         9530 $self->add_annotation(@annotations);
484 2721         6591 return $self;
485             }
486              
487             #-----------------------------------------------------------------------------
488              
489             sub line_is_disabled_for_policy {
490 3171     3171 1 6841 my ($self, $line, $policy) = @_;
491 3171   33     10181 my $policy_name = ref $policy || $policy;
492              
493             # HACK: These two policies are special. If they are active, they cannot be
494             # disabled by a "## no critic" annotation. Rather than create a general
495             # hook in Policy.pm for enabling this behavior, we chose to hack
496             # it here, since this isn't the kind of thing that most policies do.
497              
498 3171 100       7339 return 0 if $policy_name eq
499             'Perl::Critic::Policy::Miscellanea::ProhibitUnrestrictedNoCritic';
500 3158 50       6808 return 0 if $policy_name eq
501             'Perl::Critic::Policy::Miscellanea::ProhibitUselessNoCritic';
502              
503 3158 100       12439 return 1 if $self->{_disabled_line_map}->{$line}->{$policy_name};
504 3064 100       8040 return 1 if $self->{_disabled_line_map}->{$line}->{ALL};
505 3025         8457 return 0;
506             }
507              
508             #-----------------------------------------------------------------------------
509              
510             sub add_annotation {
511 2721     2721 1 6526 my ($self, @annotations) = @_;
512              
513             # Add annotation to our private map for quick lookup
514 2721         5952 for my $annotation (@annotations) {
515              
516 89         267 my ($start, $end) = $annotation->effective_range();
517 89 100       309 my @affected_policies = $annotation->disables_all_policies ?
518             qw(ALL) : $annotation->disabled_policies();
519              
520             # TODO: Find clever way to do this with hash slices
521 89         246 for my $line ($start .. $end) {
522 369         644 for my $policy (@affected_policies) {
523 1452         2937 $self->{_disabled_line_map}->{$line}->{$policy} = 1;
524             }
525             }
526             }
527              
528 2721         4192 push @{ $self->{_annotations} }, @annotations;
  2721         6197  
529 2721         4944 return $self;
530             }
531              
532             #-----------------------------------------------------------------------------
533              
534             sub annotations {
535 6     6 1 17 my ($self) = @_;
536 6         13 return @{ $self->{_annotations} };
  6         28  
537             }
538              
539             #-----------------------------------------------------------------------------
540              
541             sub add_suppressed_violation {
542 133     133 1 288 my ($self, $violation) = @_;
543 133         207 push @{$self->{_suppressed_violations}}, $violation;
  133         299  
544 133         267 return $self;
545             }
546              
547             #-----------------------------------------------------------------------------
548              
549             sub suppressed_violations {
550 1     1 1 4 my ($self) = @_;
551 1         3 return @{ $self->{_suppressed_violations} };
  1         5  
552             }
553              
554             #-----------------------------------------------------------------------------
555              
556             sub is_program {
557 37     37 1 102 my ($self) = @_;
558              
559 37         96 return not $self->is_module();
560             }
561              
562             #-----------------------------------------------------------------------------
563              
564             sub is_module {
565 247     247 1 446 my ($self) = @_;
566              
567 247         874 return $self->{_is_module};
568             }
569              
570             #-----------------------------------------------------------------------------
571             # PRIVATE functions & methods
572              
573             sub _is_a_version_statement {
574 5003     5003   48141 my (undef, $element) = @_;
575              
576 5003 100       15482 return 0 if not $element->isa('PPI::Statement::Include');
577 94 100       472 return 1 if $element->version();
578 78         2179 return 0;
579             }
580              
581             #-----------------------------------------------------------------------------
582              
583             sub _caching_finder {
584 2738     2738   4678 my $cache_ref = shift; # These vars will persist for the life
585 2738         5481 my %isa_cache = (); # of the code ref that this sub returns
586              
587              
588             # Gather up all the PPI elements and sort by @ISA. Note: if any
589             # instances used multiple inheritance, this implementation would
590             # lead to multiple copies of $element in the $elements_of lists.
591             # However, PPI::* doesn't do multiple inheritance, so we are safe
592              
593             return sub {
594 139354     139354   1479667 my (undef, $element) = @_;
595 139354         227720 my $classes = $isa_cache{ref $element};
596 139354 100       239152 if ( !$classes ) {
597 24674         47393 $classes = [ ref $element ];
598             # Use a C-style loop because we append to the classes array inside
599 24674         39141 for ( my $i = 0; $i < @{$classes}; $i++ ) { ## no critic(ProhibitCStyleForLoops)
  110282         202990  
600 40     40   428 no strict 'refs'; ## no critic(ProhibitNoStrict)
  40         158  
  40         33268  
601 85608         105399 push @{$classes}, @{"$classes->[$i]::ISA"};
  85608         110455  
  85608         280083  
602 85608   100     249056 $cache_ref->{$classes->[$i]} ||= [];
603             }
604 24674         47761 $isa_cache{$classes->[0]} = $classes;
605             }
606              
607 139354         170568 for my $class ( @{$classes} ) {
  139354         211013  
608 450698         533129 push @{$cache_ref->{$class}}, $element;
  450698         804319  
609             }
610              
611 139354         249673 return 0; # 0 tells find() to keep traversing, but not to store this $element
612 2738         16721 };
613             }
614              
615             #-----------------------------------------------------------------------------
616              
617             sub _disable_shebang_fix {
618 2780     2780   6183 my ($self) = @_;
619              
620             # When you install a program using ExtUtils::MakeMaker or Module::Build, it
621             # inserts some magical code into the top of the file (just after the
622             # shebang). This code allows people to call your program using a shell,
623             # like `sh my_script`. Unfortunately, this code causes several Policy
624             # violations, so we disable them as if they had "## no critic" annotations.
625              
626 2780   100     15724 my $first_stmnt = $self->schild(0) || return;
627              
628             # Different versions of MakeMaker and Build use slightly different shebang
629             # fixing strings. This matches most of the ones I've found in my own Perl
630             # distribution, but it may not be bullet-proof.
631              
632 2762         59916 my $fixin_rx = qr<^eval 'exec .* \$0 \$[{]1[+]"\$@"}'\s*[\r\n]\s*if.+;>ms; ## no critic (ExtendedFormatting)
633 2762 100       14672 if ( $first_stmnt =~ $fixin_rx ) {
634 1         62 my $line = $first_stmnt->location->[0];
635 1         38 $self->{_disabled_line_map}->{$line}->{ALL} = 1;
636 1         8 $self->{_disabled_line_map}->{$line + 1}->{ALL} = 1;
637             }
638              
639 2762         187775 return $self;
640             }
641              
642             #-----------------------------------------------------------------------------
643              
644             sub _determine_is_module {
645 2780     2780   6023 my ($self, $args) = @_;
646              
647 2780         7968 my $file_name = $self->filename();
648 2780 100 100     16124 if (
649             defined $file_name
650             and ref $args->{'-program-extensions'} eq 'ARRAY'
651             ) {
652 57         93 foreach my $ext ( @{ $args->{'-program-extensions'} } ) {
  57         135  
653 57 50       155 my $regex =
654             ref $ext eq 'Regexp'
655             ? $ext
656 0         0 : qr< @{ [ quotemeta $ext ] } \z >xms;
657              
658 57 50       300 return $FALSE if $file_name =~ m/$regex/smx;
659             }
660             }
661              
662 2780 100       12064 return $FALSE if shebang_line($self);
663 2766 100 100     8737 return $FALSE if defined $file_name && $file_name =~ m/ [.] PL \z /smx;
664              
665 2765         7474 return $TRUE;
666             }
667              
668             #-----------------------------------------------------------------------------
669              
670             sub _nodes_by_namespace {
671 2     2   8 my ($self) = @_;
672              
673 2         5 my $nodes = $self->{_nodes_by_namespace};
674              
675 2 50       7 return $nodes if $nodes;
676              
677 2         6 my $ppi_document = $self->ppi_document();
678 2 50       11 if (not $ppi_document) {
679 0         0 return $self->{_nodes_by_namespace} = {};
680             }
681              
682 2         11 my $raw_nodes_map = split_ppi_node_by_namespace($ppi_document);
683              
684 2         2204 my %wrapped_nodes;
685 2         5 while ( my ($namespace, $raw_nodes) = each %{$raw_nodes_map} ) {
  6         25  
686             $wrapped_nodes{$namespace} = [
687 4         13 map { __PACKAGE__->_new_for_parent_document($_, $self) }
688 4         10 @{$raw_nodes}
  4         6  
689             ];
690             }
691              
692 2         38 return $self->{_nodes_by_namespace} = \%wrapped_nodes;
693             }
694              
695             #-----------------------------------------------------------------------------
696              
697             # Note: must use exists on return value to determine membership because all
698             # the values are false, unlike the result of hashify().
699             sub _modules_used {
700 468     468   699 my ($self) = @_;
701              
702 468         721 my $mapping = $self->{_modules_used};
703              
704 468 100       1853 return $mapping if $mapping;
705              
706 40         111 my $includes = $self->find('PPI::Statement::Include');
707 40 100       118 if (not $includes) {
708 35         266 return $self->{_modules_used} = {};
709             }
710              
711 5         18 my %mapping;
712 5         16 for my $module (
713 5 50       179 grep { $_ } map { $_->module() || $_->pragma() } @{$includes}
  5         26  
  5         17  
714             ) {
715             # Significantly less memory than $h{$k} => 1. Thanks Mr. Lembark.
716 5         23 $mapping{$module} = ();
717             }
718              
719 5         59 return $self->{_modules_used} = \%mapping;
720             }
721              
722             #-----------------------------------------------------------------------------
723              
724             1;
725              
726             __END__
727              
728             =pod
729              
730             =for stopwords pre-caches
731              
732             =head1 NAME
733              
734             Perl::Critic::Document - Caching wrapper around a PPI::Document.
735              
736              
737             =head1 SYNOPSIS
738              
739             use PPI::Document;
740             use Perl::Critic::Document;
741             my $doc = PPI::Document->new('Foo.pm');
742             $doc = Perl::Critic::Document->new(-source => $doc);
743             ## Then use the instance just like a PPI::Document
744              
745              
746             =head1 DESCRIPTION
747              
748             Perl::Critic does a lot of iterations over the PPI document tree via
749             the C<PPI::Document::find()> method. To save some time, this class
750             pre-caches a lot of the common C<find()> calls in a single traversal.
751             Then, on subsequent requests we return the cached data.
752              
753             This is implemented as a facade, where method calls are handed to the
754             stored C<PPI::Document> instance.
755              
756              
757             =head1 CAVEATS
758              
759             This facade does not implement the overloaded operators from
760             L<PPI::Document|PPI::Document> (that is, the C<use overload ...>
761             work). Therefore, users of this facade must not rely on that syntactic
762             sugar. So, for example, instead of C<my $source = "$doc";> you should
763             write C<< my $source = $doc->content(); >>
764              
765             Perhaps there is a CPAN module out there which implements a facade
766             better than we do here?
767              
768              
769             =head1 INTERFACE SUPPORT
770              
771             This is considered to be a public class. Any changes to its interface
772             will go through a deprecation cycle.
773              
774              
775             =head1 CONSTRUCTOR
776              
777             =over
778              
779             =item C<< new(-source => $source_code, '-filename-override' => $filename, '-program-extensions' => [program_extensions]) >>
780              
781             Create a new instance referencing a PPI::Document instance. The
782             C<$source_code> can be the name of a file, a reference to a scalar
783             containing actual source code, or a L<PPI::Document|PPI::Document> or
784             L<PPI::Document::File|PPI::Document::File>.
785              
786             In the event that C<$source_code> is a reference to a scalar containing actual
787             source code or a L<PPI::Document|PPI::Document>, the resulting
788             L<Perl::Critic::Document|Perl::Critic::Document> will not have a filename.
789             This may cause L<Perl::Critic::Document|Perl::Critic::Document> to incorrectly
790             classify the source code as a module or script. To avoid this problem, you
791             can optionally set the C<-filename-override> to force the
792             L<Perl::Critic::Document|Perl::Critic::Document> to have a particular
793             C<$filename>. Do not use this option if C<$source_code> is already the name
794             of a file, or is a reference to a L<PPI::Document::File|PPI::Document::File>.
795              
796             The '-program-extensions' argument is optional, and is a reference to a list
797             of strings and/or regular expressions. The strings will be made into regular
798             expressions matching the end of a file name, and any document whose file name
799             matches one of the regular expressions will be considered a program.
800              
801             If -program-extensions is not specified, or if it does not determine the
802             document type, the document will be considered to be a program if the source
803             has a shebang line or its file name (if any) matches C<< m/ [.] PL \z /smx >>.
804              
805             =back
806              
807             =head1 METHODS
808              
809             =over
810              
811             =item C<< ppi_document() >>
812              
813             Accessor for the wrapped PPI::Document instance. Note that altering
814             this instance in any way can cause unpredictable failures in
815             Perl::Critic's subsequent analysis because some caches may fall out of
816             date.
817              
818              
819             =item C<< find($wanted) >>
820              
821             =item C<< find_first($wanted) >>
822              
823             =item C<< find_any($wanted) >>
824              
825             Caching wrappers around the PPI methods. If C<$wanted> is a simple PPI class
826             name, then the cache is employed. Otherwise we forward the call to the
827             corresponding method of the C<PPI::Document> instance.
828              
829              
830             =item C<< namespaces() >>
831              
832             Returns a list of the namespaces (package names) in the document.
833              
834              
835             =item C<< subdocuments_for_namespace($namespace) >>
836              
837             Returns a list of sub-documents containing the elements in the given
838             namespace. For example, given that the current document is for the source
839              
840             foo();
841             package Foo;
842             package Bar;
843             package Foo;
844              
845             this method will return two L<Perl::Critic::Document|Perl::Critic::Document>s
846             for a parameter of C<"Foo">. For more, see
847             L<PPIx::Utilities::Node/split_ppi_node_by_namespace>.
848              
849              
850             =item C<< ppix_regexp_from_element($element) >>
851              
852             Caching wrapper around C<< PPIx::Regexp->new($element) >>. If
853             C<$element> is a C<PPI::Element> the cache is employed, otherwise it
854             just returns the results of C<< PPIx::Regexp->new() >>. In either case,
855             it returns C<undef> unless the argument is something that
856             L<PPIx::Regexp|PPIx::Regexp> actually understands.
857              
858             =item C<< element_is_in_lexical_scope_after_statement_containing( $inner, $outer ) >>
859              
860             Is the C<$inner> element in lexical scope after the statement containing
861             the C<$outer> element?
862              
863             In the case where C<$outer> is itself a scope-defining element, returns true
864             if C<$outer> contains C<$inner>. In any other case, C<$inner> must be
865             after the last element of the statement containing C<$outer>, and the
866             innermost scope for C<$outer> also contains C<$inner>.
867              
868             This is not the same as asking whether C<$inner> is visible from
869             C<$outer>.
870              
871              
872             =item C<< filename() >>
873              
874             Returns the filename for the source code if applicable
875             (PPI::Document::File) or C<undef> otherwise (PPI::Document).
876              
877              
878             =item C<< isa( $classname ) >>
879              
880             To be compatible with other modules that expect to get a
881             PPI::Document, the Perl::Critic::Document class masquerades as the
882             PPI::Document class.
883              
884              
885             =item C<< highest_explicit_perl_version() >>
886              
887             Returns a L<version|version> object for the highest Perl version
888             requirement declared in the document via a C<use> or C<require>
889             statement. Returns nothing if there is no version statement.
890              
891              
892             =item C<< uses_module($module_or_pragma_name) >>
893              
894             Answers whether there is a C<use>, C<require>, or C<no> of the given name in
895             this document. Note that there is no differentiation of modules vs. pragmata
896             here.
897              
898              
899             =item C<< process_annotations() >>
900              
901             Causes this Document to scan itself and mark which lines &
902             policies are disabled by the C<"## no critic"> annotations.
903              
904              
905             =item C<< line_is_disabled_for_policy($line, $policy_object) >>
906              
907             Returns true if the given C<$policy_object> or C<$policy_name> has
908             been disabled for at C<$line> in this Document. Otherwise, returns false.
909              
910              
911             =item C<< add_annotation( $annotation ) >>
912              
913             Adds an C<$annotation> object to this Document.
914              
915              
916             =item C<< annotations() >>
917              
918             Returns a list containing all the
919             L<Perl::Critic::Annotation|Perl::Critic::Annotation>s that
920             were found in this Document.
921              
922              
923             =item C<< add_suppressed_violation($violation) >>
924              
925             Informs this Document that a C<$violation> was found but not reported
926             because it fell on a line that had been suppressed by a C<"## no critic">
927             annotation. Returns C<$self>.
928              
929              
930             =item C<< suppressed_violations() >>
931              
932             Returns a list of references to all the
933             L<Perl::Critic::Violation|Perl::Critic::Violation>s
934             that were found in this Document but were suppressed.
935              
936              
937             =item C<< is_program() >>
938              
939             Returns whether this document is considered to be a program.
940              
941              
942             =item C<< is_module() >>
943              
944             Returns whether this document is considered to be a Perl module.
945              
946             =back
947              
948             =head1 AUTHOR
949              
950             Chris Dolan <cdolan@cpan.org>
951              
952             =head1 COPYRIGHT
953              
954             Copyright (c) 2006-2011 Chris Dolan.
955              
956             This program is free software; you can redistribute it and/or modify
957             it under the same terms as Perl itself. The full text of this license
958             can be found in the LICENSE file included with this module.
959              
960             =cut
961              
962             ##############################################################################
963             # Local Variables:
964             # mode: cperl
965             # cperl-indent-level: 4
966             # fill-column: 78
967             # indent-tabs-mode: nil
968             # c-indentation-style: bsd
969             # End:
970             # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :