File Coverage

blib/lib/RPerl/Operation/Statement/VariableModification.pm
Criterion Covered Total %
statement 15 15 100.0
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 20 20 100.0


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::Operation::Statement::VariableModification;
3 4     4   26 use strict;
  4         9  
  4         118  
4 4     4   22 use warnings;
  4         9  
  4         107  
5 4     4   21 use RPerl::AfterSubclass;
  4         8  
  4         518  
6             our $VERSION = 0.003_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 4     4   29 use parent qw(RPerl::Operation::Statement);
  4         11  
  4         26  
10 4     4   236 use RPerl::Operation::Statement;
  4         15  
  4         4877  
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             our string_hashref::method $ast_to_rperl__generate = sub {
22             ( my object $self, my string_hashref $modes) = @_;
23             my string_hashref $rperl_source_group = { PMC => q{} };
24             my string_hashref $rperl_source_subgroup;
25             my string $self_class = ref $self;
26              
27             # RPerl::diag( 'in VariableModification->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
28              
29             # yes semicolon for Statement_156, no semicolon for SubExpressionOrVarMod_148, VariableModification_185, and VariableModification_186
30             my string $semicolon = q{};
31              
32             if ( $self_class eq 'SubExpressionOrVarMod_148' ) { # SubExpressionOrVarMod -> VariableModification
33             # unwrap VariableModification_185 and VariableModification_186 from SubExpressionOrVarMod_148
34             $self = $self->{children}->[0];
35             $self_class = ref $self;
36             }
37             elsif ( $self_class eq 'Statement_156' ) { # Statement -> VariableModification ';'
38             # unwrap VariableModification_185 and VariableModification_186 from Statement_156; grab semicolon
39             $semicolon = $self->{children}->[1];
40             $self = $self->{children}->[0];
41             $self_class = ref $self;
42             }
43              
44             if ( $self_class eq 'VariableModification_185' ) { # VariableModification -> Variable OP19_VARIABLE_ASSIGN SubExpressionOrInput
45             my object $variable = $self->{children}->[0];
46             my string $assign = $self->{children}->[1];
47             my object $subexpression_or_stdin = $self->{children}->[2];
48              
49             $rperl_source_subgroup = $variable->ast_to_rperl__generate($modes);
50             RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
51             $rperl_source_group->{PMC} .= q{ } . $assign . q{ };
52             $rperl_source_subgroup = $subexpression_or_stdin->ast_to_rperl__generate($modes);
53             RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
54             }
55             elsif ( $self_class eq 'VariableModification_186' ) { # VariableModification -> Variable OP19_VARIABLE_ASSIGN_BY SubExpression
56             my object $variable = $self->{children}->[0];
57             my string $assign_by = $self->{children}->[1];
58             my object $subexpression = $self->{children}->[2];
59              
60             $rperl_source_subgroup = $variable->ast_to_rperl__generate($modes);
61             RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
62             $rperl_source_group->{PMC} .= q{ } . $assign_by . q{ };
63             $rperl_source_subgroup = $subexpression->ast_to_rperl__generate($modes);
64             RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
65             }
66             else {
67             die RPerl::Parser::rperl_rule__replace( 'ERROR ECOGEASRP00, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: Grammar rule '
68             . $self_class
69             . ' found where SubExpressionOrVarMod_148, Statement_156, VariableModification_185, or VariableModification_186 expected, dying' )
70             . "\n";
71             }
72              
73             $rperl_source_group->{PMC} .= $semicolon . "\n";
74              
75             # RPerl::diag( 'in VariableModification->ast_to_rperl__generate(), returning $rperl_source_group = ' . "\n" . RPerl::Parser::rperl_ast__dump($rperl_source_group) . "\n" );
76             return $rperl_source_group;
77             };
78              
79             our string_hashref::method $ast_to_cpp__generate__CPPOPS_PERLTYPES = sub {
80             ( my object $self, my string_hashref $modes) = @_;
81             my string_hashref $cpp_source_group = { CPP => q{// <<< RP::O::S::VM __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
82              
83             #...
84             return $cpp_source_group;
85             };
86              
87             our string_hashref::method $ast_to_cpp__generate__CPPOPS_CPPTYPES = sub {
88             ( my object $self, my string_hashref $modes) = @_;
89             my string_hashref $cpp_source_group = { CPP => q{} };
90             my string_hashref $cpp_source_subgroup;
91             my string $self_class = ref $self;
92              
93             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
94              
95             # yes semicolon for Statement_156, no semicolon for SubExpressionOrVarMod_148, VariableModification_185, and VariableModification_186
96             my string $semicolon = undef;
97              
98             if ( $self_class eq 'SubExpressionOrVarMod_148' ) { # SubExpressionOrVarMod -> VariableModification
99             # unwrap VariableModification_185 and VariableModification_186 from SubExpressionOrVarMod_148
100             $self = $self->{children}->[0];
101             $self_class = ref $self;
102             }
103             elsif ( $self_class eq 'Statement_156' ) { # Statement -> VariableModification ';'
104             # unwrap VariableModification_185 and VariableModification_186 from Statement_156; grab semicolon
105             $semicolon = $self->{children}->[1];
106             $self = $self->{children}->[0];
107             $self_class = ref $self;
108             }
109              
110             if ( $self_class eq 'VariableModification_185' ) { # VariableModification -> Variable OP19_VARIABLE_ASSIGN SubExpressionOrInput
111             my object $variable = $self->{children}->[0];
112             my string $assign = $self->{children}->[1];
113             my object $subexpression_or_stdin = $self->{children}->[2];
114             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $variable = ' . "\n" . RPerl::Parser::rperl_ast__dump($variable) . "\n" );
115             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $subexpression_or_stdin = ' . "\n" . RPerl::Parser::rperl_ast__dump($subexpression_or_stdin) . "\n" );
116              
117             # detect array resize semantics: Perl '$a->[$i - 1] = undef;' becomes C++ 'a.resize(i);'
118             my boolean $rhs_is_undef = 0;
119             my boolean $lhs_is_array_retrieval_minus_one = 0;
120             # SubExpression_136 ISA RPerl::Operation::Expression::SubExpression::Literal::Undefined AKA undef
121             if (
122             ((ref $subexpression_or_stdin) eq 'SubExpressionOrInput_144') and
123             (exists $subexpression_or_stdin->{children}) and
124             (defined $subexpression_or_stdin->{children}) and
125             (defined $subexpression_or_stdin->{children}->[0]) and
126             ((ref $subexpression_or_stdin->{children}->[0]) eq 'SubExpression_136')
127             ) {
128             $rhs_is_undef = 1;
129             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $rhs_is_undef = ' . $rhs_is_undef . "\n" );
130             }
131            
132             if (
133             $rhs_is_undef and
134             ((ref $variable) eq 'Variable_177') and # Variable -> VariableSymbolOrSelf STAR-44
135             (exists $variable->{children}) and
136             (defined $variable->{children}) and
137             (defined $variable->{children}->[1]) and
138             ((ref $variable->{children}->[1]) eq '_STAR_LIST') and
139             (exists $variable->{children}->[1]->{children}) and
140             (defined $variable->{children}->[1]->{children}) and
141             (defined $variable->{children}->[1]->{children}->[-1]) and
142             ((ref $variable->{children}->[1]->{children}->[-1]) eq 'VariableRetrieval_178') and # VariableRetrieval -> OP02_ARRAY_THINARROW SubExpression ']'
143             (exists $variable->{children}->[1]->{children}->[-1]->{children}) and
144             (defined $variable->{children}->[1]->{children}->[-1]->{children}) and
145             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]) and
146             ((ref $variable->{children}->[1]->{children}->[-1]->{children}->[1]) eq 'SubExpression_135') and # SubExpression -> Expression
147             (exists $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}) and
148             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}) and
149             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]) and
150             ((ref $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]) eq 'Expression_129') and # Expression -> Operator
151             (exists $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}) and
152             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}) and
153             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]) and
154             ((ref $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]) eq 'Operator_96') and # Operator -> SubExpression OP08_MATH_ADD_SUB SubExpression
155             (exists $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}) and
156             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}) and
157             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[1]) and
158             ( $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[1] eq '- ') and # subtraction
159             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]) and
160             ((ref $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]) eq 'SubExpression_137') and # SubExpression -> Literal
161             (exists $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}) and
162             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}) and
163             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]) and
164             ((ref $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]) eq 'Literal_234') and # Literal -> LITERAL_NUMBER
165             (exists $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]->{children}) and
166             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]->{children}) and
167             (defined $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]->{children}->[0]) and
168             ( $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[2]->{children}->[0]->{children}->[0] eq '1') # literal number 1
169             ) {
170             $lhs_is_array_retrieval_minus_one = 1;
171             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $lhs_is_array_retrieval_minus_one = ' . $lhs_is_array_retrieval_minus_one . "\n" );
172             }
173              
174             # array resize semantics detected
175             if ($rhs_is_undef and $lhs_is_array_retrieval_minus_one) {
176             my unknown $size = $variable->{children}->[1]->{children}->[-1]->{children}->[1]->{children}->[0]->{children}->[0]->{children}->[0];
177             delete $variable->{children}->[1]->{children}->[-1]; # do not generate the final variable retrieval containing the size: ->[size - 1]
178             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have modified $variable = ' . "\n" . RPerl::Parser::rperl_ast__dump($variable) . "\n" );
179             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $size = ' . "\n" . RPerl::Parser::rperl_ast__dump($size) . "\n" );
180              
181             $cpp_source_subgroup = $variable->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
182             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
183             $cpp_source_group->{CPP} .= '.resize(';
184             $cpp_source_subgroup = $size->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
185             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
186             $cpp_source_group->{CPP} .= ')';
187             }
188             else { # normal generate
189             $cpp_source_subgroup = $variable->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
190             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
191             $cpp_source_group->{CPP} .= q{ } . $assign . q{ };
192             $cpp_source_subgroup = $subexpression_or_stdin->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
193             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
194             }
195             }
196             elsif ( $self_class eq 'VariableModification_186' ) { # VariableModification -> Variable OP19_VARIABLE_ASSIGN_BY SubExpression
197             my object $variable = $self->{children}->[0];
198             my string $assign_by = $self->{children}->[1];
199             my object $subexpression = $self->{children}->[2];
200              
201             $cpp_source_subgroup = $variable->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
202             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
203             $cpp_source_group->{CPP} .= q{ } . $assign_by . q{ };
204             $cpp_source_subgroup = $subexpression->ast_to_cpp__generate__CPPOPS_CPPTYPES($modes);
205             RPerl::Generator::source_group_append( $cpp_source_group, $cpp_source_subgroup );
206             }
207             else {
208             die RPerl::Parser::rperl_rule__replace( 'ERROR ECOGEASRP00, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: Grammar rule '
209             . $self_class
210             . ' found where SubExpressionOrVarMod_148, Statement_156, VariableModification_185, or VariableModification_186 expected, dying' )
211             . "\n";
212             }
213              
214             if (defined $semicolon) {
215             $cpp_source_group->{CPP} .= $semicolon . "\n";
216             }
217              
218             # RPerl::diag( 'in VariableModification->ast_to_cpp__generate__CPPOPS_CPPTYPES(), returning $cpp_source_group = ' . "\n" . RPerl::Parser::rperl_ast__dump($cpp_source_group) . "\n" );
219             return $cpp_source_group;
220             };
221              
222             1; # end of class