File Coverage

blib/lib/Perl/Lint/Policy/BuiltinFunctions/ProhibitVoidMap.pm
Criterion Covered Total %
statement 48 48 100.0
branch 28 28 100.0
condition 12 12 100.0
subroutine 6 6 100.0
pod 0 1 0.0
total 94 95 98.9


line stmt bran cond sub pod time code
1             package Perl::Lint::Policy::BuiltinFunctions::ProhibitVoidMap;
2 133     133   111117 use strict;
  133         286  
  133         4934  
3 133     133   683 use warnings;
  133         225  
  133         3434  
4 133     133   1022 use Perl::Lint::Constants::Type;
  133         218  
  133         83140  
5 133     133   877 use parent "Perl::Lint::Policy";
  133         245  
  133         848  
6              
7             # TODO REFACTOR!!!
8              
9             use constant {
10 133         50561 DESC => '"map" used in void context',
11             EXPL => 'Use a "for" loop instead',
12 133     133   9694 };
  133         267  
13              
14             sub evaluate {
15 6     6 0 14 my ($class, $file, $tokens, $args) = @_;
16              
17 6         9 my @violations;
18 6         8 my $is_in_context = 0;
19 6         8 my $is_before_comma = 0; # XXX to decide is in context or not
20 6         6 my $is_in_map = 0;
21 6         25 my $is_in_ctrl_statement = 0;
22 6         8 my $left_brace_num = 0;
23 6         25 for (my $i = 0; my $token = $tokens->[$i]; $i++) {
24 352         361 my $token_type = $token->{type};
25 352         381 my $token_data = $token->{data};
26 352 100 100     3024 if ($token_type == BUILTIN_FUNC) {
    100 100        
    100 100        
    100          
    100          
    100          
27 48 100       76 if ($token_data eq 'map') {
28 37 100       75 next if $is_in_map;
29              
30 25 100 100     86 if ($is_in_ctrl_statement) {
    100          
31 6 100       14 if ($left_brace_num) {
32 4         25 push @violations, {
33             filename => $file,
34             line => $token->{line},
35             description => DESC,
36             explanation => EXPL,
37             policy => __PACKAGE__,
38             };
39             }
40             }
41             elsif (!$is_in_context && !$is_before_comma) {
42 10         49 push @violations, {
43             filename => $file,
44             line => $token->{line},
45             description => DESC,
46             explanation => EXPL,
47             policy => __PACKAGE__,
48             };
49             }
50              
51 25         26 $is_in_map = 1;
52 25         62 next;
53             }
54 11         26 $is_in_context = 1;
55             }
56             elsif ($token_type == ASSIGN) {
57 3         9 $is_in_context = 1;
58             }
59             elsif ( # NOTE enough?
60             $token_type == IF_STATEMENT ||
61             $token_type == FOR_STATEMENT ||
62             $token_type == WHILE_STATEMENT ||
63             $token_type == UNLESS_STATEMENT
64             ) {
65 6         13 $is_in_ctrl_statement = 1;
66             }
67             elsif ($is_in_ctrl_statement) {
68 62 100       177 if ($token_type == LEFT_BRACE) {
    100          
69 10         30 $left_brace_num++;
70             }
71             elsif ($token_type == RIGHT_BRACE) {
72 10         8 $left_brace_num--;
73 10 100       23 if ($left_brace_num <= 0) {
74 6         9 $is_in_ctrl_statement = 0;
75 6         15 $is_in_map = 0;
76             }
77             }
78             }
79             elsif ($token_type == SEMI_COLON) {
80 21         19 $is_in_context = 0;
81 21         50 $is_in_map = 0;
82             }
83             elsif ($token_type == COMMA) {
84 11         35 $is_before_comma = 1;
85             }
86             else {
87 201         442 $is_before_comma = 0;
88             }
89             }
90              
91 6         34 return \@violations;
92             }
93              
94             1;
95