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   502 use strict;
  88         158  
  88         1950  
4 88     88   452 use warnings;
  88         145  
  88         2044  
5 88     88   507 use Exporter 5.57 qw/import/;
  88         1681  
  88         6969  
6              
7             our %FLAGS; BEGIN {
8 88     88   312 my $i = 0;
9 88         215 %FLAGS = map {$_ => 1 << $i++} qw/
  880         4296  
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   551 use constant \%FLAGS;
  88         200  
  88         16666  
24             use constant {
25 88         52278 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   530 };
  88         226  
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 2368 100   2368 1 4368 my $name = shift or return;
48 2366 100       11407 return 1 if $name =~ /^[A-Za-z_][A-Za-z0-9_]*(?:(?:::|')[A-Za-z0-9_]+)*$/;
49 87         384 return;
50             }
51              
52             sub is_version {
53 335     335 1 569 my $version = shift;
54 335 100       692 return unless defined $version;
55 334 100       1547 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         646 return;
65             }
66              
67             sub convert_string_tokens {
68 394     394 0 646 my $org_tokens = shift;
69 394         607 my @tokens;
70 394         845 my @copied_tokens = @$org_tokens;
71 394         659 my $prev = '';
72 394         1062 while(my $copied_token = shift @copied_tokens) {
73 1594         2599 my ($token, $desc) = @$copied_token;
74 1594 100 100     4717 if ($desc and $desc eq '()' and $prev ne 'WORD') {
      100        
75 61         177 unshift @copied_tokens, @$token;
76 61         160 next;
77             }
78              
79 1533 100 100     5099 if (!$desc) {
    100          
    100          
    100          
80 7         16 push @tokens, $copied_token;
81             } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
82 72         118 push @tokens, $token;
83             } elsif ($desc eq 'STRING') {
84 282         557 push @tokens, $token->[0];
85             } elsif ($desc eq 'QUOTED_WORD_LIST') {
86 25 50       132 push @tokens, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  53         210  
87             } else {
88 1147         1683 push @tokens, $copied_token;
89             }
90 1533         2939 $prev = $desc;
91             }
92 394         1179 \@tokens;
93             }
94              
95             sub convert_string_token_list {
96 11     11 0 17 my $org_tokens = shift;
97 11         20 my @list;
98             my @tokens;
99 11         22 my @copied_tokens = @$org_tokens;
100 11         18 my $prev = '';
101 11         32 while(my $copied_token = shift @copied_tokens) {
102 40         68 my ($token, $desc) = @$copied_token;
103 40 50 33     116 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     206 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         3 push @tokens, $token;
112             } elsif ($desc eq 'STRING') {
113 9         22 push @tokens, $token->[0];
114             } elsif ($desc eq 'QUOTED_WORD_LIST') {
115 1 50       6 push @list, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
  7         17  
116             } elsif ($token eq ',' or $token eq '=>') {
117 13 50       35 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
118 13         21 @tokens = ();
119 13         17 $prev = '';
120             } elsif ($desc eq ';') {
121 6         13 last;
122             } else {
123 10         16 push @tokens, $copied_token;
124             }
125 34         66 $prev = $desc;
126             }
127 11 100       24 if (@tokens) {
128 7 50       24 push @list, @tokens == 1 ? $tokens[0] : \@tokens;
129             }
130              
131 11         27 \@list;
132             }
133              
134             1;
135              
136             __END__