File Coverage

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