File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Util.pm
Criterion Covered Total %
statement 64 67 95.5
branch 36 42 85.7
condition 16 21 76.1
subroutine 10 10 100.0
pod 2 4 50.0
total 128 144 88.8


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Util;
2              
3 88     88   552 use strict;
  88         168  
  88         2369  
4 88     88   381 use warnings;
  88         160  
  88         2309  
5 88     88   422 use Exporter 5.57 qw/import/;
  88         1419  
  88         6444  
6              
7             our %FLAGS; BEGIN {
8 88     88   315 my $i = 0;
9 88         233 %FLAGS = map {$_ => 1 << $i++} qw/
  880         4733  
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 88     88   573 use constant \%FLAGS;
  88         193  
  88         18189  
24             use constant {
25 88         57671 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 88     88   608 };
  88         228  
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 2362 100   2362 1 4751 my $name = shift or return;
48 2360 100       12577 return 1 if $name =~ /^[A-Za-z_][A-Za-z0-9_]*(?:(?:::|')[A-Za-z0-9_]+)*$/;
49 87         389 return;
50             }
51              
52             sub is_version {
53 335     335 1 590 my $version = shift;
54 335 100       712 return unless defined $version;
55 334 100       1668 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 228         725 return;
65             }
66              
67             sub convert_string_tokens {
68 394     394 0 724 my $org_tokens = shift;
69 394         588 my @tokens;
70 394         867 my @copied_tokens = @$org_tokens;
71 394         709 my $prev = '';
72 394         1030 while(my $copied_token = shift @copied_tokens) {
73 1594         2885 my ($token, $desc) = @$copied_token;
74 1594 100 100     4616 if ($desc and $desc eq '()' and $prev ne 'WORD') {
      100        
75 61         170 unshift @copied_tokens, @$token;
76 61         162 next;
77             }
78              
79 1533 100 100     5293 if (!$desc) {
    100          
    100          
    100          
80 7         37 push @tokens, $copied_token;
81             } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
82 72         138 push @tokens, $token;
83             } elsif ($desc eq 'STRING') {
84 282         672 push @tokens, $token->[0];
85             } elsif ($desc eq 'QUOTED_WORD_LIST') {
86 25 50       155 push @tokens, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  53         247  
87             } else {
88 1147         1775 push @tokens, $copied_token;
89             }
90 1533         3225 $prev = $desc;
91             }
92 394         1140 \@tokens;
93             }
94              
95             sub convert_string_token_list {
96 11     11 0 21 my $org_tokens = shift;
97 11         24 my @list;
98             my @tokens;
99 11         31 my @copied_tokens = @$org_tokens;
100 11         27 my $prev = '';
101 11         51 while(my $copied_token = shift @copied_tokens) {
102 40         83 my ($token, $desc) = @$copied_token;
103 40 50 33     125 if ($desc and $desc eq '()' and $prev ne 'WORD') {
      33        
104 0         0 unshift @copied_tokens, @$token;
105 0         0 next;
106             }
107              
108 40 50 66     229 if (!$desc) {
    100 100        
    100          
    100          
    100          
    100          
109 0         0 push @tokens, $copied_token;
110             } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
111 1         4 push @tokens, $token;
112             } elsif ($desc eq 'STRING') {
113 9         24 push @tokens, $token->[0];
114             } elsif ($desc eq 'QUOTED_WORD_LIST') {
115 1 50       23 push @list, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  7         23  
116             } elsif ($token eq ',' or $token eq '=>') {
117 13 50       46 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
118 13         22 @tokens = ();
119 13         23 $prev = '';
120             } elsif ($desc eq ';') {
121 6         16 last;
122             } else {
123 10         19 push @tokens, $copied_token;
124             }
125 34         75 $prev = $desc;
126             }
127 11 100       28 if (@tokens) {
128 7 50       24 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
129             }
130              
131 11         35 \@list;
132             }
133              
134             1;
135              
136             __END__