File Coverage

blib/lib/RPerl/CodeBlock/Subroutine/Method/Arguments.pm
Criterion Covered Total %
statement 74 79 93.6
branch n/a
condition n/a
subroutine 8 9 88.8
pod n/a
total 82 88 93.1


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::CodeBlock::Subroutine::Method::Arguments;
3 3     3   18 use strict;
  3         5  
  3         72  
4 3     3   13 use warnings;
  3         6  
  3         60  
5 3     3   13 use RPerl::AfterSubclass;
  3         8  
  3         490  
6             our $VERSION = 0.005_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 3     3   23 use parent qw(RPerl::CodeBlock::Subroutine::Arguments);
  3         8  
  3         18  
10 3     3   123 use RPerl::CodeBlock::Subroutine::Arguments;
  3         5  
  3         81  
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   18 use Storable qw(dclone);
  3         8  
  3         2054  
18              
19             # [[[ OO PROPERTIES ]]]
20             our hashref $properties = {};
21              
22             # [[[ SUBROUTINES & OO METHODS ]]]
23              
24             sub ast_to_rperl__generate {
25 39     39   91 { my string_hashref::method $RETURN_TYPE };
  39         78  
26 39         142 ( my object $self, my string_hashref $modes) = @ARG;
27 39         140 my string_hashref $rperl_source_group = { PMC => q{} };
28 39         99 my string_hashref $rperl_source_subgroup;
29              
30             # RPerl::diag( 'in Method::Arguments->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
31              
32             # MethodArguments -> LPAREN_MY Type SELF (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)* ')' OP19_VARIABLE_ASSIGN '@_;'
33 39         140 my string $lparen_my = $self->{children}->[0];
34 39         100 my object $self_type = $self->{children}->[1];
35 39         133 my string $self_symbol = $self->{children}->[2];
36 39         119 my object $arguments_star = $self->{children}->[3];
37 39         107 my string $rparen = $self->{children}->[4];
38 39         104 my string $equal = $self->{children}->[5];
39 39         117 my string $at_underscore_semicolon = $self->{children}->[6];
40              
41             # CREATE SYMBOL TABLE ENTRY
42             # discard trailing '::' to go from namespace to class-name-as-type
43             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{this} = {
44             isa => 'RPerl::CodeBlock::Subroutine::Arguments',
45 39         326 type => ( substr $modes->{_symbol_table}->{_namespace}, 0, ( ( length $modes->{_symbol_table}->{_namespace} ) - 2 ) )
46             };
47              
48 39         193 $rperl_source_group->{PMC} .= $lparen_my . q{ } . $self_type->{children}->[0] . q{ } . $self_symbol;
49              
50             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
51 39         2748 my object $arguments_star_dclone = dclone($arguments_star);
52 39         223 while ( exists $arguments_star_dclone->{children}->[0] ) {
53 14         26 my object $comma = shift @{ $arguments_star_dclone->{children} };
  14         34  
54 14         22 my object $my = shift @{ $arguments_star_dclone->{children} };
  14         25  
55 14         23 my object $type = shift @{ $arguments_star_dclone->{children} };
  14         40  
56 14         23 my object $name = shift @{ $arguments_star_dclone->{children} };
  14         29  
57              
58             # CREATE SYMBOL TABLE ENTRY
59             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{ $name }
60 14         65 = { isa => 'RPerl::CodeBlock::Subroutine::Method::Arguments', type => $type->{children}->[0] };
61              
62             # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
63 14         92 $rperl_source_group->{PMC} .= $comma->{attr} . q{ } . $my->{attr} . q{ } . $type->{children}->[0] . q{ } . $name->{attr};
64             }
65              
66 39         176 $rperl_source_group->{PMC} .= q{ } . $rparen . q{ } . $equal . q{ } . $at_underscore_semicolon . "\n";
67 39         254 return $rperl_source_group;
68             }
69              
70             sub ast_to_cpp__generate__CPPOPS_PERLTYPES {
71 0     0   0 { my string_hashref::method $RETURN_TYPE };
  0         0  
72 0         0 ( my object $self, my string_hashref $modes) = @ARG;
73 0         0 my string_hashref $cpp_source_group = { CPP => q{// <<< RP::CB::S::M::A __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
74              
75             #...
76 0         0 return $cpp_source_group;
77             }
78              
79             sub ast_to_cpp__generate__CPPOPS_CPPTYPES {
80 56     56   115 { my string_hashref::method $RETURN_TYPE };
  56         92  
81 56         128 ( my object $self, my string_hashref $modes) = @ARG;
82 56         150 my string_hashref $cpp_source_group = { CPP => q{} };
83 56         92 my string_hashref $cpp_source_subgroup;
84              
85             # RPerl::diag( 'in Method::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
86              
87 56         133 my object $arguments_star = $self->{children}->[3];
88              
89             # CREATE SYMBOL TABLE ENTRY
90             # discard trailing '::' to go from namespace to class-name-as-type
91             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{this} = {
92             isa => 'RPerl::CodeBlock::Subroutine::Arguments',
93 56         438 type => ( substr $modes->{_symbol_table}->{_namespace}, 0, ( ( length $modes->{_symbol_table}->{_namespace} ) - 2 ) )
94             };
95              
96 56         133 my string_arrayref $arguments = [];
97              
98             #RPerl::diag( 'in Method::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $arguments_star = ' . "\n" . RPerl::Parser::rperl_ast__dump($arguments_star) . "\n" );
99              
100             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
101 56         3096 my object $arguments_star_dclone = dclone($arguments_star);
102 56         240 while ( exists $arguments_star_dclone->{children}->[0] ) {
103 10         14 shift @{ $arguments_star_dclone->{children} }; # discard $comma
  10         16  
104 10         21 shift @{ $arguments_star_dclone->{children} }; # discard $my
  10         18  
105 10         16 my object $type = shift @{ $arguments_star_dclone->{children} };
  10         16  
106 10         18 $type = $type->{children}->[0]; # unwrap $type to allow type_convert_perl_to_cpp()
107 10         19 my string $name = shift @{ $arguments_star_dclone->{children} };
  10         17  
108 10         17 $name = $name->{attr}; # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
109 10         23 substr $name, 0, 1, q{}; # remove leading $ sigil
110              
111             # CREATE SYMBOL TABLE ENTRY
112 10         185 $type = RPerl::Generator::type_convert_perl_to_cpp($type, 1); # $pointerify_classes = 1
113             # add converted C++ type to symtab entry
114 10         39 $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{ $name }
115             = { isa => 'RPerl::CodeBlock::Subroutine::Method::Arguments', type => $type };
116              
117 10         17 push @{$arguments}, ( $type . q{ } . $name );
  10         30  
118             }
119 56         124 $cpp_source_group->{CPP} .= join ', ', @{$arguments};
  56         239  
120 56         337 return $cpp_source_group;
121             }
122              
123             1; # end of class