File Coverage

blib/lib/RPerl/CodeBlock/Subroutine/Arguments.pm
Criterion Covered Total %
statement 80 85 94.1
branch n/a
condition n/a
subroutine 8 9 88.8
pod n/a
total 88 94 93.6


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::CodeBlock::Subroutine::Arguments;
3 3     3   953 use strict;
  3         5  
  3         72  
4 3     3   13 use warnings;
  3         6  
  3         62  
5 3     3   13 use RPerl::AfterSubclass;
  3         6  
  3         370  
6             our $VERSION = 0.006_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 3     3   19 use parent qw(RPerl::GrammarRule);
  3         5  
  3         17  
10 3     3   173 use RPerl::GrammarRule;
  3         8  
  3         75  
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 3     3   19 use Storable qw(dclone);
  3         7  
  3         2135  
18              
19             # [[[ OO PROPERTIES ]]]
20             our hashref $properties = {};
21              
22             # [[[ SUBROUTINES & OO METHODS ]]]
23              
24             sub ast_to_rperl__generate {
25 98     98   255 { my string_hashref::method $RETURN_TYPE };
  98         215  
26 98         400 ( my object $self, my string_hashref $modes) = @ARG;
27 98         410 my string_hashref $rperl_source_group = { PMC => q{} };
28 98         291 my string_hashref $rperl_source_subgroup;
29              
30             # RPerl::diag( 'in Subroutine::Arguments->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
31              
32 98         435 my string $lparen_my = $self->{children}->[0];
33 98         288 my object $type0 = $self->{children}->[1];
34 98         411 my object $name0 = $self->{children}->[2];
35 98         265 my object $arguments_star = $self->{children}->[3];
36 98         391 my string $rparen = $self->{children}->[4];
37 98         277 my string $equal = $self->{children}->[5];
38 98         334 my string $at_underscore_semicolon = $self->{children}->[6];
39              
40             # CREATE SYMBOL TABLE ENTRY
41 98         800 $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name0} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type0->{children}->[0]};
42              
43 98         441 $rperl_source_group->{PMC} .= $lparen_my . q{ };
44 98         370 $rperl_source_group->{PMC} .= $type0->{children}->[0] . q{ } . $name0;
45              
46             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
47             # NEED FIX: destructive to AST!!!
48 98         552 while ( exists $arguments_star->{children}->[0] ) {
49 22         90 my object $comma = shift @{ $arguments_star->{children} };
  22         52  
50 22         86 my object $my = shift @{ $arguments_star->{children} };
  22         51  
51 22         36 my object $type = shift @{ $arguments_star->{children} };
  22         50  
52 22         40 my object $name = shift @{ $arguments_star->{children} };
  22         49  
53             # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
54              
55             # CREATE SYMBOL TABLE ENTRY
56 22         160 $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type->{children}->[0]};
57              
58 22         258 $rperl_source_group->{PMC} .= $comma->{attr} . q{ } . $my->{attr} . q{ } . $type->{children}->[0] . q{ } . $name->{attr};
59             }
60              
61 98         525 $rperl_source_group->{PMC} .= q{ } . $rparen . q{ } . $equal . q{ } . $at_underscore_semicolon . "\n";
62 98         613 return $rperl_source_group;
63             }
64              
65             sub ast_to_cpp__generate__CPPOPS_PERLTYPES {
66 0     0   0 { my string_hashref::method $RETURN_TYPE };
  0         0  
67 0         0 ( my object $self, my string_hashref $modes) = @ARG;
68 0         0 my string_hashref $cpp_source_group = { CPP => q{// <<< RP::CB::S::A __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
69              
70             #...
71 0         0 return $cpp_source_group;
72             }
73              
74             sub ast_to_cpp__generate__CPPOPS_CPPTYPES {
75 9     9   16 { my string_hashref::method $RETURN_TYPE };
  9         14  
76 9         17 ( my object $self, my string_hashref $modes) = @ARG;
77 9         24 my string_hashref $cpp_source_group = { CPP => q{} };
78 9         13 my string_hashref $cpp_source_subgroup;
79              
80             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
81              
82 9         37 my object $type0 = $self->{children}->[1]->{children}->[0]; # unwrap $type0 to allow type_convert_perl_to_cpp()
83 9         14 my string $name0 = $self->{children}->[2];
84 9         19 my object $arguments_star = $self->{children}->[3];
85              
86 9         17 substr $name0, 0, 1, q{}; # remove leading $ sigil
87              
88             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $type0 = ' . "\n" . RPerl::Parser::rperl_ast__dump($type0) . "\n" );
89             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $name0 = ' . "\n" . RPerl::Parser::rperl_ast__dump($name0) . "\n" );
90             # RPerl::diag( 'in Subroutine::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $arguments_star = ' . "\n" . RPerl::Parser::rperl_ast__dump($arguments_star) . "\n" );
91              
92             # CREATE SYMBOL TABLE ENTRY
93 9         150 $type0 = RPerl::Generator::type_convert_perl_to_cpp($type0, 1); # $pointerify_classes = 1
94             # add converted C++ type to symtab entry
95 9         48 $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name0} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type0};
96              
97 9         18 my string_arrayref $arguments = [];
98 9         14 push @{$arguments}, ( $type0 . q{ } . $name0 );
  9         25  
99              
100             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
101 9         503 my object $arguments_star_dclone = dclone($arguments_star);
102 9         36 while ( exists $arguments_star_dclone->{children}->[0] ) {
103 12         14 shift @{ $arguments_star_dclone->{children} }; # discard $comma
  12         25  
104 12         26 shift @{ $arguments_star_dclone->{children} }; # discard $my
  12         21  
105 12         20 my object $type = shift @{ $arguments_star_dclone->{children} };
  12         19  
106 12         21 $type = $type->{children}->[0]; # unwrap $type to allow type_convert_perl_to_cpp()
107 12         20 my object $name = shift @{ $arguments_star_dclone->{children} };
  12         21  
108 12         18 $name = $name->{attr}; # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
109 12         26 substr $name, 0, 1, q{}; # remove leading $ sigil
110             # RPerl::diag( 'in Subroutine->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $name = ' . "\n" . RPerl::Parser::rperl_ast__dump($name) . "\n" );
111              
112             # CREATE SYMBOL TABLE ENTRY
113 12         225 $type = RPerl::Generator::type_convert_perl_to_cpp($type, 1); # $pointerify_classes = 1
114             # add converted C++ type to symtab entry
115 12         50 $modes->{_symbol_table}->{$modes->{_symbol_table}->{_namespace}}->{$modes->{_symbol_table}->{_subroutine}}->{$name} = {isa => 'RPerl::CodeBlock::Subroutine::Arguments', type => $type};
116              
117 12         22 push @{$arguments}, ( $type . q{ } . $name );
  12         41  
118             }
119 9         16 $cpp_source_group->{CPP} .= join ', ', @{$arguments};
  9         29  
120 9         64 return $cpp_source_group;
121             }
122              
123             1; # end of class