File Coverage

blib/lib/RPerl/CompileUnit/Module/Header.pm
Criterion Covered Total %
statement 86 97 88.6
branch 13 20 65.0
condition 9 18 50.0
subroutine 8 9 88.8
pod n/a
total 116 144 80.5


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::CompileUnit::Module::Header;
3 3     3   18 use strict;
  3         7  
  3         86  
4 3     3   15 use warnings;
  3         8  
  3         84  
5 3     3   16 use RPerl::AfterSubclass;
  3         6  
  3         476  
6             our $VERSION = 0.005_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 3     3   20 use parent qw(RPerl::GrammarRule);
  3         5  
  3         20  
10 3     3   172 use RPerl::GrammarRule;
  3         6  
  3         2252  
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 ast_to_rperl__generate {
22 209     209   710 { my string_hashref::method $RETURN_TYPE };
  209         673  
23 209         803 ( my object $self, my string_hashref $modes) = @ARG;
24 209         698 my string_hashref $rperl_source_group = {};
25              
26             # RPerl::diag('in Header->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n");
27             # RPerl::diag('in Header->ast_to_rperl__generate(), received $modes = ' . "\n" . Dumper($modes) . "\n");
28             # die 'tmp debug';
29              
30             # my $class = ref $self;
31             # RPerl::diag('in Header->ast_to_rperl__generate(), have symtab entries for ' . $class . "\n" . RPerl::analyze_class_symtab_entries($class) . "\n");
32              
33             # ModuleHeader -> Critic? USE_RPERL? 'package' WordScoped ';' Header
34 209         1404 my object $critic_optional = $self->{children}->[0];
35 209         811 my string $use_rperl_optional = $self->{children}->[1]; # PERLOPS only
36 209         612 my string $package_keyword = $self->{children}->[2]; # PERLOPS only
37 209         785 my object $package_name = $self->{children}->[3]->{children}->[0];
38 209         832 my string $package_semicolon = $self->{children}->[4]; # PERLOPS only
39              
40             # Header -> 'use strict;' 'use warnings;' USE_RPERL_AFTER? 'our' VERSION_NUMBER_ASSIGN;
41 209         817 my string $use_strict = $self->{children}->[5]->{children}->[0]; # PERLOPS only
42 209         991 my string $use_warnings = $self->{children}->[5]->{children}->[1]; # PERLOPS only
43 209         740 my string $use_rperl_after_optional = $self->{children}->[5]->{children}->[2]; # PERLOPS only
44 209         911 my string $our_keyword = $self->{children}->[5]->{children}->[3]; # PERLOPS only
45 209         815 my string $version_number = $self->{children}->[5]->{children}->[4];
46              
47             # CREATE SYMBOL TABLE ENTRY
48 209 50       1493 if ((substr $package_name, 0, 1) eq '_') {
49 0         0 die 'ERROR ECOGEASRP07, CODE GENERATOR, ABSTRACT SYNTAX TO RPERL: package name ' . ($package_name)
50             . ' must not start with underscore, dying' . "\n";
51             }
52 209         1373 $modes->{_symbol_table}->{_namespace} = $package_name . '::'; # set current namespace
53            
54             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__PERLOPS_PERLTYPES(), have $modes->{_symbol_table} = ' . "\n" . Dumper($modes->{_symbol_table}) . "\n" );
55              
56 209         1205 $rperl_source_group->{PMC} = q{};
57 209 100 66     1576 if ( ( exists $critic_optional->{children}->[0] ) and ( defined $critic_optional->{children}->[0] ) ) {
58 2         57 my string_hashref $rperl_source_subgroup = $critic_optional->{children}->[0]->ast_to_rperl__generate($modes);
59 2         66 RPerl::Generator::source_group_append( $rperl_source_group, $rperl_source_subgroup );
60             }
61 209 50       1252 if ( $modes->{label} eq 'ON' ) {
62 0         0 $rperl_source_group->{PMC} .= '# [[[ HEADER ]]]' . "\n";
63             }
64 209 100 66     2507 if ( ( exists $use_rperl_optional->{children}->[0] ) and ( defined $use_rperl_optional->{children}->[0] ) ) {
65 187         1278 $rperl_source_group->{PMC} .= $use_rperl_optional->{children}->[0]->{attr} . "\n";
66             }
67 209         1074 $rperl_source_group->{PMC} .= $package_keyword . ' ' . $package_name . $package_semicolon . "\n";
68 209         779 $rperl_source_group->{PMC} .= $use_strict . "\n";
69 209         1095 $rperl_source_group->{PMC} .= $use_warnings . "\n";
70 209 100 66     1112 if ( ( exists $use_rperl_after_optional->{children}->[0] ) and ( defined $use_rperl_after_optional->{children}->[0] ) ) {
71 19         98 chomp $use_rperl_after_optional->{children}->[0]->{attr};
72 19         85 $rperl_source_group->{PMC} .= $use_rperl_after_optional->{children}->[0]->{attr} . "\n";
73             }
74              
75             # DEV NOTE, CORRELATION #rp014: the hard-coded ' $VERSION = ' & ';' below are the only discarded tokens in the RPerl grammar,
76             # due to the need to differentiate between v-numbers and otherwise-identical normal numbers
77 209         1130 $rperl_source_group->{PMC} .= $our_keyword . ' $VERSION = ' . $version_number . q{;} . "\n";
78              
79 209         792 my string $package_name_underscores = $package_name;
80 209         1653 $package_name_underscores =~ s/::/__/gxms;
81 209         708 $rperl_source_group->{_package_name} = $package_name;
82 209         619 $rperl_source_group->{_package_name_underscores} = $package_name_underscores;
83 209         1460 return $rperl_source_group;
84             }
85              
86             sub ast_to_cpp__generate__CPPOPS_PERLTYPES {
87 0     0   0 { my string_hashref::method $RETURN_TYPE };
  0         0  
88 0         0 ( my object $self, my string_hashref $modes) = @ARG;
89 0         0 my string_hashref $cpp_source_group = { CPP => q{// <<< RP::CU::M::H __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
90              
91             #...
92 0         0 return $cpp_source_group;
93             }
94              
95             sub ast_to_cpp__generate_begin__CPPOPS_CPPTYPES {
96 23     23   54 { my string_hashref::method $RETURN_TYPE };
  23         59  
97 23         81 ( my object $self, my string_hashref $modes) = @ARG;
98 23         70 my string_hashref $cpp_source_group = {};
99              
100             #RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
101             #RPerl::diag('in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), received $modes = ' . "\n" . Dumper($modes) . "\n");
102             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), received $modes->{_symbol_table} = ' . "\n" . Dumper($modes->{_symbol_table}) . "\n" );
103              
104             #my $class = ref $self;
105             #RPerl::diag('in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have symtab entries for ' . $class . "\n" . RPerl::analyze_class_symtab_entries($class) . "\n");
106              
107             #RPerl::diag('in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $self->{children}->[3]->{children}->[0] = ' . "\n" . Dumper($self->{children}->[3]->{children}->[0]) . "\n");
108              
109              
110 23         122 my object $package_name = $self->{children}->[3]->{children}->[0];
111 23         106 my string $version_number = $self->{children}->[5]->{children}->[4];
112              
113             # CREATE SYMBOL TABLE ENTRY
114 23 50       135 if ((substr $package_name, 0, 1) eq '_') {
115 0         0 die 'ERROR ECOGEASCP07, CODE GENERATOR, ABSTRACT SYNTAX TO C++: package name ' . ($package_name)
116             . ' must not start with underscore, dying' . "\n";
117             }
118 23         116 $modes->{_symbol_table}->{_namespace} = $package_name . '::'; # set current namespace
119            
120             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $modes->{_symbol_table} = ' . "\n" . Dumper($modes->{_symbol_table}) . "\n" );
121              
122 23         113 $cpp_source_group->{H} = q{};
123 23         99 $cpp_source_group->{CPP} = q{};
124              
125 23 50       98 if ( $modes->{label} eq 'ON' ) {
126 0         0 $cpp_source_group->{H} .= '// [[[ HEADER ]]]' . "\n";
127 0         0 $cpp_source_group->{CPP} .= '// [[[ HEADER ]]]' . "\n";
128             }
129              
130             # only include rperlstandalone.h if actually necessary
131 23 50 33     216 if (($modes->{subcompile} ne 'OFF') and ($modes->{subcompile} ne 'DYNAMIC')) {
132 0         0 $cpp_source_group->{CPP} .= '#include <rperlstandalone.h>' . "\n";
133             }
134              
135 23         150 $cpp_source_group->{H} .= 'using std::cout; using std::cerr; using std::endl;' . "\n\n";
136 23         70 $cpp_source_group->{CPP} .= 'using std::cout; using std::cerr; using std::endl;' . "\n\n";
137              
138 23         62 my string $package_name_underscores = $package_name;
139 23         160 $package_name_underscores =~ s/::/__/gxms;
140 23         95 $cpp_source_group->{H} .= '#ifndef __CPP__INCLUDED__' . $package_name_underscores . '_h' . "\n";
141 23         129 $cpp_source_group->{H} .= '#define __CPP__INCLUDED__' . $package_name_underscores . '_h ' . $version_number . "\n\n";
142 23         87 $cpp_source_group->{CPP} .= '#ifndef __CPP__INCLUDED__' . $package_name_underscores . '_cpp' . "\n";
143 23         118 $cpp_source_group->{CPP} .= '#define __CPP__INCLUDED__' . $package_name_underscores . '_cpp ' . $version_number . "\n\n";
144              
145             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $package_name = ' . $package_name . "\n" );
146             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $package_name_underscores = ' . $package_name_underscores . "\n" );
147             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $cpp_source_group->{_package_names} = ' . "\n" . Dumper($cpp_source_group->{_package_names}) . "\n" );
148             # RPerl::diag( 'in Header->ast_to_cpp__generate_begin__CPPOPS_CPPTYPES(), have $cpp_source_group->{_package_names_underscores} = ' . "\n" . Dumper($cpp_source_group->{_package_names_underscores}) . "\n" );
149              
150 23         65 $cpp_source_group->{_package_name} = $package_name;
151 23         61 $cpp_source_group->{_package_name_underscores} = $package_name_underscores;
152 23 50 33     146 if ((not exists $cpp_source_group->{_package_names}) or (not defined $cpp_source_group->{_package_names})) {
153 23         92 $cpp_source_group->{_package_names} = q{};
154             }
155 23         69 $cpp_source_group->{_package_names} .= $package_name . "\n";
156 23 50 33     83 if ((not exists $cpp_source_group->{_package_names_underscores}) or (not defined $cpp_source_group->{_package_names_underscores})) {
157 23         63 $cpp_source_group->{_package_names_underscores} = q{};
158             }
159 23         65 $cpp_source_group->{_package_names_underscores} .= $package_name_underscores . "\n";
160 23         162 return $cpp_source_group;
161             }
162              
163             sub ast_to_cpp__generate_end__CPPOPS_CPPTYPES {
164 23     23   75 { my string_hashref::method $RETURN_TYPE };
  23         73  
165 23         70 ( my object $self, my string_hashref $modes) = @ARG;
166 23         81 my string_hashref $cpp_source_group = {};
167              
168             #RPerl::diag( 'in Header->ast_to_cpp__generate_end__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
169             #RPerl::diag('in Header->ast_to_cpp__generate_end__CPPOPS_CPPTYPES(), received $modes = ' . "\n" . Dumper($modes) . "\n");
170             # RPerl::diag( 'in Header->ast_to_cpp__generate_end__CPPOPS_CPPTYPES(), received $modes->{_symbol_table} = ' . "\n" . Dumper($modes->{_symbol_table}) . "\n" );
171              
172 23         88 $cpp_source_group->{H} = '#endif' . "\n";
173 23         68 $cpp_source_group->{CPP} = '#endif' . "\n";
174 23         104 return $cpp_source_group;
175             }
176              
177             1; # end of class