File Coverage

blib/lib/RPerl/CodeBlock/Subroutine/Arguments.pm
Criterion Covered Total %
statement 18 18 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 24 24 100.0


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::CodeBlock::Subroutine::Arguments;
3 4     4   1727 use strict;
  4         10  
  4         107  
4 4     4   19 use warnings;
  4         9  
  4         100  
5 4     4   22 use RPerl::AfterSubclass;
  4         10  
  4         567  
6             our $VERSION = 0.004_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 4     4   31 use parent qw(RPerl::GrammarRule);
  4         11  
  4         31  
10 4     4   275 use RPerl::GrammarRule;
  4         14  
  4         105  
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             # [[[ INCLUDES ]]]
17 4     4   24 use Storable qw(dclone);
  4         9  
  4         2667  
18              
19             # [[[ OO PROPERTIES ]]]
20             our hashref $properties = {};
21              
22             # [[[ SUBROUTINES & OO METHODS ]]]
23              
24             our string_hashref::method $ast_to_rperl__generate = sub {
25             ( my object $self, my string_hashref $modes) = @_;
26             my string_hashref $rperl_source_group = { PMC => q{} };
27             my string_hashref $rperl_source_subgroup;
28              
29             # RPerl::diag( 'in Subroutine::Arguments->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
30              
31             my string $lparen_my = $self->{children}->[0];
32             my object $type0 = $self->{children}->[1];
33             my object $name0 = $self->{children}->[2];
34             my object $arguments_star = $self->{children}->[3];
35             my string $rparen = $self->{children}->[4];
36             my string $equal = $self->{children}->[5];
37             my string $at_underscore_semicolon = $self->{children}->[6];
38              
39             # CREATE SYMBOL TABLE ENTRY
40             $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name0} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type0->{children}->[0]};
41              
42             $rperl_source_group->{PMC} .= $lparen_my . q{ };
43             $rperl_source_group->{PMC} .= $type0->{children}->[0] . q{ } . $name0;
44              
45             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
46             # NEED FIX: destructive to AST!!!
47             while ( exists $arguments_star->{children}->[0] ) {
48             my object $comma = shift @{ $arguments_star->{children} };
49             my object $my = shift @{ $arguments_star->{children} };
50             my object $type = shift @{ $arguments_star->{children} };
51             my object $name = shift @{ $arguments_star->{children} };
52             # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
53              
54             # CREATE SYMBOL TABLE ENTRY
55             $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type->{children}->[0]};
56              
57             $rperl_source_group->{PMC} .= $comma->{attr} . q{ } . $my->{attr} . q{ } . $type->{children}->[0] . q{ } . $name->{attr};
58             }
59              
60             $rperl_source_group->{PMC} .= q{ } . $rparen . q{ } . $equal . q{ } . $at_underscore_semicolon . "\n";
61             return $rperl_source_group;
62             };
63              
64             our string_hashref::method $ast_to_cpp__generate__CPPOPS_PERLTYPES = sub {
65             ( my object $self, my string_hashref $modes) = @_;
66             my string_hashref $cpp_source_group = { CPP => q{// <<< RP::CB::S::A __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
67              
68             #...
69             return $cpp_source_group;
70             };
71              
72             our string_hashref::method $ast_to_cpp__generate__CPPOPS_CPPTYPES = sub {
73             ( my object $self, my string_hashref $modes) = @_;
74             my string_hashref $cpp_source_group = { CPP => q{} };
75             my string_hashref $cpp_source_subgroup;
76              
77             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
78              
79             my object $type0 = $self->{children}->[1];
80             my string $name0 = $self->{children}->[2];
81             my object $arguments_star = $self->{children}->[3];
82              
83             substr $name0, 0, 1, q{}; # remove leading $ sigil
84              
85             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $type0 = ' . "\n" . RPerl::Parser::rperl_ast__dump($type0) . "\n" );
86             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $name0 = ' . "\n" . RPerl::Parser::rperl_ast__dump($name0) . "\n" );
87             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $arguments_star = ' . "\n" . RPerl::Parser::rperl_ast__dump($arguments_star) . "\n" );
88              
89             # CREATE SYMBOL TABLE ENTRY
90             $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name0} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type0->{children}->[0]};
91              
92             my string_arrayref $arguments = [];
93             push @{$arguments}, ( $type0->{children}->[0] . q{ } . $name0 );
94              
95             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
96             my object $arguments_star_dclone = dclone($arguments_star);
97             while ( exists $arguments_star_dclone->{children}->[0] ) {
98             shift @{ $arguments_star_dclone->{children} }; # discard $comma
99             shift @{ $arguments_star_dclone->{children} }; # discard $my
100             my object $type = shift @{ $arguments_star_dclone->{children} };
101             my object $name = shift @{ $arguments_star_dclone->{children} };
102             $name = $name->{attr}; # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
103             substr $name, 0, 1, q{}; # remove leading $ sigil
104             # RPerl::diag( 'in Subroutine->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $name = ' . "\n" . RPerl::Parser::rperl_ast__dump($name) . "\n" );
105              
106             # CREATE SYMBOL TABLE ENTRY
107             $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type->{children}->[0]};
108              
109             $type->{children}->[0] =~ s/^constant_/const\ /gxms; # 'constant_foo' becomes 'const foo'
110             $type->{children}->[0] =~ s/::/__/gxms; # 'Class::Subclass' becomes 'Class__Subclass'
111             push @{$arguments}, ( $type->{children}->[0] . q{ } . $name );
112             }
113             $cpp_source_group->{CPP} .= join ', ', @{$arguments};
114             return $cpp_source_group;
115             };
116              
117             1; # end of class