File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Util.pm
Criterion Covered Total %
statement 67 67 100.0
branch 37 42 88.1
condition 19 21 90.4
subroutine 10 10 100.0
pod 2 4 50.0
total 135 144 93.7


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Util;
2              
3 102     102   590 use strict;
  102         194  
  102         3198  
4 102     102   383 use warnings;
  102         165  
  102         4628  
5 102     102   448 use Exporter 5.57 qw/import/;
  102         2129  
  102         8270  
6              
7             our %FLAGS; BEGIN {
8 102     102   287 my $i = 0;
9 102         251 %FLAGS = map {$_ => 1 << $i++} qw/
  1020         5283  
10             F_KEEP_TOKENS
11             F_EVAL
12             F_STRING_EVAL
13             F_EXPECTS_BRACKET
14             F_CONDITIONAL
15             F_SIDEFF
16             F_SCOPE_END
17             F_STATEMENT_END
18             F_EXPR_END
19             F_EXPR
20             /;
21             }
22              
23 102     102   478 use constant \%FLAGS;
  102         190  
  102         19055  
24             use constant {
25 102         69556 MASK_KEEP_TOKENS => ~(F_KEEP_TOKENS),
26             MASK_EXPR_END => ~(F_EXPR_END|F_EXPR),
27             MASK_STATEMENT_END => ~(F_KEEP_TOKENS|F_STATEMENT_END|F_EXPR|F_EXPR_END|F_SIDEFF),
28             MASK_EVAL => ~(F_EVAL),
29             MASK_SIDEFF => ~(F_SIDEFF),
30             F_RESCAN => (F_KEEP_TOKENS|F_EVAL|F_STRING_EVAL|F_CONDITIONAL),
31 102     102   529 };
  102         167  
32              
33             our @EXPORT = ((keys %FLAGS), qw/
34             is_module_name
35             is_version
36             convert_string_tokens
37             convert_string_token_list
38             MASK_KEEP_TOKENS
39             MASK_EXPR_END
40             MASK_STATEMENT_END
41             MASK_EVAL
42             MASK_SIDEFF
43             F_RESCAN
44             /);
45              
46             sub is_module_name {
47 2900 100   2900 1 5347 my $name = shift or return;
48 2898 100       13257 return 1 if $name =~ /^[A-Za-z_][A-Za-z0-9_]*(?:(?:::|')[A-Za-z0-9_]+)*$/;
49 98         426 return;
50             }
51              
52             sub is_version {
53 520     520 1 783 my $version = shift;
54 520 50       1020 return unless defined $version;
55 520 100       2454 return 1 if $version =~ /\A
56             (
57             [0-9]+(?:\.[0-9]+)?
58             |
59             v[0-9]+(?:\.[0-9]+)*
60             |
61             [0-9]+(?:\.[0-9]+){2,}
62             ) (?:_[0-9]+)?
63             \z/x;
64 306         807 return;
65             }
66              
67             sub convert_string_tokens {
68 513     513 0 755 my $org_tokens = shift;
69 513         719 my @tokens;
70 513         1002 my @copied_tokens = @$org_tokens;
71 513         816 my $prev = '';
72 513         1246 while(my $copied_token = shift @copied_tokens) {
73 1960         3077 my ($token, $desc) = @$copied_token;
74 1960 100 100     4845 if ($desc and $desc eq '()' and $prev ne 'WORD') {
      100        
75 65         154 unshift @copied_tokens, @$token;
76 65         144 next;
77             }
78              
79 1895 100 100     5538 if (!$desc) {
    100          
    100          
    100          
80 11         25 push @tokens, $copied_token;
81             } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
82 108         185 push @tokens, $token;
83             } elsif ($desc eq 'STRING') {
84 327         603 push @tokens, $token->[0];
85             } elsif ($desc eq 'QUOTED_WORD_LIST') {
86 32 50       196 push @tokens, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  66         355  
87             } else {
88 1417         2035 push @tokens, $copied_token;
89             }
90 1895         3661 $prev = $desc;
91             }
92 513         1171 \@tokens;
93             }
94              
95             sub convert_string_token_list {
96 11     11 0 13 my $org_tokens = shift;
97 11         16 my @list;
98             my @tokens;
99 11         29 my @copied_tokens = @$org_tokens;
100 11         21 my $prev = '';
101 11         23 while(my $copied_token = shift @copied_tokens) {
102 42         60 my ($token, $desc) = @$copied_token;
103 42 100 100     100 if ($desc and $desc eq '()' and $prev ne 'WORD') {
      66        
104 1         2 unshift @copied_tokens, @$token;
105 1         3 next;
106             }
107              
108 41 100 66     192 if (!$desc) {
    100 100        
    100          
    100          
    100          
    100          
109 1         2 push @tokens, $copied_token;
110             } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
111 1         3 push @tokens, $token;
112             } elsif ($desc eq 'STRING') {
113 9         19 push @tokens, $token->[0];
114             } elsif ($desc eq 'QUOTED_WORD_LIST') {
115 1 50       7 push @list, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  7         26  
116             } elsif ($token eq ',' or $token eq '=>') {
117 13 50       27 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
118 13         18 @tokens = ();
119 13         17 $prev = '';
120             } elsif ($desc eq ';') {
121 6         10 last;
122             } else {
123 10         12 push @tokens, $copied_token;
124             }
125 35         63 $prev = $desc;
126             }
127 11 100       42 if (@tokens) {
128 8 50       17 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
129             }
130              
131 11         27 \@list;
132             }
133              
134             1;
135              
136             __END__