File Coverage

blib/lib/Perl6/Controls.pm
Criterion Covered Total %
statement 202 307 65.8
branch 16 32 50.0
condition 14 28 50.0
subroutine 35 35 100.0
pod n/a
total 267 402 66.4


line stmt bran cond sub pod time code
1             package Perl6::Controls;
2              
3 9     9   172971 use 5.012; use warnings;
  9     9   45  
  9         68  
  9         33  
  9         493  
4              
5             our $VERSION = '0.000006';
6              
7              
8 9     9   7487 use Keyword::Declare;
  9         666738  
  9         99  
9              
10 0           sub import {
11              
12             # Rewire the 'for' loop (but we need to handle existing usages first)...
13 9     9   120  
14 9 50 50     227 keyword for {{{ foreach }}}
15 9         58  
  9         504  
16 9     9   81309 keytype OptIter is /(?:my|our|state)\s*\$\w+/;
17 9         24  
18 9 50 50     133 keyword for (OptIter $iter = '', '(', '^', Int $max, ')') {{{ for <{$iter}> (0..<{$max-1}>) }}}
19 9     5   110  
  5         204011  
  5         35  
  9         52  
  9         420  
20 9 50 50     110 keyword for (ParenthesesList $list, '->', CommaList $parameters, Block $code_block)
21 9     9   88666 :desc(enhanced for loop)
  9         45  
22             {{{
23 9     1   68 {
  1         43429  
  1         4  
  1         3  
  1         2  
  1         5  
  1         3  
  1         2  
  1         5  
  1         5  
  1         14  
24             state $__acc__ = [];
25 9     9   66 foreach my $__nary__ <{ $list =~ s{\)\Z}{,\\\$__acc__)}; $list }>
  0     2   0  
  0         0  
  9         101848  
  2         79372  
  2         6  
  2         5  
  2         5  
  2         4  
  2         4  
26             {
27             if (!ref($__nary__) || $__nary__ != \$__acc__) {
28 2         9 push @{$__acc__}, $__nary__;
  2         6  
29 9         75 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         6 <{substr $code_block, 1, -1}>
36             }
37             }
38 2         5 }}}
  2         17  
39              
40              
41 9         66 # Perl 6 infinite loop...
  9         403  
42 9 50 50     112 keyword loop (Block $loop_block) {{{
43 9     9   112377 foreach (;;) <{$loop_block}>
  9         45  
44             }}}
45              
46              
47 0     1   0 # Perl 6 while loop...
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         22097  
  1         5  
  1         4  
  9         423  
48 1 50 50     4 keyword while (List $condition, Block $loop_block) {{{
  1         11  
  9         116  
49 9         96 foreach (;<{$condition}>;) <{$loop_block}>
  9         45  
50 0         0 }}}
  0         0  
51 9     9   96051  
  9         397  
52 9 50 50     122 keyword while (List $condition, '->', ScalarVar $parameter, Block $loop_block) {{{
53 4     4   124124 foreach (;my <{$parameter}> = <{$condition}>;) <{$loop_block}>
  4         14  
  4         12  
  4         8  
  9         48  
54 0         0 }}}
  4         11  
  4         10  
  4         29  
55 0         0  
  0         0  
  0         0  
  9         64  
56 0         0  
  0         0  
57 0     9   0 # Perl 6 repeat...while and variants...
  9     1   73  
  9         110126  
  1         27106  
  1         3  
  1         1  
  1         2  
  1         3  
  1         1  
58 1         3  
  1         2  
  1         2  
  1         7  
  9         402  
59 9 50 50     61 keyword repeat ('while', List $while_condition, Block $code_block) :desc(repeat loop) {{{
  9         110  
60 0         0 foreach(;;) <{substr($code_block,0,-2)}>; last if !(<{$while_condition}>); }
  0         0  
  9         57  
61 0     9   0 }}}
  0         0  
  0         0  
  0         0  
  9         109740  
62 0         0  
  0         0  
  0         0  
  9         404  
