File Coverage

blib/lib/Perl/Lint/Policy/InputOutput/ProhibitReadlineInForLoop.pm
Criterion Covered Total %
statement 43 44 97.7
branch 16 18 88.8
condition 6 6 100.0
subroutine 6 6 100.0
pod 0 1 0.0
total 71 75 94.6


line stmt bran cond sub pod time code
1             package Perl::Lint::Policy::InputOutput::ProhibitReadlineInForLoop;
2 133     133   69939 use strict;
  133         182  
  133         3129  
3 133     133   450 use warnings;
  133         190  
  133         2499  
4 133     133   775 use Perl::Lint::Constants::Type;
  133         170  
  133         60175  
5 133     133   582 use parent "Perl::Lint::Policy";
  133         185  
  133         614  
6              
7             use constant {
8 133         37902 DESC => 'Readline inside "for" loop',
9             EXPL => [211],
10 133     133   6673 };
  133         201  
11              
12             sub evaluate {
13 3     3 0 8 my ($class, $file, $tokens, $src, $args) = @_;
14              
15 3         6 my @violations;
16 3         18 for (my $i = 0; my $token = $tokens->[$i]; $i++) {
17 79         60 my $token_type = $token->{type};
18              
19 79 100 100     271 if ($token_type == FOR_STATEMENT || $token_type == FOREACH_STATEMENT) {
20 18         12 $i++;
21 18         20 $token = $tokens->[$i];
22 18         14 $token_type = $token->{type};
23 18 100 100     60 if ($token_type == DIAMOND || $token_type == LESS) {
24             # ~~~~ XXX should be HandleDecl in fact
25             push @violations, {
26             filename => $file,
27             line => $token->{line},
28 8         20 description => DESC,
29             explanation => EXPL,
30             policy => __PACKAGE__,
31             };
32 8         14 next;
33             }
34              
35 10         74 for (; my $token = $tokens->[$i]; $i++) {
36 21         22 $token_type = $token->{type};
37 21         18 my $left_paren_num = 0;
38 21 100       42 if ($token_type == LEFT_PAREN) {
39 10         8 $left_paren_num++;
40 10         22 for ($i++; my $token = $tokens->[$i]; $i++) {
41 20         16 $token_type = $token->{type};
42 20 50       51 if ($token_type == LEFT_PAREN) {
    100          
    100          
    100          
43 0         0 $left_paren_num++;
44             }
45             elsif ($token_type == RIGHT_PAREN) {
46 10 50       20 last if --$left_paren_num <= 0;
47             }
48             elsif ($token_type == DIAMOND) {
49             push @violations, {
50             filename => $file,
51             line => $token->{line},
52 3         13 description => DESC,
53             explanation => EXPL,
54             policy => __PACKAGE__,
55             };
56             }
57             elsif ($token_type == HANDLE_DELIM) {
58 6         13 for ($i++; my $token = $tokens->[$i]; $i++) {
59 12         9 $token_type = $token->{type};
60 12 100       23 if ($token_type == HANDLE_DELIM) {
61             push @violations, {
62             filename => $file,
63             line => $token->{line},
64 6         24 description => DESC,
65             explanation => EXPL,
66             policy => __PACKAGE__,
67             };
68 6         16 last;
69             }
70             }
71             }
72             }
73 10         21 last;
74             }
75             }
76             }
77             }
78              
79 3         16 return \@violations;
80             }
81              
82             1;
83