File Coverage

blib/lib/Perl6/Controls.pm
Criterion Covered Total %
statement 201 305 65.9
branch 16 32 50.0
condition 14 28 50.0
subroutine 35 35 100.0
pod n/a
total 266 400 66.5


line stmt bran cond sub pod time code
1             package Perl6::Controls;
2              
3 9     9   133016 use 5.014; use warnings;
  9     9   33  
  9         46  
  9         29  
  9         394  
4              
5             our $VERSION = '0.000005';
6              
7              
8 9     9   6135 use Keyword::Declare;
  9         537582  
  9         79  
9              
10 0           sub import {
11              
12             # Rewire the 'for' loop (but we need to handle existing usages first)...
13 9     9   84  
14 9 50 50     157 keyword for {{{ foreach }}}
15 9         42  
  9         375  
16 9     9   71249 keytype OptIter is /(?:my|our|state)\s*\$\w+/;
17 9         19  
18 9 50 50     97 keyword for (OptIter $iter = '', '(', '^', Int $max, ')') {{{ for <{$iter}> (0..<{$max-1}>) }}}
19 9     5   53  
  5         154544  
  5         24  
  9         37  
  9         304  
20 9 50 50     77 keyword for (ParenthesesList $list, '->', CommaList $parameters, Block $code_block)
21 9     9   81023 :desc(enhanced for loop)
  9         32  
22             {{{
23 9     1   62 {
  1         31607  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         10  
24             state $__acc__ = [];
25 9     9   64 foreach my $__nary__ <{ $list =~ s{\)\Z}{,\\\$__acc__)}r }>
  0     2   0  
  0         0  
  9         87839  
  2         67955  
  2         5  
  2         4  
  2         5  
  2         4  
  2         5  
26             {
27             if (!ref($__nary__) || $__nary__ != \$__acc__) {
28 2         8 push @{$__acc__}, $__nary__;
29 9         60 next if @{$__acc__} <= <{ $parameters =~ tr/,// }>;
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
30             }
31             next if !@{$__acc__};
32 2         5 my ( <{"$parameters"}> ) = @{$__acc__};
33             @{$__acc__} = ();
34              
35 2         5 <{substr $code_block, 1, -1}>
36             }
37             }
38 2         5 }}}
  2         15  
39              
40              
41 9         49 # Perl 6 infinite loop...
  9         292  
42 9 50 50     76 keyword loop (Block $loop_block) {{{
43 9     9   94049 foreach (;;) <{$loop_block}>
  9         30  
44             }}}
45              
46              
47 0     1   0 # Perl 6 while loop...
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         17685  
  1         3  
  1         2  
  9         300  
48 1 50 50     3 keyword while (List $condition, Block $loop_block) {{{
  1         5  
  9         82  
49 9         46 foreach (;<{$condition}>;) <{$loop_block}>
  9         34  
50 0         0 }}}
51 9     9   85627  
  9         316  
52 9 50 50     86 keyword while (List $condition, '->', ScalarVar $parameter, Block $loop_block) {{{
53 4     4   110390 foreach (;my <{$parameter}> = <{$condition}>;) <{$loop_block}>
  4         12  
  4         36  
  4         10  
  9         33  
54 0         0 }}}
  4         9  
  4         10  
  4         22  
55 0         0  
  0         0  
  0         0  
  9         51  
56 0         0  
  0         0  
57 0     9   0 # Perl 6 repeat...while and variants...
  9     1   64  
  9         88959  
  1         27007  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
58 1         3  
  1         3  
  1         2  
  1         6  
  9         282  
59 9 50 50     45 keyword repeat ('while', List $while_condition, Block $code_block) :desc(repeat loop) {{{
  9         73  
60 0         0 foreach(;;) <{substr($code_block,0,-2)}>; last if !(<{$while_condition}>); }
  0         0  
  9         36  
61 0     9   0 }}}
  0         0  
  0         0  
  0         0  
  9         96863  
62 0         0  
  0         0  
  0         0  
  9         306  
63 9 50 50     63 keyword repeat ('until', List $until_condition, Block $code_block) {{{
  9         64  
  9         80  
64 1     1   33245 foreach(;;) <{substr($code_block,0,-2)}>; last if <{$until_condition}>; }
  1         2  
  1         2  
  1         2  
  1         2  
  9         33  
65 0         0 }}}
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         3  
  1         4  
  1         5  
66 0         0  
  0         0  
  0         0  
  0         0  
  9         48  
  9         277  
