File Coverage

blib/lib/CORBA/Python/ImportVisitor.pm
Criterion Covered Total %
statement 9 194 4.6
branch 0 30 0.0
condition 0 15 0.0
subroutine 3 46 6.5
pod 0 40 0.0
total 12 325 3.6


line stmt bran cond sub pod time code
1              
2             #
3             # Interface Definition Language (OMG IDL CORBA v3.0)
4             #
5             # Python Language Mapping Specification, Version 1.2 November 2002
6             #
7              
8             package CORBA::Python::ImportVisitor;
9              
10 1     1   5 use strict;
  1         2  
  1         34  
11 1     1   6 use warnings;
  1         1  
  1         117  
12              
13             our $VERSION = '2.64';
14              
15 1     1   6 use File::Basename;
  1         2  
  1         2377  
16              
17             # builds $node->{py_import}
18              
19             sub new {
20 0     0 0   my $proto = shift;
21 0   0       my $class = ref($proto) || $proto;
22 0           my $self = {};
23 0           bless $self, $class;
24 0           my ($parser, $cpy_ext) = @_;
25 0           $self->{symbtab} = $parser->YYData->{symbtab};
26 0           $self->{module} = undef;
27 0           $self->{cpy_ext} = $cpy_ext;
28 0           my $basename = basename($parser->YYData->{srcname}, '.idl');
29 0           $basename =~ s/\./_/g;
30 0           $self->{root_module} = 'c_' . $basename;
31 0           return $self;
32             }
33              
34             sub _get_defn {
35 0     0     my $self = shift;
36 0           my $defn = shift;
37 0 0         if (ref $defn) {
38 0           return $defn;
39             }
40             else {
41 0           return $self->{symbtab}->Lookup($defn);
42             }
43             }
44              
45             sub _import {
46 0     0     my $self = shift;
47 0           my ($node, $flag_c) = @_;
48 0           my $full = $node->{full};
49 0           while (!$node->isa('Modules')) {
50 0           $full =~ s/::[0-9A-Z_a-z]+$//;
51 0 0         last unless ($full);
52 0           $node = $self->{symbtab}->Lookup($full);
53             }
54 0 0         if ($flag_c) {
55 0 0         if ($full) {
56 0           my @name = split /::/, $full;
57 0           $name[-1] = 'c' . $name[-1];
58 0           $full = join '::', @name;
59             }
60             else {
61 0           $full = $self->{root_module};
62             }
63 0           $self->{module}->{py_import}->{$full} = 1;
64 0           return;
65             }
66 0 0         unless ($full eq $self->{module}->{full}) {
67 0           $self->{module}->{py_import}->{$full} = 1;
68 0 0         if ($full =~ /^$self->{module}->{full}/) {
69 0           warn "possible circular import ($full in $self->{module}->{full}).\n";
70             }
71             }
72             }
73              
74             sub _import_type {
75 0     0     my $self = shift;
76 0           my ($type) = @_;
77 0 0 0       if ( $type->isa('StructType')
      0        
      0        
      0        
78             or $type->isa('UnionType')
79             or $type->isa('EnumType')
80             or $type->isa('TypeDeclarator')
81             or $type->isa('BaseInterface') ) {
82 0           $self->_import($type);
83             }
84             }
85              
86             #
87             # 3.5 OMG IDL Specification
88             #
89              
90             sub visitSpecification {
91 0     0 0   my $self = shift;
92 0           my ($node) = @_;
93 0           $node->{py_import} = {};
94 0           $self->{module} = $node;
95 0           foreach (@{$node->{list_export}}) {
  0            
96 0           $self->{symbtab}->Lookup($_)->visit($self);
97             }
98             }
99              
100             #
101             # 3.6 Import Declaration
102             #
103              
104             sub visitImport {
105 0     0 0   my $self = shift;
106 0           my ($node) = @_;
107 0           foreach (@{$node->{list_decl}}) {
  0            
108 0           $self->{symbtab}->Lookup($_)->visit($self);
109             }
110             }
111              
112             #
113             # 3.7 Module Declaration
114             #
115              
116             sub visitModules {
117 0     0 0   my $self = shift;
118 0           my ($node) = @_;
119 0           $node->{py_import} = {};
120 0           my $save_module = $self->{module};
121 0           $self->{module} = $node;
122 0           foreach (@{$node->{list_export}}) {
  0            
123 0           $self->{symbtab}->Lookup($_)->visit($self);
124             }
125 0           $self->{module} = $save_module;
126             }
127              
128             #
129             # 3.8 Interface Declaration
130             #
131              
132             sub visitBaseInterface {
133 0     0 0   my $self = shift;
134 0           my ($node) = @_;
135 0 0         if ($self->{cpy_ext}) {
136 0           $self->_import($node, 1);
137             }
138 0           foreach ($node->getInheritance()) {
139 0           my $base = $self->_get_defn($_);
140 0           $self->_import($base);
141             }
142 0           foreach (@{$node->{list_export}}) {
  0            
143 0           $self->{symbtab}->Lookup($_)->visit($self);
144             }
145             }
146              
147 0     0 0   sub visitForwardBaseInterface {
148             # empty
149             }
150              
151             #
152             # 3.9 Value Declaration
153             #
154              
155             sub visitBoxedValue {
156 0     0 0   my $self = shift;
157 0           my ($node) = @_;
158 0           my $type = $self->_get_defn($node->{type});
159 0           $self->_import_type($type);
160             }
161              
162             sub visitStateMember {
163 0     0 0   my $self = shift;
164 0           my ($node) = @_;
165 0           my $type = $self->_get_defn($node->{type});
166 0           $self->_import_type($type);
167 0 0         if (exists $node->{array_size}) {
168 0           foreach (@{$node->{array_size}}) {
  0            
169 0           $_->visit($self, $node); # expression
170             }
171             }
172             }
173              
174             sub visitInitializer {
175 0     0 0   my $self = shift;
176 0           my ($node) = @_;
177 0           foreach (@{$node->{list_param}}) {
  0            
178 0           $_->visit($self); # parameter
179             }
180             }
181              
182             #
183             # 3.10 Constant Declaration
184             #
185              
186             sub visitConstant {
187 0     0 0   my $self = shift;
188 0           my ($node) = @_;
189 0           $node->{value}->visit($self); # expression
190             }
191              
192             sub visitExpression {
193 0     0 0   my $self = shift;
194 0           my ($node) = @_;
195 0           foreach my $elt (@{$node->{list_expr}}) {
  0            
196 0 0         unless (ref $elt) {
197 0           $elt = $self->{symbtab}->Lookup($elt);
198             }
199 0 0         if ($elt->isa('Constant')) {
200 0           $self->_import($elt);
201             }
202             }
203             }
204              
205             #
206             # 3.11 Type Declaration
207             #
208              
209             sub visitTypeDeclarator {
210 0     0 0   my $self = shift;
211 0           my ($node) = @_;
212 0           my $type = $self->_get_defn($node->{type});
213 0           $self->_import_type($type);
214 0 0         if (exists $node->{array_size}) {
215 0           foreach (@{$node->{array_size}}) {
  0            
216 0           $_->visit($self, $node); # expression
217             }
218             }
219             }
220              
221 0     0 0   sub visitNativeType {
222             # empty
223             }
224              
225             #
226             # 3.11.1 Basic Types
227             #
228              
229 0     0 0   sub visitBasicType {
230             # empty
231             }
232              
233             #
234             # 3.11.2 Constructed Types
235             #
236             # 3.11.2.1 Structures
237             #
238              
239             sub visitStructType {
240 0     0 0   my $self = shift;
241 0           my ($node) = @_;
242 0           foreach (@{$node->{list_member}}) {
  0            
243 0           $self->_get_defn($_)->visit($self); # member
244             }
245             }
246              
247             sub visitMember {
248 0     0 0   my $self = shift;
249 0           my ($node) = @_;
250 0           my $type = $self->_get_defn($node->{type});
251 0           $self->_import_type($type);
252 0 0         if (exists $node->{array_size}) {
253 0           foreach (@{$node->{array_size}}) {
  0            
254 0           $_->visit($self, $type); # expression
255             }
256             }
257             }
258              
259             # 3.11.2.2 Discriminated Unions
260             #
261              
262             sub visitUnionType {
263 0     0 0   my $self = shift;
264 0           my ($node) = @_;
265 0           my $type = $self->_get_defn($node->{type});
266 0           $self->_import_type($type);
267 0           foreach (@{$node->{list_expr}}) {
  0            
268 0           $_->visit($self); # case
269             }
270             }
271              
272             sub visitCase {
273 0     0 0   my $self = shift;
274 0           my ($node) = @_;
275 0           foreach (@{$node->{list_label}}) {
  0            
276 0           $_->visit($self); # default or expression
277             }
278 0           $node->{element}->visit($self);
279             }
280              
281 0     0 0   sub visitDefault {
282             # empty
283             }
284              
285             sub visitElement {
286 0     0 0   my $self = shift;
287 0           my ($node) = @_;
288 0           $self->_get_defn($node->{value})->visit($self); # member
289             }
290              
291             # 3.11.2.4 Enumerations
292             #
293              
294 0     0 0   sub visitEnumType {
295             # empty
296             }
297              
298             #
299             # 3.11.3 Template Types
300             #
301              
302 0     0 0   sub visitSequenceType {
303             # empty
304             }
305              
306 0     0 0   sub visitStringType {
307             # empty
308             }
309              
310 0     0 0   sub visitWideStringType {
311             # empty
312             }
313              
314 0     0 0   sub visitFixedPtType {
315             # empty
316             }
317              
318 0     0 0   sub visitFixedPtConstType {
319             # empty
320             }
321              
322             #
323             # 3.12 Exception Declaration
324             #
325              
326             sub visitException {
327 0     0 0   my $self = shift;
328 0           my ($node) = @_;
329 0 0         if (exists $node->{list_member}) {
330 0           foreach (@{$node->{list_member}}) {
  0            
331 0           $self->_get_defn($_)->visit($self); # member
332             }
333             }
334             }
335              
336             #
337             # 3.13 Operation Declaration
338             #
339              
340             sub visitOperation {
341 0     0 0   my $self = shift;
342 0           my ($node) = @_;
343 0           my $type = $self->_get_defn($node->{type});
344 0           $self->_import_type($type);
345 0           foreach (@{$node->{list_param}}) {
  0            
346 0           $_->visit($self); # parameter
347             }
348             }
349              
350             sub visitParameter {
351 0     0 0   my $self = shift;
352 0           my($node) = @_;
353 0           my $type = $self->_get_defn($node->{type});
354 0           $self->_import_type($type);
355             }
356              
357 0     0 0   sub visitVoidType {
358             # empty
359             }
360              
361             #
362             # 3.14 Attribute Declaration
363             #
364              
365             sub visitAttribute {
366 0     0 0   my $self = shift;
367 0           my ($node) = @_;
368 0           $node->{_get}->visit($self);
369 0 0         $node->{_set}->visit($self) if (exists $node->{_set});
370             }
371              
372             #
373             # 3.15 Repository Identity Related Declarations
374             #
375              
376 0     0 0   sub visitTypeId {
377             # empty
378             }
379              
380 0     0 0   sub visitTypePrefix {
381             # empty
382             }
383              
384             #
385             # 3.17 Component Declaration
386             #
387              
388 0     0 0   sub visitProvides {
389             # empty
390             }
391              
392 0     0 0   sub visitUses {
393             # empty
394             }
395              
396 0     0 0   sub visitPublishes {
397             # empty
398             }
399              
400 0     0 0   sub visitEmits {
401             # empty
402             }
403              
404 0     0 0   sub visitConsumes {
405             # empty
406             }
407              
408             #
409             # 3.18 Home Declaration
410             #
411              
412             sub visitFactory {
413 0     0 0   my $self = shift;
414 0           my ($node) = @_;
415 0           foreach (@{$node->{list_param}}) {
  0            
416 0           $_->visit($self); # parameter
417             }
418             }
419              
420             sub visitFinder {
421 0     0 0   my $self = shift;
422 0           my ($node) = @_;
423 0           foreach (@{$node->{list_param}}) {
  0            
424 0           $_->visit($self); # parameter
425             }
426             }
427              
428             1;
429