File Coverage

blib/lib/RPerl/DataStructure/Array/ListElements.pm
Criterion Covered Total %
statement 74 85 87.0
branch 19 26 73.0
condition 13 17 76.4
subroutine 8 9 88.8
pod n/a
total 114 137 83.2


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::DataStructure::Array::ListElements;
3 3     3   18 use strict;
  3         4  
  3         79  
4 3     3   16 use warnings;
  3         7  
  3         62  
5 3     3   14 use RPerl::AfterSubclass;
  3         8  
  3         367  
6             our $VERSION = 0.003_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 3     3   20 use parent qw(RPerl::GrammarRule);
  3         8  
  3         18  
10 3     3   174 use RPerl::GrammarRule;
  3         6  
  3         1978  
11              
12             # [[[ CRITICS ]]]
13             ## no critic qw(ProhibitUselessNoCritic ProhibitMagicNumbers RequireCheckedSyscalls) # USER DEFAULT 1: allow numeric values & print operator
14             ## no critic qw(RequireInterpolationOfMetachars) # USER DEFAULT 2: allow single-quoted control characters & sigils
15              
16             # [[[ OO PROPERTIES ]]]
17             our hashref $properties = {};
18              
19             # [[[ SUBROUTINES & OO METHODS ]]]
20              
21             sub length {
22 422     422   1342 { my integer::method $RETURN_TYPE };
  422         1560  
23 422         1631 ( my object $self, my string_hashref $modes) = @ARG;
24 422         1301 my integer $length = 0;
25              
26             # RPerl::diag( 'in Array::ListElements->length(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
27              
28 422 50       2503 if ( exists $self->{children}->[0] ) {
29 422         1158 $length++;
30             }
31             else {
32 0         0 return $length;
33             }
34 422         1632 my object $list_elements_star = $self->{children}->[1];
35              
36 422         1172 foreach my object $list_element ( @{ $list_elements_star->{children} } ) {
  422         2303  
37              
38             # RPerl::diag( 'in Array::ListElements->length(), top of foreach() loop, have $list_element = ' . "\n" . RPerl::Parser::rperl_ast__dump($list_element) . "\n" );
39 136 100       480 if ( ref $list_element ne 'TERMINAL' ) {
40 68         154 $length++;
41             }
42             }
43              
44 422         2658 return $length;
45             }
46              
47             sub ast_to_rperl__generate {
48 2122     2122   3979 { my string_hashref::method $RETURN_TYPE };
  2122         4081  
49 2122         4939 ( my object $self, my string_hashref $modes) = @ARG;
50 2122         8007 my string_hashref $rperl_source_group = { PMC => q{} };
51              
52             # RPerl::diag( 'in Array::ListElements->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
53              
54 2122 50       8783 if ( ( ref $self ) ne 'ListElements_204' ) {
55 0         0 die RPerl::Parser::rperl_rule__replace(
56             'ERROR ECOGEASRP00, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: Grammar rule ' . ( ref $self ) . ' found where ListElements_204 expected, dying' )
57             . "\n";
58             }
59              
60 2122         6274 my object $list_element0 = $self->{children}->[0];
61 2122         4236 my object $list_elements_star = $self->{children}->[1];
62              
63             # RPerl::diag( 'in Array::ListElements->ast_to_rperl__generate(), top of foreach() loop, have $list_element0 = ' . "\n" . RPerl::Parser::rperl_ast__dump($list_element0) . "\n" );
64             # die 'TMP DEBUG';
65              
66 2122         43481 my string_hashref $rperl_source_subgroup = $list_element0->ast_to_rperl__generate($modes);
67 2122         45729 RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
68              
69 2122         3940 foreach my object $list_element ( @{ $list_elements_star->{children} } ) {
  2122         7464  
70              
71             # RPerl::diag( 'in Array::ListElements->ast_to_rperl__generate(), top of foreach() loop, have $list_element = ' . "\n" . RPerl::Parser::rperl_ast__dump($list_element) . "\n" );
72             # die 'TMP DEBUG';
73 4648 100       11832 if ( ref $list_element eq 'TERMINAL' ) {
74 2324 50       7143 if ( $list_element->{attr} ne q{,} ) {
75             die RPerl::Parser::rperl_rule__replace( q{ERROR ECOGEASRP00, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: Grammar rule '}
76             . $list_element->{attr}
77 0         0 . q{' found where OP21_LIST_COMMA ',' expected, dying} )
78             . "\n";
79             }
80 2324         6099 $rperl_source_group->{PMC} .= $list_element->{attr} . q{ }; # OP21_LIST_COMMA
81             }
82             else {
83 2324         47660 my string_hashref $rperl_source_subgroup = $list_element->ast_to_rperl__generate($modes);
84 2324         48580 RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
85             }
86             }
87 2122         13532 return $rperl_source_group;
88             }
89              
90             sub ast_to_cpp__generate__CPPOPS_PERLTYPES {
91 0     0   0 { my string_hashref::method $RETURN_TYPE };
  0         0  
92 0         0 ( my object $self, my string_hashref $modes) = @ARG;
93 0         0 my string_hashref $cpp_source_group = { CPP => q{// <<< RP::DS::A::LEs __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
94              
95             #...
96 0         0 return $cpp_source_group;
97             }
98              
99             sub ast_to_cpp__generate__CPPOPS_CPPTYPES {
100 102     102   208 { my string_hashref::method $RETURN_TYPE };
  102         173  
101 102         210 ( my object $self, my string_hashref $modes) = @ARG;
102 102         313 my string_hashref $cpp_source_group = { CPP => q{} };
103              
104             # RPerl::diag( 'in Array::ListElements->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
105             # RPerl::diag( 'in Array::ListElements->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $modes->{_inside_print_operator} = ' . $modes->{_inside_print_operator} . "\n" );
106              
107 102 50       335 if ( ( ref $self ) ne 'ListElements_204' ) {
108 0         0 die RPerl::Parser::rperl_rule__replace(
109             'ERROR ECOGEASCP00, CODE GENERATOR, ABSTRACT SYNTAX TO C++: Grammar rule ' . ( ref $self ) . ' found where ListElements_204 expected, dying' )
110             . "\n";
111             }
112              
113             # save to stack of saved flags, when needed
114 102 100 100     324 if ( ( exists $modes->{_inside_list_elements} ) and ( defined $modes->{_inside_list_elements} ) ) {
115 12 100 66     53 if ( ( not exists $modes->{_inside_list_elements_saved} ) or ( not defined $modes->{_inside_list_elements_saved} ) ) {
116 8         32 $modes->{_inside_list_elements_saved} = [];
117             }
118 12         26 push @{ $modes->{_inside_list_elements_saved} }, $modes->{_inside_list_elements};
  12         35  
119             }
120 102         222 $modes->{_inside_list_elements} = 1;
121              
122 102         276 my object $list_element0 = $self->{children}->[0];
123 102         174 my object $list_elements_star = $self->{children}->[1];
124              
125 102         2030 my string_hashref $cpp_source_subgroup = $list_element0->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
126 102         2104 RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
127              
128 102         195 foreach my object $list_element ( @{ $list_elements_star->{children} } ) {
  102         393  
129              
130             # RPerl::diag( 'in Array::ListElements->ast_to_cpp__generate__CPPOPS_CPPTYPES(), top of foreach() loop, have $list_element = ' . "\n" . RPerl::Parser::rperl_ast__dump($list_element) . "\n" );
131 212 100       511 if ( ref $list_element eq 'TERMINAL' ) {
132 106 50       338 if ( $list_element->{attr} ne q{,} ) {
133             die RPerl::Parser::rperl_rule__replace( q{ERROR ECOGEASRP00, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: Grammar rule '}
134             . $list_element->{attr}
135 0         0 . q{' found where OP21_LIST_COMMA ',' expected, dying} )
136             . "\n";
137             }
138              
139             # OP21_LIST_COMMA
140 106 100 66     600 if ( ( exists $modes->{_inside_print_operator} ) and ( defined $modes->{_inside_print_operator} ) and $modes->{_inside_print_operator} ) { # or
      66        
141              
142             # ((exists $modes->{_inside_die_operator}) and (defined $modes->{_inside_die_operator}) and $modes->{_inside_die_operator})) { # DEV NOTE, CORRELATION #rp102b
143             # replace comma with << when inside print operator
144 85         171 $cpp_source_group->{CPP} .= ' << ';
145             }
146             else {
147             # keep comma when not inside print operator
148 21         50 $cpp_source_group->{CPP} .= $list_element->{attr} . q{ };
149             }
150             }
151             else {
152 106         2129 my string_hashref $cpp_source_subgroup = $list_element->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
153 106         2105 RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
154             }
155             }
156              
157             # restore from stack of saved flags, when needed
158 102         223 delete $modes->{_inside_list_elements};
159 102 50 66     460 if ( ( exists $modes->{_inside_list_elements_saved} )
      100        
160             and ( defined $modes->{_inside_list_elements_saved} )
161             and ( scalar $modes->{_inside_list_elements_saved} ) )
162             {
163 23         47 $modes->{_inside_list_elements} = pop @{ $modes->{_inside_list_elements_saved} };
  23         61  
164 23 50       57 if ( not scalar $modes->{_inside_list_elements_saved} ) { delete $modes->{_inside_list_elements_saved}; }
  0         0  
165             }
166 102         543 return $cpp_source_group;
167             }
168              
169             1; # end of class