67 9 50 50     72 keyword repeat (Block $code_block,
  9         76  
68 9     9   84034 /while|until/ $while_or_until,
  1     1   31324  
  1         3  
  1         2  
  1         2  
  1         2  
  9         30  
69 1         2 Expr $condition) {
  1         3  
  1         6  
70 9         59 my $not = $while_or_until eq 'while' ? q{!} : q{};
71             qq{ foreach (;;) { do $code_block; last if $not ($condition); } };
72 0     9   0 }
  0     2   0  
  0         0  
  0         0  
  0         0  
  9         83727  
  2         64540  
  2         6  
  2         4  
  2         4  
  2         4  
73 0 100       0  
  0         0  
  0         0  
  2         8  
74 9         54  
  2         11  
75 9         46 # Special Perl 6 phasers within loops...
76 0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  9         276  
77 0     9   0 keytype Etc is / (?: (?&PerlOWS) (?&PerlStatement) )* (?&PerlOWS) \} /x;
  0     9   0  
  0         0  
  9         88252  
  9         69878  
78 9         59  
  9         15  
79 9 50 50     72 keyword FIRST (Block $code_block) :then(Etc $rest_of_block) :desc(FIRST block) {
80 9         33 state $FIRST_ID = 'FIRST000000'; $FIRST_ID++;
81 0         0 qq{
  0         0  
  0         0  
  0         0  
  0         0  
82 0 0       0 if (!(our \$$FIRST_ID)++) $code_block
83 0         0 $rest_of_block;
84 9     2   84 {our \$$FIRST_ID = 0}
  2         36906  
  2         6  
  2         4  
  2         4  
85 2         5 };
  2         5  
86 2         12 }
87 9         272  
88 9 50 50     73 keyword NEXT (Block $code_block) :then(Etc $rest_of_block) :desc(NEXT block) {
89 9         29 state $NEXT_ID = 'NEXT000000'; $NEXT_ID++;
90             chop $rest_of_block;
91 9         44 qq{
92             my \$$NEXT_ID = sub $code_block;
93 9     9   89561 $rest_of_block;
  2     2   38455  
  2         6  
  2         5  
  2         4  
94 2         4 \$$NEXT_ID->();
  2         5  
95 2         6 \}
96 2         12 };
97 0         0 }
  0         0  
  0         0  
  0         0  
98 0         0  
  0         0  
  9         279  
99 0 50 50     0 keyword LAST (Block $code_block) :then(Etc $rest_of_block) :desc(LAST block) {
  9         70  
100 9         116 state $LAST_ID = 'LAST000000'; $LAST_ID++;
101             qq{
102 9         48 our \$$LAST_ID = sub $code_block;
103             $rest_of_block;
104 9     9   59 {our \$$LAST_ID->();}
  9     2   89048  
  2         35368  
  2         5  
  2         4  
  2         4  
105 2         5 };
  2         5  
106 2         11 }
107              
108 0         0 # try and CATCH...
  0         0  
  0         0  
  0         0  
109 0         0  
  0         0  
  9         287  
110 0     9   0 keytype CatchParam is / \( (?&PerlOWS) (?&PerlVariableScalar) (?&PerlOWS) \) /x;
  9         70237  
111 0         0  
  9         80  
  9         14  
112 9 50 50     79 keyword CATCH (CatchParam $param = '($P6C____EXCEPTION)', Block $block) :desc(CATCH phaser) {{{
113 9     9   88803 BEGIN { eval'$P6C____CATCH=$P6C____CATCH;1' // die q{Can't specify CATCH block outside a try}; }
  9         33  
114             BEGIN { die q{Can't specify two CATCH blocks inside a single try} if defined $P6C____CATCH; }
115             BEGIN { $P6C____CATCH = sub { use experimentals; my <{$param}> = @_; given (<{$param}>) <{$block}> } }
116             }}}
117 9     9   88  
  0         0  
  0         0  
  0         0  
  0         0  
  9         150442  
  9         25  
  9         20  
  9         17  
  9         284  
118 0 50 50     0 keyword try (Block $block) {{{
  0         0  
  9         91  
119 0         0 { my $P6C____CATCH; eval { <{$block}> 1 } // do{ my $error = $@; $P6C____CATCH && $P6C____CATCH->($error) }; }
  9         37  
120 9         19 }}}
  9         21  
  9         19  
  9         47  
121 9         45 }
122              
123 9     9   86738 1; # Magic true value required at end of module
  10     10   177124  
  10         25  
  10         16  
124 9         56 __END__