File Coverage

blib/lib/assign/Array.pm
Criterion Covered Total %
statement 74 75 98.6
branch 26 32 81.2
condition 5 8 62.5
subroutine 7 7 100.0
pod 0 2 0.0
total 112 124 90.3


line stmt bran cond sub pod time code
1 5     5   33 use strict; use warnings;
  5     5   15  
  5         136  
  5         23  
  5         8  
  5         155  
2             package assign::Array;
3              
4 5     5   1888 use assign::Struct;
  5         12  
  5         174  
5 5     5   31 use base 'assign::Struct';
  5         23  
  5         471  
6              
7 5     5   31 use XXX;
  5         9  
  5         19  
8              
9             sub parse_elem {
10 66     66 0 109 my ($self) = @_;
11 66         113 my $in = $self->{in};
12 66         105 my $elems = $self->{elems};
13 66         125 while (@$in) {
14 110         155 my $tok = shift(@$in);
15 110         171 my $type = ref($tok);
16 110 100       217 next if $type eq 'PPI::Token::Whitespace';
17              
18 64 100       143 if ($type eq 'PPI::Token::Symbol') {
19 58         122 my $str = $tok->content;
20 58 50       366 if ($str =~ /^[\$\@]\w+$/) {
21 58         143 my $elem = $self->get_var($str);
22 58         115 push @$elems, $elem;
23 58         166 return 1;
24             }
25             }
26              
27             # Parse @$a in the following if-statement.
28 6 100       14 if ($type eq 'PPI::Token::Cast') {
29 1 50       3 $tok->content eq '@' or
30             XXX $tok, "unexpected token";
31 1         7 $tok = shift(@$in);
32 1         4 $type = ref($tok);
33 1         3 my $str = $tok->content;
34 1 50 33     14 $type eq 'PPI::Token::Symbol' and $str =~ /^\$\w+$/ or
35             XXX $tok, "unexpected token";
36 1         3 my $elem = $self->get_var($str);
37 1         4 $elem->{cast} = 1;
38 1         3 push @$elems, $elem;
39 1         3 return 1;
40             }
41              
42 5 100       11 if ($type eq 'PPI::Token::Number') {
43 2         5 my $str = $tok->content;
44 2 50       14 if ($str =~ /^[1-9][0-9]*$/) {
45 2         9 push @$elems, skip_num->new($str);
46 2         6 return 1;
47             }
48             }
49 3 50       7 if ($type eq 'PPI::Token::Magic') {
50 3         7 my $str = $tok->content;
51 3 100       16 if ($str eq '_') {
52 2         7 push @$elems, skip->new;
53 2         8 return 1;
54             }
55 1 50       6 if ($str eq '$_') {
56 1         4 push @$elems, var->new($str);
57 1         3 return 1;
58             }
59             }
60 0         0 XXX $tok, "unexpected token";
61             }
62 2         7 return 0;
63             }
64              
65             sub gen_code {
66 21     21 0 77 my ($self, $decl, $oper, $from, $init) = @_;
67              
68 21         47 my $code = [ @$init ];
69 21         42 my $elems = $self->{elems};
70              
71 21 100       53 if ($decl) {
72             push @$code,
73             "$decl(" .
74             join(', ',
75             map $_->val,
76 53         110 grep {$_->val ne '$_'}
77 19         88 grep {$_->val =~ /^[\$\@]/}
  57         153  
78             @$elems
79             ) .
80             ');';
81             }
82              
83 21         43 my $i = 0;
84 21         45 for my $elem (@$elems) {
85 64         99 my $type = ref $elem;
86 64 100       134 if ($type eq 'skip') {
87 2         3 $i++;
88 2         5 next;
89             }
90 62 100       111 if ($type eq 'skip_num') {
91 2         5 $i += $elem->val;
92 2         4 next;
93             }
94              
95 60         141 my $var = $elem->val;
96 60   100     174 my $def = $elem->{def} // '';
97 60   66     141 $def &&= " // $def";
98              
99             push @$code,
100             ($elem->sigil eq '@')
101             ? "$var $oper \@$from\[$i..\@$from-1\]$def;" :
102             ($elem->{cast})
103 60 100       120 ? "$var $oper \[\@$from\[$i..\@$from-1\]\]$def;" :
    100          
104             "$var $oper $from\->[$i]$def;";
105              
106 60         157 $i++;
107             }
108              
109 21         110 return join "\n", @$code;
110             }
111              
112             1;