File Coverage

blib/lib/Perl/Lint/Policy/Variables/ProhibitLocalVars.pm
Criterion Covered Total %
statement 42 43 97.6
branch 21 24 87.5
condition 7 8 87.5
subroutine 6 6 100.0
pod 0 1 0.0
total 76 82 92.6


line stmt bran cond sub pod time code
1             package Perl::Lint::Policy::Variables::ProhibitLocalVars;
2 134     134   98076 use strict;
  134         283  
  134         4921  
3 134     134   654 use warnings;
  134         231  
  134         3615  
4 134     134   1342 use Perl::Lint::Constants::Type;
  134         198  
  134         86480  
5 134     134   828 use parent "Perl::Lint::Policy";
  134         218  
  134         810  
6              
7             use constant {
8 134         57843 DESC => 'The names of or patterns for variables to forbid',
9             EXPL => 'Find an alternative variable',
10 134     134   9046 };
  134         252  
11              
12             sub evaluate {
13 5     5 0 13 my ($class, $file, $tokens, $src, $args) = @_;
14              
15 5         8 my @violations;
16 5         28 for (my $i = 0, my $token_type; my $token = $tokens->[$i]; $i++) {
17 131         112 $token_type = $token->{type};
18              
19 131 100       277 if ($token_type == LOCAL_DECL) {
20 18         19 $token = $tokens->[++$i];
21 18         17 $token_type = $token->{type};
22              
23 18 100 66     50 if ($token_type == LEFT_PAREN) {
    100          
24 9         11 my $violation;
25 9         11 my $left_paren_num = 1;
26 9         20 for ($i++; my $token = $tokens->[$i]; $i++) {
27 36         40 $token_type = $token->{type};
28 36 50 100     131 if ($token_type == LEFT_PAREN) {
    100          
    100          
29 0         0 $left_paren_num++;
30             }
31             elsif ($token_type == RIGHT_PAREN) {
32 9 50       19 if (--$left_paren_num <= 0) {
33 9 100       15 if ($violation) {
34 4         4 push @violations, $violation;
35 4         6 undef $violation;
36             }
37 9         25 last;
38             }
39             }
40             elsif ($token_type == GLOBAL_VAR || $token_type == VAR) {
41 11 100       49 if ($token->{data} !~ /\A\$[A-Z_]+\Z/) {
42 6         7 my $next_token = $tokens->[$i+1];
43 6 50       15 if ($next_token->{type} != NAMESPACE_RESOLVER) {
44 6   100     29 $violation ||= +{
45             filename => $file,
46             line => $token->{line},
47             description => DESC,
48             explanation => EXPL,
49             policy => __PACKAGE__,
50             };
51             }
52             }
53             }
54             }
55             }
56             elsif ($token_type == GLOBAL_VAR || $token_type == VAR) {
57 7 100       41 if ($token->{data} !~ /\A\$[A-Z_]+\Z/) {
58 3         8 my $next_token = $tokens->[$i+1];
59 3 100       16 if ($next_token->{type} != NAMESPACE_RESOLVER) {
60 2         17 push @violations, {
61             filename => $file,
62             line => $token->{line},
63             description => DESC,
64             explanation => EXPL,
65             policy => __PACKAGE__,
66             };
67             }
68             }
69             }
70             }
71             }
72              
73 5         28 return \@violations;
74             }
75              
76             1;
77