File Coverage

blib/lib/RPerl/CodeBlock/Subroutine/Method/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::Method::Arguments;
3 4     4   26 use strict;
  4         10  
  4         115  
4 4     4   21 use warnings;
  4         8  
  4         102  
5 4     4   21 use RPerl::AfterSubclass;
  4         12  
  4         638  
6             our $VERSION = 0.004_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 4     4   32 use parent qw(RPerl::CodeBlock::Subroutine::Arguments);
  4         11  
  4         25  
10 4     4   172 use RPerl::CodeBlock::Subroutine::Arguments;
  4         10  
  4         100  
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   20 use Storable qw(dclone);
  4         11  
  4         2428  
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 Method::Arguments->ast_to_rperl__generate(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
30              
31             # MethodArguments -> LPAREN_MY Type SELF (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)* ')' OP19_VARIABLE_ASSIGN '@_;'
32             my string $lparen_my = $self->{children}->[0];
33             my object $self_type = $self->{children}->[1];
34             my string $self_symbol = $self->{children}->[2];
35             my object $arguments_star = $self->{children}->[3];
36             my string $rparen = $self->{children}->[4];
37             my string $equal = $self->{children}->[5];
38             my string $at_underscore_semicolon = $self->{children}->[6];
39              
40             # CREATE SYMBOL TABLE ENTRY
41             # discard trailing '::' to go from namespace to class-name-as-type
42             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{this} = {
43             isa => 'RPerl::CodeBlock::Subroutine::Arguments',
44             type => ( substr $modes->{_symbol_table}->{_namespace}, 0, ( ( length $modes->{_symbol_table}->{_namespace} ) - 2 ) )
45             };
46              
47             $rperl_source_group->{PMC} .= $lparen_my . q{ } . $self_type->{children}->[0] . q{ } . $self_symbol;
48              
49             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
50             my object $arguments_star_dclone = dclone($arguments_star);
51             while ( exists $arguments_star_dclone->{children}->[0] ) {
52             my object $comma = shift @{ $arguments_star_dclone->{children} };
53             my object $my = shift @{ $arguments_star_dclone->{children} };
54             my object $type = shift @{ $arguments_star_dclone->{children} };
55             my object $name = shift @{ $arguments_star_dclone->{children} };
56              
57             # CREATE SYMBOL TABLE ENTRY
58             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{ $name }
59             = { isa => 'RPerl::CodeBlock::Subroutine::Method::Arguments', type => $type->{children}->[0] };
60              
61             # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
62             $rperl_source_group->{PMC} .= $comma->{attr} . q{ } . $my->{attr} . q{ } . $type->{children}->[0] . q{ } . $name->{attr};
63             }
64              
65             $rperl_source_group->{PMC} .= q{ } . $rparen . q{ } . $equal . q{ } . $at_underscore_semicolon . "\n";
66             return $rperl_source_group;
67             };
68              
69             our string_hashref::method $ast_to_cpp__generate__CPPOPS_PERLTYPES = sub {
70             ( my object $self, my string_hashref $modes) = @_;
71             my string_hashref $cpp_source_group = { CPP => q{// <<< RP::CB::S::M::A __DUMMY_SOURCE_CODE CPPOPS_PERLTYPES >>>} . "\n" };
72              
73             #...
74             return $cpp_source_group;
75             };
76              
77             our string_hashref::method $ast_to_cpp__generate__CPPOPS_CPPTYPES = sub {
78             ( my object $self, my string_hashref $modes) = @_;
79             my string_hashref $cpp_source_group = { CPP => q{} };
80             my string_hashref $cpp_source_subgroup;
81              
82             # RPerl::diag( 'in Method::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), received $self = ' . "\n" . RPerl::Parser::rperl_ast__dump($self) . "\n" );
83              
84             my object $arguments_star = $self->{children}->[3];
85              
86             # CREATE SYMBOL TABLE ENTRY
87             # discard trailing '::' to go from namespace to class-name-as-type
88             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{this} = {
89             isa => 'RPerl::CodeBlock::Subroutine::Arguments',
90             type => ( substr $modes->{_symbol_table}->{_namespace}, 0, ( ( length $modes->{_symbol_table}->{_namespace} ) - 2 ) )
91             };
92              
93             my string_arrayref $arguments = [];
94              
95             #RPerl::diag( 'in Method::Arguments->ast_to_cpp__generate__CPPOPS_CPPTYPES(), have $arguments_star = ' . "\n" . RPerl::Parser::rperl_ast__dump($arguments_star) . "\n" );
96              
97             # (OP21_LIST_COMMA MY Type VARIABLE_SYMBOL)*
98             my object $arguments_star_dclone = dclone($arguments_star);
99             while ( exists $arguments_star_dclone->{children}->[0] ) {
100             shift @{ $arguments_star_dclone->{children} }; # discard $comma
101             shift @{ $arguments_star_dclone->{children} }; # discard $my
102             my object $type = shift @{ $arguments_star_dclone->{children} };
103             my string $name = shift @{ $arguments_star_dclone->{children} };
104             $name = $name->{attr}; # strings inside of STAR grammar production becomes TERMINAL object, must retrieve data from attr property
105             substr $name, 0, 1, q{}; # remove leading $ sigil
106              
107             # CREATE SYMBOL TABLE ENTRY
108             $modes->{_symbol_table}->{ $modes->{_symbol_table}->{_namespace} }->{ $modes->{_symbol_table}->{_subroutine} }->{ $name }
109             = { isa => 'RPerl::CodeBlock::Subroutine::Method::Arguments', type => $type->{children}->[0] };
110              
111             $type->{children}->[0] =~ s/^constant_/const\ /gxms; # 'constant_foo' becomes 'const foo'
112             $type->{children}->[0] =~ s/::/__/gxms; # 'Class::Subclass' becomes 'Class__Subclass'
113             push @{$arguments}, ( $type->{children}->[0] . q{ } . $name );
114             }
115             $cpp_source_group->{CPP} .= join ', ', @{$arguments};
116             return $cpp_source_group;
117             };
118              
119             1; # end of class