63 9 50 50     76 keyword repeat ('until', List $until_condition, Block $code_block) {{{
  9         75  
  9         119  
64 1     1   41859 foreach(;;) <{substr($code_block,0,-2)}>; last if <{$until_condition}>; }
  1         3  
  1         3  
  1         3  
  1         2  
  9         51  
65 0         0 }}}
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         3  
  1         7  
  1         13  
66 0         0  
  0         0  
  0         0  
  0         0  
  9         63  
  9         411  
67 9 50 50     85 keyword repeat (Block $code_block,
  9         123  
68 9     9   109019 /while|until/ $while_or_until,
  1     1   38093  
  1         5  
  1         3  
  1         3  
  1         4  
  9         48  
69 1         3 Expr $condition) {
  1         6  
  1         12  
70 9         89 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         106547  
  2         82403  
  2         9  
  2         6  
  2         4  
  2         5  
73 0 100       0  
  0         0  
  0         0  
  2         11  
74 9         80  
  2         16  
75 9         73 # Special Perl 6 phasers within loops...
76 0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  9         419  
77 0     9   0 keytype Etc is / (?: (?&PerlOWS) (?&PerlStatement) )* (?&PerlOWS) \} /x;
  0     9   0  
  0         0  
  9         122654  
  9         91754  
78 9         82  
  9         23  
79 9 50 50     118 keyword FIRST (Block $code_block) :then(Etc $rest_of_block) :desc(FIRST block) {
80 9         49 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   111 {our \$$FIRST_ID = 0}
  2         41618  
  2         10  
  2         8  
  2         6  
85 2         8 };
  2         7  
86 2         18 }
87 9         408  
88 9 50 50     122 keyword NEXT (Block $code_block) :then(Etc $rest_of_block) :desc(NEXT block) {
89 9         51 state $NEXT_ID = 'NEXT000000'; $NEXT_ID++;
90             chop $rest_of_block;
91 9         73 qq{
92             my \$$NEXT_ID = sub $code_block;
93 9     9   113638 $rest_of_block;
  2     2   44740  
  2         8  
  2         5  
  2         5  
94 2         7 \$$NEXT_ID->();
  2         6  
95 2         7 \}
96 2         16 };
97 0         0 }
  0         0  
  0         0  
  0         0  
98 0         0  
  0         0  
  9         456  
99 0 50 50     0 keyword LAST (Block $code_block) :then(Etc $rest_of_block) :desc(LAST block) {
  9         118  
100 9         170 state $LAST_ID = 'LAST000000'; $LAST_ID++;
101             qq{
102 9         74 our \$$LAST_ID = sub $code_block;
103             $rest_of_block;
104 9     9   82 {our \$$LAST_ID->();}
  9     2   119565  
  2         37503  
  2         6  
  2         5  
  2         5  
105 2         6 };
  2         6  
106 2         13 }
107              
108 0         0 # try and CATCH...
  0         0  
  0         0  
  0         0  
109 0         0  
  0         0  
  9         424  
110 0     9   0 keytype CatchParam is / \( (?&PerlOWS) (?&PerlVariableScalar) (?&PerlOWS) \) /x;
  9         95081  
111 0         0  
  9         121  
  9         21  
112 9 50 50     123 keyword CATCH (CatchParam $param = '($P6C____EXCEPTION)', Block $block) :desc(CATCH phaser) {{{
113 9     9   119842 BEGIN { eval'$P6C____CATCH=$P6C____CATCH;1' // die q{Can't specify CATCH block outside a try}; }
  9         47  
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   80  
  0         0  
  0         0  
  0         0  
  0         0  
  9         171316  
  9         36  
  9         22  
  9         15  
  9         387  
118 0 50 50     0 keyword try (Block $block) {{{
  0         0  
  9         143  
119 0         0 { my $P6C____CATCH; eval { <{$block}> 1 } // do{ my $error = $@; $P6C____CATCH && $P6C____CATCH->($error) }; }
  9         50  
120 9         27 }}}
  9         19  
  9         23  
  9         65  
121 9         66 }
122              
123 9     9   108612 1; # Magic true value required at end of module
  10     10   203559  
  10         39  
  10         21  
124 9         84 __END__