/[suikacvs]/messaging/manakai/lib/Message/Util/PerlCode.dis
Suika

Contents of /messaging/manakai/lib/Message/Util/PerlCode.dis

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (hide annotations) (download)
Thu May 5 12:30:03 2005 UTC (20 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.20: +11 -3 lines
lib/Message/DOM/DOMCore.dis and lib/Message/DOM/DOMXML.dis now dac-compilable

1 wakaba 1.1 Module:
2     @QName:
3     Util:PerlCode
4     @FullName:
5     @@lang: en
6     @@@:
7     Perl Code Constructor
8     @Namespace:
9     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#
10    
11     @Description:
12     @@lang:en
13     @@@:
14     This module provides an object-oriented interface to construct
15     Perl code.
16    
17     @Author:
18     @@FullName: Wakaba
19     @@Mail: w@suika.fam.cx
20     @License:
21     @@@:
22     license:Perl+MPL
23     @@Original:
24     @@@FullName:
25     manakai <CODE::lib/manakai/genlib.pl>
26     @@@Year:2004
27     @@@Author:
28     @@@@FullName:Wakaba
29     @@@@Mail:w@suika.fam.cx
30     @Date:
31     @@@:
32 wakaba 1.21 $Date: 2005/05/04 13:49:27 $
33 wakaba 1.1 @@ContentType:
34     dis:Date.RCS
35    
36     @Require:
37     @@Module:
38     @@@Name: ManakaiNode
39     @@@WithFor:
40     ManakaiDOM:Perl
41     @@Module:
42     @@@Name: DOMBoot
43 wakaba 1.5 @@@QName:
44     MDOM:DOMBoot
45 wakaba 1.1 @@@WithFor:
46     ManakaiDOM:ManakaiDOMLatest
47     @@Module:
48     @@@Name: DOMMetaImpl
49 wakaba 1.5 @@@QName:
50     MDOM:DOMMetaImpl
51 wakaba 1.1 @@@WithFor:
52     ManakaiDOM:ManakaiDOMLatest
53    
54     @DefaultFor:
55     ManakaiDOM:Perl
56    
57     Namespace:
58     @DIS:
59     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#
60     @dis:
61     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
62     @dis2pm:
63     http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm#
64     @DISlib:
65     http://suika.fam.cx/~wakaba/archive/2004/dis/
66     @DOMCore:
67     http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#
68     @DOMLS:
69     http://suika.fam.cx/~wakaba/archive/2004/dom/ls#
70     @DOMMain:
71     http://suika.fam.cx/~wakaba/archive/2004/dom/main#
72 wakaba 1.20 @dx:
73     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
74 wakaba 1.1 @infoset:
75     http://www.w3.org/2001/04/infoset#
76     @lang:
77     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#
78     @license:
79     http://suika.fam.cx/~wakaba/archive/2004/8/18/license#
80     @ManakaiDOM:
81     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
82     @Markup:
83     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#
84 wakaba 1.5 @MDOM:
85     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM.
86 wakaba 1.1 @MDOMX:
87     http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#
88     @owl:
89     http://www.w3.org/2002/07/owl#
90     @pc:
91     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#
92     @Perl:
93     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl--
94     @rdf:
95     http://www.w3.org/1999/02/22-rdf-syntax-ns#
96     @rdfs:
97     http://www.w3.org/2000/01/rdf-schema#
98     @swcfg21:
99     http://suika.fam.cx/~wakaba/archive/2005/swcfg21#
100     @TreeCore:\
101     @Util:
102     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/
103    
104     ## -- Features
105    
106     ElementTypeBinding:
107     @Name: FeatureDef
108     @ElementType:
109     dis:ResourceDef
110     @ShadowContent:
111     @@rdf:type:
112     DOMMain:DOMFeature
113     @@AliasFor:
114     @@@@:
115     ::ManakaiDOM:all
116     @@@For:
117     !=ManakaiDOM:all
118    
119     ElementTypeBinding:
120     @Name: FeatureVerDef
121     @ElementType:
122     dis:ResourceDef
123     @ShadowContent:
124     @@rdf:type:
125     DOMMain:DOMFeature
126    
127     ElementTypeBinding:
128     @Name: featureQName
129     @ElementType:
130     dis:AppName
131     @ShadowContent:
132     @@ContentType:
133     dis:TypeQName
134    
135     FeatureDef:
136     @QName: CoreFeature
137     @featureQName:
138     Util:PerlCode
139     @FeatureVerDef:
140     @@QName: CoreFeature10
141     @@Version: 1.0
142     @@ISA: CoreFeature
143     @@FullName:
144     @@@lang:en
145     @@@@:
146     Perl Code Constructor, version 1.0
147     @@Description:
148     @@@lang:en
149     @@@@:
150     Perl Code Constructor, version 1.0.
151    
152     ## -- Classes
153    
154     ClsDef:
155     @ClsQName: ManakaiPerlCodeFragment
156     @ClsISA:
157     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
158 wakaba 1.20 @ClsISA:
159     dx:ManakaiDefaultExceptionHandler::ManakaiDOM:Perl
160 wakaba 1.1 @enDesc:
161     A class on which another Perl code classes are constructed based.
162    
163     @Attr:
164     @@Name: parentNode
165     @@enDesc:
166     The parent construction of this object.
167     @@Get:
168     @@@Type: ManakaiPerlCodeFragment
169 wakaba 1.5 @@@nullCase:
170     @@@@enDesc:
171     This object has no parent.
172 wakaba 1.1 @@@PerlDef:
173     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:parent>};
174 wakaba 1.6 $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($r) if $r;
175    
176     @Attr:
177     @@Name: fileNode
178     @@enDesc:
179     The root <QUOTE::file> node of the tree to which this node belongs.
180     @@Type: ManakaiPerlCodeFragment
181     @@Get:
182     @@@enDesc:
183     The <QUOTE::file> node of the tree.
184     @@@nullCase:
185     @@@@enDesc:
186     This node does not belong to any file tree.
187     @@@PerlDef:
188     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:parent>};
189     {
190     if ($r->{<Q::pc:parent>}) {
191     $r = $r->{<Q::pc:parent>};
192     redo;
193     }
194     };
195     if ($r) {
196     if ($r->{<Q::pc:nodeType>} eq 'file') {
197     __DEEP{
198     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($r);
199     }__;
200     } else {
201     $r = null;
202     }
203     } elsif ($self->{<Q::TreeCore:node>}->{<Q::pc:nodeType>} eq 'file') {
204     $r = $self;
205     }
206    
207     @IntMethod:
208     @@Name: getNodeReference
209     @@ManakaiDOM:isStatic:1
210     @@enDesc:
211     Gets a node reference for a node object.
212     @@Param:
213     @@@Name: object
214     @@@Type:
215     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
216     @@@enDesc:
217     A node object.
218     @@Return:
219     @@@Type:
220     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
221     @@@PerlDef:
222     my $nt = $object->{<Q::pc:nodeType>};
223     my $pack;
224 wakaba 1.9 __CODE{pc:nodeTypeToPackageName::
225     $nodeType => $nt, $packageName => $pack, $object => $object}__;
226 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
227     $object => $object, $ref => $r, $class => $pack}__;
228    
229     @Method:
230     @@Name: replaceVariable
231     @@enDesc:
232     Replaces a variable.
233     \
234     {NOTE:: For objects of type <Class::ManakaiPerlFile>,
235 wakaba 1.11 <Class::ManakaiPerlPackageScope>,
236     <Class::ManakaiPerlSub> and
237     <Class::ManakaiPerlVariable>, the result is undefined.
238 wakaba 1.6 \
239     }
240     @@Param:
241     @@@Name: originalVariable
242     @@@Type:
243     lang:Perl::ManakaiDOM:all
244     @@@enDesc:
245     Original variable specification, including prefix.
246     \
247     {NOTE:: Qualified name variable and hash key is not supported.
248     \
249     }
250     @@Param:
251     @@@Name: newValue
252 wakaba 1.11 @@@Type:
253     DOMMain:any::ManakaiDOM:all
254 wakaba 1.6 @@@enDesc:
255     New value to replace.
256 wakaba 1.11 @@@InCase:
257     @@@@Type:ManakaiPerlCodeFragment
258     @@@@enDesc:
259     New Perl code fragment to replace by.
260     @@@InCase:
261     @@@@Type:
262     lang:Perl::ManakaiDOM:all
263     @@@@enDesc:
264     Inline Perl code fragment string to replace by.
265 wakaba 1.6 @@Return:
266     @@@PerlDef:
267     my $node = $self->{<Q::TreeCore:node>};
268     if ($node->{<Q::pc:nodeType>} eq 'unparsed' or
269     $node->{<Q::pc:nodeType>} eq 'inunparsed') {
270 wakaba 1.11 my $newVariable = ref $newValue ? $newValue->stringify : ''.$newValue;
271 wakaba 1.14 $node->{<Q::pc:code>} =~ s/\Q$originalVariable\E\b/$newVariable/g;
272 wakaba 1.6 } elsif ($node->{<Q::pc:childNodes>}) {
273     __DEEP{
274 wakaba 1.11 for my $cnoi (0..$#{$node->{<Q::pc:childNodes>}}) {
275     my $cno = $node->{<Q::pc:childNodes>}->[$cnoi];
276     if ($cno->{<Q::pc:nodeType>} eq 'variable') {
277     if (substr ($originalVariable, 0, 1)
278     eq $cno->{<Q::pc:variableType>} and
279     not $cno->{<Q::pc:packageName>} and
280     substr ($originalVariable, 1)
281     eq $cno->{<Q::pc:localName>} and
282     not $cno->{<Q::pc:hashKey>}) {
283     if (ref $newValue) {
284     CORE::delete $cno->{<Q::pc:parent>};
285     $cno-><M::ManakaiDOM:ManakaiDOMNodeObject
286     ::ManakaiDOM:Perl.orphanate>;
287     my $newnode = $newValue->{<Q::TreeCore:node>};
288     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
289     ::ManakaiDOM:Perl.importTree> ($newnode);
290     $newnode->{<Q::pc:parent>} = $node;
291     $node->{<Q::pc:childNodes>}->[$cnoi] = $newnode;
292     } else {
293     my $cn;
294     __CODE{ManakaiNode:getWeakReference::
295     $object => $cno, $ref => $cn,
296     $class => {<ClassName::ManakaiPerlCodeFragment>},
297     }__;
298     $cn-><M::ManakaiPerlInlineContainer.appendCode>
299     ($newValue);
300     }
301     }
302     } else { ## Non-variable child
303     my $cn;
304     __CODE{ManakaiNode:getWeakReference::
305     $object => $cno, $ref => $cn,
306     $class => {<ClassName::ManakaiPerlCodeFragment>},
307     }__;
308     $cn-><M::ManakaiPerlCodeFragment.replaceVariable>
309     ($originalVariable => $newValue);
310     }
311 wakaba 1.6 }
312     }__;
313     }
314 wakaba 1.13
315     @Method:
316     @@Name: addUsePerlModuleName
317     @@enDesc:
318     Adds a Perl module into the list of Perl modules
319     <Perl::use>d by this code fragment.
320     @@Param:
321     @@@Name: moduleName
322     @@@Type:
323     Perl:package-name::ManakaiDOM:all
324     @@@enDesc:
325     The name of the module package that should be <Perl::use>d.
326     @@Return:
327     @@@PerlDef:
328     $self->{<Q::TreeCore:node>}->{<Q::pc:useModuleName>}
329     ->{$moduleName} = true;
330    
331     @Method:
332 wakaba 1.19 @@Name: addRequirePerlModuleName
333     @@enDesc:
334     Adds a Perl module into the list of Perl modules
335     <Perl::require>d by this code fragment.
336     @@Param:
337     @@@Name: moduleName
338     @@@Type:
339     Perl:package-name::ManakaiDOM:all
340     @@@enDesc:
341     The name of the module package that should be <Perl::require>d.
342     @@Return:
343     @@@PerlDef:
344     $self->{<Q::TreeCore:node>}->{<Q::pc:requireModuleName>}
345     ->{$moduleName} = true;
346    
347     @Method:
348 wakaba 1.15 @@Name: getUsePerlModuleNameList
349     @@enDesc:
350     Returns a list of Perl modules names that is <Perl::use>d
351     by this code fragment, including all descendant nodes.
352     @@Return:
353     @@@Type:
354     Perl:ARRAY::ManakaiDOM:all
355     @@@enDesc:
356     A list of module names. Note that the list is <EM::dead>;
357     any modification to it does not affect to the code fragment
358     and vice versa.
359     @@@PerlDef:
360     my $list = {};
361     my @node = ($self->{<Q::TreeCore:node>});
362     while (my $node = shift @node) {
363 wakaba 1.19 next unless ref $node;
364 wakaba 1.15 for my $mname (keys %{$node->{<Q::pc:useModuleName>} || {}}) {
365     $list->{$mname} ||= $node->{<Q::pc:useModuleName>}->{$mname};
366     }
367     push @node, $node->{$_} for @{$node->{<Q::TreeCore:subnode0>}};
368     my @n;
369     for my $nn (map {$node->{$_}} @{$node->{<Q::TreeCore:subnode2>}}) {
370     push @n, (ref $nn eq 'ARRAY' ? @$nn : values %{$nn || {}});
371     }
372     for my $n ((map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}), @n) {
373     push @node, (ref $n eq 'ARRAY' ? @$n : values %{$n || {}});
374     }
375     }
376     $r = [grep {$list->{$_}} keys %$list];
377    
378     @Method:
379 wakaba 1.19 @@Name: getRequirePerlModuleNameList
380     @@enDesc:
381     Returns a list of Perl modules names that is <Perl::require>d
382     by this code fragment, including all descendant nodes.
383     @@Return:
384     @@@Type:
385     Perl:ARRAY::ManakaiDOM:all
386     @@@enDesc:
387     A list of module names. Note that the list is <EM::dead>;
388     any modification to it does not affect to the code fragment
389     and vice versa.
390     @@@PerlDef:
391     my $list = {};
392     my @node = ($self->{<Q::TreeCore:node>});
393     while (my $node = shift @node) {
394     next unless ref $node;
395     for my $mname (keys %{$node->{<Q::pc:requireModuleName>} || {}}) {
396     $list->{$mname} ||= $node->{<Q::pc:requireModuleName>}->{$mname};
397     }
398     push @node, $node->{$_} for @{$node->{<Q::TreeCore:subnode0>}};
399     my @n;
400     for my $nn (map {$node->{$_}} @{$node->{<Q::TreeCore:subnode2>}}) {
401     push @n, (ref $nn eq 'ARRAY' ? @$nn : values %{$nn || {}});
402     }
403     for my $n ((map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}), @n) {
404     push @node, (ref $n eq 'ARRAY' ? @$n : values %{$n || {}});
405     }
406     }
407     $r = [grep {$list->{$_}} keys %$list];
408    
409     @Method:
410 wakaba 1.13 @@Name: disAddRequireURI
411     @@enDesc:
412     Adds a <QUOTE::dis> resource into the list of <Perl::require>d
413     resources of this code fragment.
414     @@Param:
415     @@@Name: uriArg
416     @@@Type:
417     DISLang:String::ManakaiDOM:all
418     @@@enDesc:
419     The URI reference of the resource to add.
420     @@Return:
421     @@@PerlDef:
422     $self->{<Q::TreeCore:node>}->{<Q::pc:requireResourceURI>}
423     ->{$uriArg} = true;
424 wakaba 1.15
425     @Method:
426     @@Name: disGetRequireURIList
427     @@enDesc:
428     Returns a list of <QUOTE::dis> resource URI references that is
429     <Perl::require>d by this code fragment, including all descendant nodes.
430     @@Return:
431     @@@Type:
432     Perl:ARRAY::ManakaiDOM:all
433     @@@enDesc:
434     A list of resource URI references. Note that the list is <EM::dead>;
435     any modification to it does not affect to the code fragment
436     and vice versa.
437     @@@PerlDef:
438     my $list = {};
439     my @node = ($self->{<Q::TreeCore:node>});
440     while (my $node = shift @node) {
441 wakaba 1.19 next unless ref $node;
442 wakaba 1.15 for my $mname (keys %{$node->{<Q::pc:requireResourceURI>} || {}}) {
443     $list->{$mname} ||= $node->{<Q::pc:requireResourceURI>}->{$mname};
444     }
445     push @node, $node->{$_} for @{$node->{<Q::TreeCore:subnode0>}};
446     my @n;
447     for my $nn (map {$node->{$_}} @{$node->{<Q::TreeCore:subnode2>}}) {
448     push @n, (ref $nn eq 'ARRAY' ? @$nn : values %{$nn || {}});
449     }
450     for my $n ((map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}), @n) {
451     push @node, (ref $n eq 'ARRAY' ? @$n : values %{$n || {}});
452     }
453     }
454     $r = [grep {$list->{$_}} keys %$list];
455 wakaba 1.1 ##PerlCodeFragment
456    
457 wakaba 1.13 PropDef:
458     @QName: useModuleName
459     @enDesc:
460     The list of modules.
461    
462     PropDef:
463     @QName: requireResourceURI
464     @enDesc:
465     The list of resources.
466    
467 wakaba 1.9 ResourceDef:
468     @QName: nodeTypeToPackageName
469     @rdf:type:
470     dis2pm:BlockCode
471     @enDesc:
472     Gets Perl class package name from a node type string.
473     @PerlDef:
474     if ($nodeType eq 'unparsed') {
475     $packageName = <ClassName::ManakaiPerlUnparsedCode>;
476     } elsif ($nodeType eq 'bare') {
477     $packageName = <ClassName::ManakaiPerlBare>;
478     } elsif ($nodeType eq 'atom') {
479     $packageName = <ClassName::ManakaiPerlAtom>;
480     } elsif ($nodeType eq 'variable') {
481     $packageName = <ClassName::ManakaiPerlVariable>;
482     } elsif ($nodeType eq 'inunparsed') {
483     $packageName = <ClassName::ManakaiPerlInlineUnparsedCode>;
484     } elsif ($nodeType eq 'incontainer') {
485     $packageName = <ClassName::ManakaiPerlInlineContainer>;
486     } elsif ($nodeType eq 'statement') {
487     $packageName = <ClassName::ManakaiPerlStatement>;
488 wakaba 1.11 } elsif ($nodeType eq 'assign') {
489     $packageName = <ClassName::ManakaiPerlAssignment>;
490 wakaba 1.9 } elsif ($nodeType eq 'string') {
491     $packageName = <ClassName::ManakaiPerlStringLiteral>;
492     } elsif ($nodeType eq 'blockcontainer') {
493     $packageName = <ClassName::ManakaiPerlBlockContainer>;
494     } elsif ($nodeType eq 'block') {
495     $packageName = <ClassName::ManakaiPerlBlock>;
496 wakaba 1.12 } elsif ($nodeType eq 'if') {
497     $packageName = <ClassName::ManakaiPerlIf>;
498 wakaba 1.9 } elsif ($nodeType eq 'sub') {
499     $packageName = <ClassName::ManakaiPerlSub>;
500     } elsif ($nodeType eq 'package') {
501     $packageName = <ClassName::ManakaiPerlPackageScope>;
502     } elsif ($nodeType eq 'file') {
503     $packageName = <ClassName::ManakaiPerlFile>;
504     } else {
505     __ASSERT{DISPerl:invariant::
506     msg => {qq[Node type: "$nodeType" ].
507     qq[(ref: "@{[ref $object]}")]},
508     }__;
509     }
510    
511    
512 wakaba 1.6 PropDef:
513     @QName: nodeType
514     @enDesc:
515     Node type.
516    
517 wakaba 1.1 ClsDef:
518     @ClsQName: ManakaiPerlFile
519 wakaba 1.16 @ClsISA: ManakaiPerlStatementContainer
520 wakaba 1.1 @enDesc:
521     Perl source code files.
522    
523     @IntMethod:
524     @@Name:newObject
525     @@ManakaiDOM:isStatic:1
526     @@Description:
527     @@@lang:en
528     @@@@:
529     Creates a new instance object for <Class::ManakaiPerlFile>.
530     @@Return:
531     @@@Type:
532     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
533     @@@Description:
534     @@@@lang:en
535     @@@@@:
536     The newly created node object.
537     @@@PerlDef:
538     @@@@@:
539     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
540     ::ManakaiDOM:Perl.new>;
541     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
542     $node->{<Q::pc:childNodes>} = [];
543     $node->{<Q::pc:sourceFile>} = '';
544     $node->{<Q::pc:sourceModule>} = '';
545     $node->{<Q::pc:sourceFor>} = '';
546     $node->{<Q::pc:currentPackage>} = 'main';
547     $node->{<Q::pc:currentChunk>} = 0;
548 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'file';
549 wakaba 1.1 @@@@ImplNote:
550     @@@@@lang:en
551     @@@@@@:
552     Properties: <Q::pc:sourceFile>,
553     <Q::pc:sourceModule>, <Q::pc:sourceFor>, <Q::childNodes>,
554 wakaba 1.6 <Q::pc:currentPackage>, <Q::pc:currentChunk>,
555 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
556 wakaba 1.15 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
557 wakaba 1.1
558     @Method:
559     @@Name: appendNewPackage
560     @@enDesc:
561     Appends a new package scope block.
562     @@Param:
563     @@@Name: packageName
564     @@@Type:
565     Perl:package-name::ManakaiDOM:all
566     @@@enDesc:
567     The fully-qualified name of the package to create.
568     @@Return:
569     @@@Type: ManakaiPerlPackageScope
570     @@@enDesc:
571     The newly created package scope object.
572     @@@PerlDef:
573     $r = <ClassM::ManakaiPerlPackageScope.newObject>;
574     $r->{<Q::pc:packageName>} = $packageName;
575     $self->{<Q::TreeCore:node>}
576     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
577     .importTree> ($r);
578     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $r;
579     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
580 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
581     $object => $r, $ref => $r,
582     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
583 wakaba 1.1
584     @Method:
585 wakaba 1.13 @@Name: appendPackage
586     @@enDesc:
587     Appends a Perl package scope object.
588     @@Param:
589     @@@Name: codeArg
590     @@@Type: ManakaiPerlPackageScope
591     @@@enDesc:
592     The package to append.
593     @@Return:
594     @@@RaiseException:
595     @@@@@:IN_USE_NODE_ERR
596     @@@@enDesc:
597     An attempt is made to set a subroutine that is
598     already used elsewhere.
599     @@@PerlDef:
600     my $packobj = $codeArg->{<Q::TreeCore:node>};
601     if ($packobj->{<Q::pc:parent>}) {
602     __EXCEPTION{IN_USE_NODE_ERR::
603     pc:childNode => {$codeArg},
604     MDOMX:param-name => 'codeArg',
605     }__;
606     }
607     $self->{<Q::TreeCore:node>}
608     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
609     .importTree> ($packobj);
610     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $packobj;
611     $packobj->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
612    
613     @Method:
614 wakaba 1.1 @@Name: getFirstPackage
615     @@enDesc:
616     Gets the first package scope block of a name.
617     @@Param:
618     @@@Name: packageName
619     @@@@Type:
620     Perl:package-name::ManakaiDOM:all
621     @@@@enDesc:
622     The fully-qualified name of the package to get.
623     @@NamedParam:
624     @@@Name: makeNewPackage
625     @@@Type:
626 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
627 wakaba 1.1 @@@enDesc:
628     Whether a new package scope object should be created if
629     no package of <P::packageName> found.
630     @@@TrueCase:
631     @@@@enDesc:
632     Makes a new object if not found.
633     @@@FalseCase:
634     @@@@enDesc:
635     Don't make a new object.
636     @@Return:
637     @@@Type: ManakaiPerlPackageScope
638     @@@enDesc:
639     The first package scope object whose name is equal to
640     <P::packageName>.
641     @@@nullCase:
642     @@@@enDesc:
643     There is no <P::packageName> package object and
644     the <P::makeNewPackage> parameter is set to <DOM::false>.
645     @@@PerlDef:
646     for my $cn (@{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}) {
647 wakaba 1.16 if ($cn->{<Q::pc:nodeType>} eq 'package' and
648     $cn->{<Q::pc:packageName>} eq $packageName) {
649 wakaba 1.1 $r = $cn;
650     last;
651     }
652     }
653     if ($r) {
654 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
655     $object => $r, $ref => $r,
656     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
657 wakaba 1.1 } elsif ($makeNewPackage) {
658     __DEEP{
659     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
660     }__;
661     }
662    
663     @Method:
664     @@Name: getLastPackage
665     @@enDesc:
666     Gets the last package scope block of a name.
667     @@Param:
668     @@@Name: packageName
669     @@@@Type:
670     Perl:package-name::ManakaiDOM:all
671     @@@@enDesc:
672     The fully-qualified name of the package to get.
673     @@NamedParam:
674     @@@Name: makeNewPackage
675     @@@Type:
676 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
677 wakaba 1.1 @@@enDesc:
678     Whether a new package scope object should be created if
679     no package of <P::packageName> found.
680     @@@TrueCase:
681     @@@@enDesc:
682     Makes a new object if not found.
683     @@@FalseCase:
684     @@@@enDesc:
685     Don't make a new object.
686     @@Return:
687     @@@Type: ManakaiPerlPackageScope
688     @@@enDesc:
689     The last package scope object whose name is equal to
690     <P::packageName>.
691     @@@nullCase:
692     @@@@enDesc:
693     There is no <P::packageName> package object and
694     the <P::makeNewPackage> parameter is set to <DOM::false>.
695     @@@PerlDef:
696     for my $cn (reverse @{$self->{<Q::TreeCore:node>}
697     ->{<Q::pc:childNodes>}}) {
698 wakaba 1.16 if ($cn->{<Q::pc:nodeType>} eq 'package' and
699     $cn->{<Q::pc:packageName>} eq $packageName) {
700 wakaba 1.1 $r = $cn;
701     last;
702     }
703     }
704     if ($r) {
705 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
706     $object => $r, $ref => $r,
707     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
708 wakaba 1.1 } elsif ($makeNewPackage) {
709     __DEEP{
710     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
711     }__;
712     }
713    
714     @Attr:
715     @@Name: sourceFile
716     @@enDesc:
717     The file name of the source file from which this
718     Perl code is primary generated.
719     @@Get:
720     @@@Type:
721 wakaba 1.12 DISLang:String::ManakaiDOM:all
722 wakaba 1.1 @@@disDef:
723     @@@@GetProp: sourceFile
724     @@Set:
725     @@@Type:
726 wakaba 1.12 DISLang:String::ManakaiDOM:all
727 wakaba 1.1 @@@disDef:
728     @@@@SetProp: sourceFile
729    
730     @Attr:
731     @@Name: sourceModule
732     @@enDesc:
733     The name URI reference of the source module that this package defines.
734     @@Get:
735     @@@Type:
736 wakaba 1.12 DISLang:String::ManakaiDOM:all
737 wakaba 1.1 @@@disDef:
738     @@@@GetProp: sourceModule
739     @@Set:
740     @@@Type:
741 wakaba 1.12 DISLang:String::ManakaiDOM:all
742 wakaba 1.1 @@@disDef:
743     @@@@SetProp: sourceModule
744    
745     @Attr:
746     @@Name: sourceFor
747     @@enDesc:
748     The URI reference of the source module <QUOTE::for> for which this
749     package is.
750     @@Get:
751     @@@Type:
752 wakaba 1.12 DISLang:String::ManakaiDOM:all
753 wakaba 1.1 @@@disDef:
754     @@@@GetProp: sourceFor
755     @@Set:
756     @@@Type:
757 wakaba 1.12 DISLang:String::ManakaiDOM:all
758 wakaba 1.1 @@@disDef:
759     @@@@SetProp: sourceFor
760    
761     @ToStringMethod:
762     @@Return:
763     @@@Type:
764 wakaba 1.12 DISLang:String::ManakaiDOM:all
765 wakaba 1.1 @@@enDesc:
766     The Perl code generated.
767     @@@PerlDef:
768     __DEEP{
769     my $node = $self->{<Q::TreeCore:node>};
770     ## -- Header
771     $r = qq<#!/usr/bin/perl \n>;
772     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
773     (q<This file is automatically generated>);
774     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
775     (q< at >.<ClassM::ManakaiPerlCodeImplementation
776     .rfc3339DateTime> (time).q<,>);
777     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
778     (q< from file ">.$node->{<Q::sourceFile>}.q<",>);
779     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
780     (q[ module <].$node->{<Q::sourceModule>}.q[>,]);
781     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
782     (q[ for <].$node->{<Q::sourceFor>}.q[>.]);
783     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
784     (q<Don't edit by hand!>);
785     $r .= qq<use strict;\n>;
786     $self-><AS::ManakaiPerlFile.currentPackage> ('main');
787 wakaba 1.6 $self-><AS::ManakaiPerlFile.currentChunkNumber> (0);
788 wakaba 1.1
789 wakaba 1.15 ## -- Requires
790 wakaba 1.19 my $req = $self-><M::ManakaiPerlCodeFragment
791     .getRequirePerlModuleNameList>;
792     for my $pack (@$req) {
793 wakaba 1.15 $r .= qq<require $pack;\n>;
794     }
795    
796 wakaba 1.16 ## -- Packages and global objects
797 wakaba 1.1 my $pack = {};
798 wakaba 1.16 for my $cno (@{$node->{<Q::pc:childNodes>}}) {
799     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
800     $r .= $cn->stringify;
801     if ($cno->{<Q::pc:nodeType>} eq 'package') {
802     for my $ipack (keys %{$cno->{<Q::dis:Implement>}}) {
803     $pack->{$ipack} ||= true; # not defined
804     }
805     $pack->{$cno->{<Q::pc:packageName>}} = []; # defined
806 wakaba 1.1 }
807     }
808    
809     ## -- Enables interface packages
810 wakaba 1.3 my @packs = map {'$' . $_ . '::'}
811     grep {not ref $pack->{$_} and $pack->{$_}}
812     keys %$pack;
813     $r .= q<for (>. join (', ', @packs) . qq<){}\n> if @packs;
814 wakaba 1.1
815     ## -- Footer
816     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
817 wakaba 1.2 (q[License: <].$node->{<Q::dis:License>}.qq[>\n]);
818 wakaba 1.1 $r .= qq<1;\n>;
819     }__;
820    
821     @Attr:
822     @@Name: currentPackage
823     @@enDesc:
824     The current Perl package (used in stringify method).
825     @@Type:
826     Perl:package-name::ManakaiDOM:all
827     @@Get:
828     @@@disDef:
829     @@@@GetProp: currentPackage
830     @@Set:
831     @@@disDef:
832     @@@@SetProp: currentPackage
833    
834     @Attr:
835 wakaba 1.6 @@Name: currentChunkNumber
836 wakaba 1.1 @@enDesc:
837 wakaba 1.6 The current code chunk number (used in stringify method).
838 wakaba 1.1 @@Type:
839     DOMMain:unsigned-long::ManakaiDOM:all
840     @@Get:
841     @@@disDef:
842     @@@@GetProp: currentChunk
843     @@Set:
844     @@@disDef:
845     @@@@SetProp: currentChunk
846 wakaba 1.6
847     @Method:
848     @@Name: getNextChunkNumber
849     @@enDesc:
850     Increments the current chunk number of this file
851     and returns it.
852     @@Return:
853     @@@Type:
854     DOMMain:unsigned-long::ManakaiDOM:all
855     @@@enDesc:
856     The next chunk number.
857     @@@PerlDef:
858     $r = ++$self->{<Q::TreeCore:node>}->{<Q::pc:currentChunk>};
859 wakaba 1.2
860     @Attr:
861     @@Name: licenseURI
862     @@enDesc:
863     The license term URI reference for this code.
864     @@Type:
865     DISLang:String::ManakaiDOM:all
866     @@Get:
867     @@@disDef:
868     @@@@GetProp:
869     dis:License
870     @@Set:
871     @@@disDef:
872     @@@@SetProp:
873     dis:License
874 wakaba 1.1 ##PerlFile
875    
876     PropDef:
877 wakaba 1.18 @QName: export
878     @enDesc:
879     The list of exported members.
880    
881     PropDef:
882 wakaba 1.15 @QName: requireModuleName
883     @enDesc:
884     The list of <Perl::require>d Perl module names
885    
886     PropDef:
887 wakaba 1.1 @QName: sourceModule
888     @enDesc:
889     The soruce module name URI reference.
890    
891     PropDef:
892     @QName: sourceFor
893     @enDesc:
894     The source module <QUOTE::for> URI reference.
895    
896     PropDef:
897     @QName: currentPackage
898     @enDesc:
899     The current Perl package name (used for stringify).
900    
901     PropDef:
902     @QName: currentChunk
903     @enDesc:
904     The current code chunk (used for stringify).
905    
906     ClsDef:
907     @ClsQName: ManakaiPerlPackageScope
908 wakaba 1.16 @ClsISA: ManakaiPerlStatementContainer
909    
910     @enDesc:
911     A Perl lexical lines for which a <Perl::package> declaration
912     in effect.
913 wakaba 1.1
914     @Attr:
915     @@Name: packageName
916     @@Type:
917 wakaba 1.12 Perl:package-name::ManakaiDOM:all
918 wakaba 1.1 @@enDesc:
919     The fully-qualified package name.
920     @@Get:
921     @@@disDef:
922     @@@@GetProp: packageName
923    
924     @IntMethod:
925     @@Name:newObject
926     @@ManakaiDOM:isStatic:1
927     @@Description:
928     @@@lang:en
929     @@@@:
930     Creates a new instance object for <Class::ManakaiPerlPackageScope>.
931     @@Return:
932     @@@Type:
933     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
934     @@@Description:
935     @@@@lang:en
936     @@@@@:
937     The newly created node object.
938     @@@PerlDef:
939     @@@@@:
940     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
941     ::ManakaiDOM:Perl.new>;
942 wakaba 1.15 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:sub>,
943 wakaba 1.16 <Q::dis2pm:operator>,
944     <Q::pc:childNodes>;
945 wakaba 1.1 push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
946     $node->{<Q::pc:sub>} = {};
947 wakaba 1.14 $node->{<Q::dis2pm:operator>} = {};
948 wakaba 1.1 $node->{<Q::dis:ISA>} = [];
949     $node->{<Q::dis:Implement>} = {};
950 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'package';
951 wakaba 1.16 $node->{<Q::pc:childNodes>} = [];
952 wakaba 1.6 @@@@ImplNote:
953     @@@@@lang:en
954     @@@@@@:
955 wakaba 1.14 Properties: <Q::pc:sub>, <Q::dis2pm:operator>,
956 wakaba 1.6 <Q::dis:ISA>, <Q::dis:Implement>,
957 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
958 wakaba 1.18 <Q::pc:requireResourceURI>, <Q::pc:childNodes>,
959 wakaba 1.19 <Q::pc:export>, <Q::pc:requireModuleName>.
960 wakaba 1.1
961     @Method:
962     @@Name: getSub
963     @@enDesc:
964     Gets a subroutine.
965     @@Param:
966     @@@Name: subName
967     @@@Type:
968     DISPerl:SubName::ManakaiDOM:all
969     @@@enDesc:
970     The name of subroutine to get.
971     @@NamedParam:
972     @@@Name: makeNewNode
973     @@@Type:
974 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
975 wakaba 1.1 @@@enDesc:
976     Whether a new subroutine object should be created,
977     if it is not exist, or not.
978     @@Return:
979     @@@Type: ManakaiPerlSub
980     @@@enDesc:
981     The subroutine object.
982 wakaba 1.4 @@@nullCase:
983     @@@@enDesc:
984     Either the specified subroutine is not found and
985     the <P::makeNewNode> parameter is set to <DOM::false> or
986     the subroutine is defined as an alias.
987 wakaba 1.1 @@@PerlDef:
988     if ($self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}) {
989 wakaba 1.4 $r = ref $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
990     ? $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName} : null;
991 wakaba 1.1 } elsif ($makeNewNode) {
992     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
993     = <ClassM::ManakaiPerlSub.newObject>;
994     $self->{<Q::TreeCore:node>}
995     -><M::ManakaiDOM:ManakaiDOMNodeObject
996     ::ManakaiDOM:Perl.importTree> ($r);
997     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
998     $r->{<Q::pc:localName>} = $subName;
999     }
1000 wakaba 1.6 if ($r) {
1001     __CODE{ManakaiNode:getNewReference::
1002     $object => $r, $ref => $r,
1003     $class => {<ClassName::ManakaiPerlSub>}}__;
1004     }
1005 wakaba 1.1
1006 wakaba 1.4 @Method:
1007 wakaba 1.5 @@Name: setSub
1008     @@enDesc:
1009     Sets a subrotine.
1010     @@Param:
1011     @@@Name: subName
1012     @@@Type:
1013     DISLang:String::ManakaiDOM:all
1014     @@@enDesc:
1015     The name of the subroutine.
1016     \
1017     {NOTE:: The <P::subName> value must be equal to the
1018     <A::ManakaiPerlSub.localName> of the <P::subArg>.
1019     @@Param:
1020     @@@Name: subArg
1021     @@@Type: ManakaiPerlSub
1022     @@@enDesc:
1023     The subroutine object.
1024     @@Return:
1025     @@@RaiseException:
1026     @@@@@:IN_USE_NODE_ERR
1027     @@@@enDesc:
1028     An attempt is made to set a subroutine that is
1029     already used elsewhere.
1030     @@@PerlDef:
1031     my $ops = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>};
1032     if (ref $ops->{$subName}) {
1033     CORE::delete $ops->{<Q::pc:parent>};
1034     $ops->{$subName}
1035     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1036     }
1037     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1038     __EXCEPTION{IN_USE_NODE_ERR::
1039     pc:childNode => {$subArg},
1040     }__;
1041     }
1042     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1043     ($subArg->{<Q::TreeCore:node>});
1044     $ops->{$subName} = $subArg->{<Q::TreeCore:node>};
1045     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1046     = $self->{<Q::TreeCore:node>};
1047    
1048     @Method:
1049 wakaba 1.4 @@Name: getSubAliasName
1050     @@enDesc:
1051     Gets the real name of a subroutine.
1052     @@Param:
1053     @@@Name: subName
1054     @@@Type:
1055     DISLang:String::ManakaiDOM:all
1056     @@@enDesc:
1057     The name of the alias subroutine.
1058     @@Return:
1059     @@@Type:
1060     DISLang:String::ManakaiDOM:all
1061     @@@enDesc:
1062     The real name.
1063     @@@nullCase:
1064     @@@@enDesc:
1065     The specified name is used.
1066     @@@InCase:
1067     @@@@Value:\#CODE
1068     @@@@enDesc:
1069     The specified name is not an alias.
1070     @@@PerlDef:
1071     if ($self->{<Q::TreeCore:node>}->{<Q::sub>}->{$subName}) {
1072     $r = ref $self->{<Q::TreeCore:node>}
1073     ->{<Q::sub>}->{$subName}
1074     ? q<#CODE> : $self->{<Q::TreeCore:node>}
1075     ->{<Q::sub>}->{$subName};
1076     }
1077    
1078     @Method:
1079     @@Name: setSubAliasName
1080     @@enDesc:
1081     Sets a subroutine name as an alias of another subroutine.
1082     @@Param:
1083     @@@Name: aliasName
1084     @@@Type:
1085     DISLang:String::ManakaiDOM:all
1086     @@@enDesc:
1087     The alias name.
1088     @@Param:
1089     @@@Name: realName
1090     @@@Type:
1091     DISLang:String::ManakaiDOM:all
1092     @@@enDesc:
1093     The real name.
1094     @@Return:
1095     @@@UnknownOperatorException:
1096     @@@PerlDef:
1097     my $ops = $self->{<Q::TreeCore:node>}->{<Q::sub>};
1098     if (ref $ops->{$aliasName}) {
1099     CORE::delete $ops->{<Q::pc:parent>};
1100     $ops->{$aliasName}
1101     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1102     }
1103     $ops->{$aliasName} = $realName;
1104    
1105     @Method:
1106     @@Name: getOverloadSub
1107     @@enDesc:
1108     Gets an overloading subroutine.
1109     @@Param:
1110     @@@Name: opName
1111     @@@Type:
1112     DISLang:String::ManakaiDOM:all
1113     @@@enDesc:
1114     The name of the overloaded operator.
1115     @@NamedParam:
1116     @@@Name: makeNewNode
1117     @@@Type:
1118 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
1119 wakaba 1.4 @@@enDesc:
1120     Whether a new subroutine object should be created,
1121     if it is not exist, or not.
1122     @@Return:
1123     @@@Type: ManakaiPerlSub
1124     @@@enDesc:
1125     The subroutine object.
1126     @@@nullCase:
1127     @@@@enDesc:
1128     Either the specified subroutine is not found and
1129     the <P::makeNewNode> parameter is set to <DOM::false> or
1130     the specified operator is overloaded by specifying method name.
1131     @@@UnknownOperatorException:
1132     @@@PerlDef:
1133     unless (<Code::operatorNameList>->{$opName}) {
1134     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1135     pc:operator => {$opName},
1136     }__;
1137     }
1138     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
1139     $r = ref $self->{<Q::TreeCore:node>}
1140     ->{<Q::dis2pm:operator>}->{$opName}
1141     ? $self->{<Q::TreeCore:node>}
1142     ->{<Q::dis2pm:operator>}->{$opName} : null;
1143     } elsif ($makeNewNode) {
1144     $r = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}
1145     = <ClassM::ManakaiPerlSub.newObject>;
1146     $self->{<Q::TreeCore:node>}
1147     -><M::ManakaiDOM:ManakaiDOMNodeObject
1148     ::ManakaiDOM:Perl.importTree> ($r);
1149     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
1150     }
1151 wakaba 1.6 if ($r) {
1152     __CODE{ManakaiNode:getNewReference::
1153     $object => $r, $ref => $r,
1154     $class => {<ClassName::ManakaiPerlSub>}}__;
1155     }
1156 wakaba 1.4
1157     @Method:
1158 wakaba 1.5 @@Name: setOverloadSub
1159     @@enDesc:
1160     Sets an overloading subrotine.
1161     @@Param:
1162     @@@Name: opName
1163     @@@Type:
1164     DISLang:String::ManakaiDOM:all
1165     @@@enDesc:
1166     The name of the opeartor to overload.
1167     @@Param:
1168     @@@Name: subArg
1169     @@@Type: ManakaiPerlSub
1170     @@@enDesc:
1171     The subroutine object.
1172     @@Return:
1173     @@@UnknownOperatorException:
1174     @@@RaiseException:
1175     @@@@@:IN_USE_NODE_ERR
1176     @@@@enDesc:
1177     An attempt is made to set a subroutine that is
1178     already used elsewhere.
1179     @@@PerlDef:
1180     unless (<Code::operatorNameList>->{$opName}) {
1181     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1182     pc:operator => {$opName},
1183     }__;
1184     }
1185     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
1186     if (ref $ops->{$opName}) {
1187     CORE::delete $ops->{<Q::pc:parent>};
1188     $ops->{$opName}
1189     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1190     }
1191     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1192     __EXCEPTION{IN_USE_NODE_ERR::
1193     pc:parentNode => {$self},
1194     pc:childNode => {$subArg},
1195     }__;
1196     }
1197     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1198     ($subArg->{<Q::TreeCore:node>});
1199     $ops->{$opName} = $subArg->{<Q::TreeCore:node>};
1200     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1201     = $self->{<Q::TreeCore:node>};
1202    
1203    
1204     @Method:
1205 wakaba 1.4 @@Name: getOverloadMethodName
1206     @@enDesc:
1207     Gets an overloading method name.
1208     @@Param:
1209     @@@Name: opName
1210     @@@Type:
1211     DISLang:String::ManakaiDOM:all
1212     @@@enDesc:
1213     The name of the overloaded operator.
1214     @@Return:
1215     @@@Type:
1216     DISLang:String::ManakaiDOM:all
1217     @@@enDesc:
1218     The method name.
1219     @@@nullCase:
1220     @@@@enDesc:
1221     The specified operator is not overloaded.
1222     @@@InCase:
1223     @@@@Value:\#CODE
1224     @@@@enDesc:
1225     The operator is overloaded by an anonymous subroutine.
1226     @@@PerlDef:
1227     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
1228     $r = ref $self->{<Q::TreeCore:node>}
1229     ->{<Q::dis2pm:operator>}->{$opName}
1230     ? q<#CODE> : $self->{<Q::TreeCore:node>}
1231     ->{<Q::dis2pm:operator>}->{$opName};
1232     }
1233    
1234     @Method:
1235     @@Name: setOverloadMethodName
1236     @@enDesc:
1237     Sets an overloading method name.
1238     @@Param:
1239     @@@Name: opName
1240     @@@Type:
1241     DISLang:String::ManakaiDOM:all
1242     @@@enDesc:
1243     The name of the overloaded operator.
1244     @@Param:
1245     @@@Name: methodName
1246     @@@Type:
1247     DISLang:String::ManakaiDOM:all
1248     @@@enDesc:
1249     The name of the method by which overloads an operator.
1250     \
1251     {NOTE:: The method may or may not belong to this package.
1252     \
1253     }
1254     @@Return:
1255     @@@UnknownOperatorException:
1256     @@@PerlDef:
1257     unless (<Code::operatorNameList>->{$opName}) {
1258     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1259     pc:operator => {$opName},
1260     }__;
1261     }
1262     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
1263     if (ref $ops->{$opName}) {
1264     CORE::delete $ops->{<Q::pc:parent>};
1265     $ops->{$opName}
1266     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1267     }
1268     $ops->{$opName} = $methodName;
1269    
1270 wakaba 1.1 @Method:
1271 wakaba 1.13 @@Name: addISAPackage
1272 wakaba 1.1 @@enDesc:
1273     Adds a class package that this class inherits.
1274     @@Param:
1275     @@@Name: packageName
1276     @@@Type:
1277     Perl:package-name::ManakaiDOM:all
1278     @@@enDesc:
1279     The name of package to add.
1280     @@Return:
1281     @@@PerlDef:
1282     push @{$self->{<Q::TreeCore:node>}->{<Q::dis:ISA>}}, $packageName;
1283    
1284     @Method:
1285     @@Name: addImplementPackage
1286     @@enDesc:
1287     Adds a interface package that this class implements.
1288     @@Param:
1289     @@@Name: packageName
1290     @@@Type:
1291     Perl:package-name::ManakaiDOM:all
1292     @@@enDesc:
1293     The name of package to add.
1294     @@Return:
1295     @@@PerlDef:
1296     $self->{<Q::TreeCore:node>}->{<Q::dis:Implement>}->{$packageName} = true;
1297    
1298     @ToStringMethod:
1299     @@Return:
1300     @@@Type:
1301 wakaba 1.12 DISLang:String::ManakaiDOM:all
1302 wakaba 1.1 @@@enDesc:
1303     Perl code.
1304     @@@PerlDef:
1305     my $file = $self-><AG::ManakaiPerlCodeFragment.parentNode>;
1306     my $node = $self->{<Q::TreeCore:node>};
1307 wakaba 1.15
1308     ## Package name
1309 wakaba 1.1 my $pn = $node->{<Q::pc:packageName>};
1310     $r .= q<package > . $pn . ";\n";
1311 wakaba 1.15
1312     ## Package version
1313 wakaba 1.1 __DEEP{
1314     $file-><AS::ManakaiPerlFile.currentPackage> ($pn);
1315     $r .= 'our $VERSION = '.
1316     <ClassM::ManakaiPerlCodeImplementation.versionDateTime> (time).
1317     ";\n";
1318     }__;
1319 wakaba 1.15
1320     ## Inheritance
1321 wakaba 1.1 my @isa = (@{$node->{<Q::dis:ISA>}},
1322     sort keys %{$node->{<Q::dis:Implement>}});
1323     if (@isa) {
1324     $r .= 'push our @ISA, ' .
1325     <ClassM::ManakaiPerlCodeImplementation.perlList> (\@isa) .
1326     ";\n";
1327     }
1328 wakaba 1.15
1329     ## Uses
1330     my $use = $self-><M::ManakaiPerlCodeFragment.getUsePerlModuleNameList>;
1331     for my $pack (@$use) {
1332     $r .= 'use ' . $pack . ";\n";
1333     }
1334    
1335 wakaba 1.16 ## Package-scope objects
1336     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
1337     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1338     $r .= $cn->stringify;
1339     }
1340    
1341 wakaba 1.15 ## Subroutines
1342 wakaba 1.4 for my $cnk (keys %{$node->{<Q::pc:sub>}}) {
1343     my $cno = $node->{<Q::pc:sub>}->{$cnk};
1344     if (ref $cno) {
1345 wakaba 1.6 my $cn;
1346     __CODE{ManakaiNode:getWeakReference::
1347     $object => $cno, $ref => $cn,
1348     $class => {<ClassName::ManakaiPerlSub>}}__;
1349 wakaba 1.4 $r .= $cn->stringify;
1350     } else {
1351 wakaba 1.19 $r .= qq<*$cnk = \\&$cno;\n>;
1352 wakaba 1.4 }
1353     }
1354 wakaba 1.15
1355     ## Operators
1356 wakaba 1.4 my $op = '';
1357     for my $cnk (keys %{$node->{<Q::dis2pm:operator>}}) {
1358     my $cno = $node->{<Q::dis2pm:operator>}->{$cnk};
1359     if (ref $cno) {
1360 wakaba 1.6 my $cn;
1361     __CODE{ManakaiNode:getWeakReference::
1362     $object => $cno, $ref => $cn,
1363     $class => {<ClassName::ManakaiPerlSub>}}__;
1364 wakaba 1.4 $op .= <ClassM::ManakaiPerlCodeImplementation.perlLiteral> ($cnk)
1365     . ' => ' . $cn->stringify . ', ';
1366     } elsif (defined $cno) {
1367     $op .= <ClassM::ManakaiPerlCodeImplementation.perlList>
1368     ([$cnk => $cno]) . ', ';
1369     }
1370     }
1371 wakaba 1.14 $r .= 'use overload bool => sub () {1}, ' .
1372     $op . qq[fallback => 1;\n] if $op;
1373 wakaba 1.18
1374    
1375     ## -- Exports
1376     if (keys %{$node->{<Q::pc:export>} || {}}) {
1377     $r .= q[our %EXPORT_TAG = (] .
1378     <ClassM::ManakaiPerlCodeImplementation.perlList>
1379     ([map {$_ => [keys %{$node->{<Q::pc:export>}->{$_}}]}
1380     grep {$_} keys %{$node->{<Q::pc:export>}}]) . qq[);\n];
1381     $r .= q[our @EXPORT_OK = (] .
1382     <ClassM::ManakaiPerlCodeImplementation.perlList>
1383     ([map {keys %{$node->{<Q::pc:export>}->{$_}}}
1384     keys %{$node->{<Q::pc:export>}}]) . qq[);\n];
1385     $r .= q[use Exporter; push our @ISA, 'Exporter';] . qq[\n];
1386     }
1387    
1388     @Method:
1389     @@Name: addExport
1390     @@enDesc:
1391     Adds a name to the list of exported items (<Perl::@EXPORT_OK).
1392     @@Param:
1393     @@@Name: exportTag
1394     @@@Type:
1395     lang:Perl::ManakaiDOM:all
1396     @@@enDesc:
1397     The name of the tag (without <CHAR::COLON> prefix).
1398     The <P::exportName> is added both to <Perl::@EXPORT_OK>
1399     and <Perl::$EXPORT_OK{<P::exportTag>}>.
1400     @@@nullCase:
1401     @@@@enDesc:
1402     The <P::exportName> is added only to the <Perl::@EXPORT_OK>.
1403     @@Param:
1404     @@@Name: exportName
1405     @@@Type:
1406     lang:Perl::ManakaiDOM:all
1407     @@@enDesc:
1408     The name to be exported.
1409     @@Return:
1410     @@@PerlDef:
1411     $self->{<Q::TreeCore:node>}->{<Q::pc:export>}
1412     ->{defined $exportTag ? $exportTag : ''}->{$exportName} = true;
1413 wakaba 1.1 ##PerlPackageScope
1414    
1415 wakaba 1.4 PropDef:
1416     @QName:
1417     dis2pm:operator
1418     @enDesc:
1419     Overloaded operators.
1420    
1421     ElementTypeBinding:
1422     @Name: UnknownOperatorException
1423     @ElementType:
1424     ManakaiDOM:raises
1425     @ShadowContent:
1426     @@@:UNSUPPORTED_OPERATOR_ERR
1427     @@enDesc:
1428     An attempt is made to overload an unknown operator.
1429    
1430     XParamDef:
1431     @QName:
1432     pc:operator
1433     @enDesc:
1434     An operator to overload.
1435    
1436     ResourceDef:
1437     @QName: operatorNameList
1438     @enDesc:
1439     The list of valid operators for <PerlModule::operator> pragma.
1440     @rdf:type:
1441     dis2pm:InlineCode
1442     @PerlDef:
1443     {qw[
1444     + 1 - 1 * 1 / 1 % 1 ** 1 << 1 >> 1 x 1 . 1
1445     += 1 -= 1 *= 1 /= 1 %= 1 **= 1 <<= 1 >>= 1 x= 1 .= 1
1446     < 1 <= 1 > 1 >= 1 == 1 != 1 <=> 1
1447     lt 1 le 1 gt 1 ge 1 eq 1 ne 1 cmp 1
1448     & 1 | 1 ^ 1 neg 1 ! 1 ~ 1
1449     ++ 1 -- 1 = 1
1450     atan2 1 cos 1 sin 1 exp 1 abs 1 log 1 sqrt 1
1451     bool 1 "" 1 0+ 1 ${} 1 @{} 1 %{} 1 &{} 1 *{} 1 <> 1
1452     nomethod 1
1453     ]}
1454    
1455 wakaba 1.1 ClsDef:
1456 wakaba 1.6 @ClsQName: ManakaiPerlStatementContainer
1457     @ClsISA: ManakaiPerlAnyContainer
1458 wakaba 1.1 @enDesc:
1459 wakaba 1.6 A base class for node types that contains zero or more
1460     statements and/or blocks.
1461 wakaba 1.1
1462     @Attr:
1463 wakaba 1.10 @@Name: sourceFile
1464     @@enDesc:
1465     The source file name of this fragment.
1466     @@Type:
1467 wakaba 1.12 DISLang:String::ManakaiDOM:all
1468 wakaba 1.10 @@Get:
1469     @@@enDesc:
1470     Any string identifying the source.
1471     @@@nullCase:
1472     @@@@enDesc: No source file name is set.
1473     @@@disDef:
1474     @@@@GetProp: sourceFile
1475     @@Set:
1476     @@@nullCase:
1477     @@@@enDesc: No (or unknown) source file.
1478     @@@disDef:
1479     @@@@SetProp: sourceFile
1480    
1481     @Attr:
1482     @@Name: sourceLine
1483     @@enDesc:
1484     Source file line number of the first line of this fragment.
1485     @@Type:
1486 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
1487 wakaba 1.10 @@Get:
1488     @@@disDef:
1489     @@@@GetProp: sourceLine
1490     @@Set:
1491     @@@disDef:
1492     @@@@SetProp: sourceLine
1493    
1494     @Attr:
1495 wakaba 1.1 @@Name: currentSourceFile
1496     @@enDesc:
1497     The current source file name that is referred when
1498     a code fragment is added.
1499     @@Type:
1500 wakaba 1.12 DISLang:String::ManakaiDOM:all
1501 wakaba 1.1 @@Get:
1502     @@@nullCase:
1503     @@@@enDesc: No source file name is set.
1504     @@@disDef:
1505 wakaba 1.10 @@@@GetProp:currentSourceFile
1506 wakaba 1.1 @@Set:
1507     @@@nullCase:
1508     @@@@enDesc: No (or unknown) source file.
1509     @@@disDef:
1510 wakaba 1.10 @@@@SetProp:currentSourceFile
1511 wakaba 1.1
1512     @Attr:
1513     @@Name: currentSourceLine
1514     @@enDesc:
1515     The current line number in source file that is referred when
1516     a code fragment is added.
1517     @@Type:
1518 wakaba 1.6 DOMMain:unsigned-long::ManakaiDOM:all
1519 wakaba 1.1 @@Get:
1520     @@@disDef:
1521 wakaba 1.10 @@@@GetProp:currentSourceLine
1522 wakaba 1.1 @@Set:
1523     @@@disDef:
1524 wakaba 1.10 @@@@SetProp:currentSourceLine
1525 wakaba 1.1
1526     @Method:
1527 wakaba 1.5 @@Name: appendCodeFragment
1528     @@enDesc:
1529     Appends a <Class::ManakaiPerlCodeFragment> object.
1530     @@Param:
1531     @@@Name: codeArg
1532     @@@Type: ManakaiPerlCodeFragment
1533     @@@enDesc:
1534     A code fragment object.
1535     @@Return:
1536     @@@RaiseException:
1537     @@@@@:BAD_CHILD_ERR
1538     @@@@enDesc:
1539     An attempt is made to append a child
1540     that is not a <Class::ManakaiPerlUnparsedCode>.
1541     @@@RaiseException:
1542     @@@@@:IN_USE_NODE_ERR
1543     @@@@enDesc:
1544     An attempt is made to append a node that is
1545     already used elsewhere.
1546     @@@PerlDef:
1547 wakaba 1.6 if ({
1548     unparsed => 1, if => 1, statement => 1, block => 1,
1549 wakaba 1.9 blockcontainer => true,
1550 wakaba 1.6 inunparsed => 1, variable => 1, bare => 1, atom => 1,
1551     incontainer => 1, string => 1, assign => 1,
1552     }->{$codeArg->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1553 wakaba 1.5 if ($codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1554     __EXCEPTION{IN_USE_NODE_ERR::
1555     pc:childNode => {$codeArg},
1556     }__;
1557     }
1558     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1559     ($codeArg->{<Q::TreeCore:node>});
1560     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}},
1561     $codeArg->{<Q::TreeCore:node>};
1562     $codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1563     = $self->{<Q::TreeCore:node>};
1564     } else {
1565     __EXCEPTION{BAD_CHILD_ERR::
1566     pc:parentNode => {$self},
1567     pc:childNode => {$codeArg},
1568     }__;
1569     }
1570    
1571     @Method:
1572 wakaba 1.1 @@Name: appendCode
1573     @@enDesc:
1574     Appends an unparsed Perl code fragment.
1575     @@Param:
1576     @@@Name: codeArg
1577     @@@Type:
1578     lang:Perl::ManakaiDOM:all
1579     @@@enDesc:
1580     An unparsed Perl code fragment.
1581     @@Return:
1582     @@@Type: ManakaiPerlUnparsedCode
1583     @@@enDesc:
1584     The newly created Perl code object.
1585     @@@PerlDef:
1586     $r = <ClassM::ManakaiPerlUnparsedCode.newObject>;
1587     my $node = $self->{<Q::TreeCore:node>};
1588 wakaba 1.10 $r->{<Q::sourceFile>} = $node->{<Q::pc:currentSourceFile>};
1589     $r->{<Q::sourceLine>} = $node->{<Q::pc:currentSourceLine>};
1590 wakaba 1.1 $r->{<Q::code>} = $codeArg;
1591 wakaba 1.10 $node->{<Q::pc:currentSourceLine>} += ($codeArg =~ tr/\x0A/\x0A/);
1592 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1593     ::ManakaiDOM:Perl.importTree> ($r);
1594     push @{$node->{<Q::pc:childNodes>}}, $r;
1595     $r->{<Q::pc:parent>} = $node;
1596     __CODE{ManakaiNode:getNewReference::
1597     $object => $r, $ref => $r,
1598     $class =>{<ClassName::ManakaiPerlUnparsedCode>},
1599     }__;
1600 wakaba 1.1
1601     @Method:
1602     @@Name: skipLines
1603     @@enDesc:
1604     Skips lines in a code.
1605     @@Param:
1606     @@@Name: codeArg
1607     @@@Type:
1608     lang:Perl::ManakaiDOM:all
1609     @@@enDesc:
1610     A code fragment, which is counted lines.
1611     @@Return:
1612     @@@PerlDef:
1613 wakaba 1.10 $self->{<Q::TreeCore:node>}->{<Q::pc:currentSourceLine>}
1614 wakaba 1.1 += ($codeArg =~ tr/\x0A/\x0A/);
1615 wakaba 1.4
1616 wakaba 1.6 @ImplNote:
1617     @@lang:en
1618     @@@:
1619     A <Class::ManakaiPerlStatementContainer> object must have
1620     a property:
1621     <Q::pc:childNodes>.
1622 wakaba 1.8
1623     @Attr:
1624     @@Name: label
1625     @@enDesc:
1626     Label for this block.
1627     @@Type:
1628     DISLang:String::ManakaiDOM:all
1629     @@Get:
1630     @@@nullCase:
1631     @@@@enDesc:
1632     No label.
1633     @@@disDef:
1634     @@@@GetProp:label
1635     @@Set:
1636     @@@nullCase:
1637     @@@@enDesc:
1638     No label.
1639     @@@disDef:
1640     @@@@SetProp:label
1641    
1642     @Method:
1643     @@Name: appendBlock
1644     @@enDesc:
1645     Appends a Perl block code.
1646     @@Return:
1647     @@@Type: ManakaiPerlBlock
1648     @@@enDesc:
1649     The newly created Perl code object.
1650     @@@PerlDef:
1651     $r = <ClassM::ManakaiPerlBlock.newObject>;
1652     my $node = $self->{<Q::TreeCore:node>};
1653     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1654     ::ManakaiDOM:Perl.importTree> ($r);
1655     push @{$node->{<Q::pc:childNodes>}}, $r;
1656     $r->{<Q::pc:parent>} = $node;
1657     if (defined wantarray) {
1658     __CODE{ManakaiNode:getNewReference::
1659     $object => $r, $ref => $r,
1660     $class =>{<ClassName::ManakaiPerlBlock>},
1661     }__;
1662     }
1663    
1664     @Method:
1665     @@Name: appendStatement
1666     @@enDesc:
1667     Appends a Perl statement.
1668     @@Param:
1669     @@@Name: codeArg
1670     @@@Type:
1671     lang:Perl::ManakaiDOM:all
1672     @@@enDesc:
1673     A Perl statement without terminating <Perl::;>.
1674     @@@nullCase:
1675     @@@@enDesc:
1676     No initial content.
1677     @@Return:
1678     @@@Type: ManakaiPerlStatement
1679     @@@enDesc:
1680     The newly created Perl code object.
1681     @@@PerlDef:
1682     $r = <ClassM::ManakaiPerlStatement.newObject>;
1683     my $node = $self->{<Q::TreeCore:node>};
1684     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1685     ::ManakaiDOM:Perl.importTree> ($r);
1686     push @{$node->{<Q::pc:childNodes>}}, $r;
1687     $r->{<Q::pc:parent>} = $node;
1688     if (defined wantarray or defined $codeArg) {
1689     __CODE{ManakaiNode:getNewReference::
1690     $object => $r, $ref => $r,
1691     $class =>{<ClassName::ManakaiPerlStatement>},
1692     }__;
1693     if (defined $codeArg) {
1694     __DEEP{
1695     $r-><M::ManakaiPerlAnyContainer.appendBare> ($codeArg);
1696     }__;
1697     }
1698     }
1699 wakaba 1.12
1700     @Method:
1701     @@Name: appendNewIf
1702     @@enDesc:
1703     Appends a newly created <Class::ManakaiPerlIf> object.
1704     @@Param:
1705     @@@Name: conditionArg
1706     @@@Type: ManakaiPerlCodeFragment
1707     @@@enDesc:
1708     Conditoon code fragment object.
1709     @@Param:
1710     @@@Name: trueArg
1711     @@@Type: ManakaiPerlCodeFragment
1712     @@@enDesc:
1713     A true code fragment object.
1714     @@@nullCase:
1715     @@@@enDesc: No true code.
1716     @@Param:
1717     @@@Name: falseArg
1718     @@@Type: ManakaiPerlCodeFragment
1719     @@@enDesc:
1720     A false code fragment object.
1721     @@@nullCase:
1722     @@@@enDesc: No false code.
1723     @@Return:
1724     @@@RaiseException:
1725     @@@@@:BAD_CHILD_ERR
1726     @@@@enDesc:
1727     An attempt is made to append a child
1728     that is not valid type.
1729     @@@RaiseException:
1730     @@@@@:IN_USE_NODE_ERR
1731     @@@@enDesc:
1732     An attempt is made to append a node that is
1733     already used elsewhere.
1734     @@@PerlDef:
1735     for my $arg ([conditionArg => $conditionArg]) {
1736     if ({
1737     atom => 1, bare => 1, incontainer => 1, assign => true,
1738     inunparsed => 1, variable => 1, string => true,
1739     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1740     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1741     __EXCEPTION{IN_USE_NODE_ERR::
1742     pc:childNode => {$arg->[1]},
1743     MDOMX:param-name => {$arg->[0]},
1744     }__;
1745     }
1746     } else {
1747     __EXCEPTION{BAD_CHILD_ERR::
1748     pc:parentNode => {$self},
1749     pc:childNode => {$arg->[1]},
1750     MDOMX:param-name => {$arg->[0]},
1751     }__;
1752     }
1753     } # c
1754    
1755     for my $arg ([trueArg => $trueArg],
1756     [falseArg => $falseArg]) {
1757     next unless $arg->[1];
1758     if ({
1759     blockcontainer => true,
1760     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1761     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1762     __EXCEPTION{IN_USE_NODE_ERR::
1763     pc:childNode => {$arg->[1]},
1764     MDOMX:param-name => {$arg->[0]},
1765     }__;
1766     }
1767     } else {
1768     __EXCEPTION{BAD_CHILD_ERR::
1769     pc:parentNode => {$self},
1770     pc:childNode => {$arg->[1]},
1771     MDOMX:param-name => {$arg->[0]},
1772     }__;
1773     }
1774     } # t/f
1775    
1776     my $assign = <ClassM::ManakaiPerlIf.newObject>;
1777     $assign->{<Q::pc:condition>} = $conditionArg->{<Q::TreeCore:node>};
1778     $assign->{<Q::pc:true>} = $trueArg->{<Q::TreeCore:node>} if $trueArg;
1779     $assign->{<Q::pc:false>} = $falseArg->{<Q::TreeCore:node>} if $falseArg;
1780     $conditionArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
1781     $trueArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $trueArg;
1782     $falseArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $falseArg;
1783     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree> ($assign);
1784     $assign->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
1785     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $assign;
1786 wakaba 1.6 ##PerlStatementContainer
1787    
1788     ClsDef:
1789     @ClsQName: ManakaiPerlSub
1790     @ClsISA: ManakaiPerlStatementContainer
1791     @enDesc:
1792     Perl subroutines.
1793    
1794     @IntMethod:
1795     @@Name:newObject
1796     @@ManakaiDOM:isStatic:1
1797     @@Description:
1798     @@@lang:en
1799     @@@@:
1800     Creates a new instance object for <Class::ManakaiPerlSub>.
1801     @@Return:
1802     @@@Type:
1803     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1804     @@@Description:
1805     @@@@lang:en
1806     @@@@@:
1807     The newly created node object.
1808     @@@PerlDef:
1809     @@@@@:
1810     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1811     ::ManakaiDOM:Perl.new>;
1812     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
1813     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1814     $node->{<Q::pc:childNodes>} = [];
1815     $node->{<Q::pc:sourceLine>} = 0;
1816     $node->{<Q::pc:nodeType>} = 'sub';
1817     @@@@ImplNote:
1818     @@@@@lang:en
1819     @@@@@@:
1820     Optional properties: <Q::pc:localName>,
1821     <Q::pc:sourceFile>, <Q::pc:sourceLine>,
1822 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
1823 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
1824 wakaba 1.6
1825 wakaba 1.20 @IntCloneMethod:
1826     @@Return:
1827     @@@Type:
1828     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1829     @@@PerlDef:
1830     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1831     ::ManakaiDOM:Perl.new>;
1832     $node->{<Q::pc:nodeType>} = 'sub';
1833     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1834     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
1835     for my $prop (<Q::pc:sourceFile>, <Q::pc:sourceLine>) {
1836     $node->{$prop} = $nodeObject->{$prop};
1837     }
1838     $node->{<Q::pc:requireResourceURI>}
1839     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
1840     $node->{<Q::pc:useModuleName>}
1841     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
1842     $node->{<Q::pc:requireModuleName>}
1843     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
1844     $node->{<Q::pc:childNodes>} = [];
1845     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
1846     my $pack;
1847     my $nt = $cno->{<Q::pc:nodeType>};
1848     __CODE{pc:nodeTypeToPackageName::
1849     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
1850     ## NOTE: Method name written directly
1851     my $cno_clone = $pack->_make_clone_object ($cno);
1852     push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
1853     $cno_clone->{<Q::pc:parent>} = $node;
1854     ## NOTE: Tree ID is not updated yet.
1855     }
1856    
1857 wakaba 1.6 @Attr:
1858     @@Name: localName
1859     @@enDesc:
1860     The name of this subroutine.
1861     @@Type:
1862 wakaba 1.12 DISPerl:SubName::ManakaiDOM:all
1863 wakaba 1.6 @@Get:
1864     @@@nullCase:
1865     @@@@enDesc:
1866     This subroutine has no name.
1867     @@@disDef:
1868     @@@@GetProp: localName
1869     @@Set:
1870     @@@enDesc:
1871     Sets the name of this subroutine.
1872     \
1873     {NOTE:: Setting this attribute does not change the
1874     name by which the subroutine is registerred to
1875     the parent object.
1876     \
1877     }
1878     @@@nullCase:
1879     @@@@enDesc:
1880     This subroutine has no name.
1881     @@@disDef:
1882     @@@@SetProp: localName
1883    
1884     @Attr:
1885     @@Name: prototype
1886     @@enDesc:
1887     The prototype of this subroutine.
1888     @@Type:
1889 wakaba 1.11 DISPerl:SubPrototype::ManakaiDOM:all
1890 wakaba 1.6 @@Get:
1891     @@@disDef:
1892     @@@@GetProp: prototype
1893     @@@nullCase:
1894     @@@@enDesc:
1895     No prototype is set.
1896     @@Set:
1897     @@@disDef:
1898     @@@@SetProp: prototype
1899     @@@nullCase:
1900     @@@@enDesc:
1901     No prototype declaration.
1902    
1903 wakaba 1.4 @ToStringMethod:
1904     @@Return:
1905     @@@Type:
1906 wakaba 1.11 DISLang:String::ManakaiDOM:all
1907 wakaba 1.4 @@@enDesc:
1908     Perl code.
1909     @@@PerlDef:
1910     my $node = $self->{<Q::TreeCore:node>};
1911     $r = q<sub>;
1912     $r .= ' ' . $node->{<Q::pc:localName>}
1913     if defined $node->{<Q::pc:localName>};
1914     $r .= ' (' . $node->{<Q::pc:prototype>} . ')'
1915     if defined $node->{<Q::pc:prototype>};
1916     $r .= " {\n";
1917 wakaba 1.6 for my $cno (@{$node->{<Q::pc:childNodes>}}) {
1918 wakaba 1.7 my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1919 wakaba 1.6 $r .= $cn->stringify;
1920     }
1921 wakaba 1.4 $r .= "}\n";
1922 wakaba 1.14
1923     @NumValMethod:
1924     @@Return:
1925     @@@Type:
1926     DISIDL:AnyRealNumber::ManakaiDOM:all
1927     @@@PerlDef:
1928     my $cno = $self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}->[-1];
1929     if ($cno) {
1930     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1931     $r = 0 + $cn;
1932     }
1933    
1934 wakaba 1.1 ##PerlSub
1935    
1936 wakaba 1.5 XParamDef:
1937     @QName: parentNode
1938     @enDesc:
1939     Parent node.
1940    
1941     XParamDef:
1942     @QName: childNode
1943     @enDesc:
1944     Child node.
1945    
1946 wakaba 1.1 ClsDef:
1947     @ClsQName: ManakaiPerlUnparsedCode
1948     @ClsISA: ManakaiPerlCodeFragment
1949     @enDesc:
1950     Unparsed Perl code fragments.
1951    
1952     @IntMethod:
1953     @@Name:newObject
1954     @@ManakaiDOM:isStatic:1
1955     @@Description:
1956     @@@lang:en
1957     @@@@:
1958     Creates a new instance object for <Class::ManakaiPerlUnparsedCode>.
1959     @@Return:
1960     @@@Type:
1961     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1962     @@@Description:
1963     @@@@lang:en
1964     @@@@@:
1965     The newly created node object.
1966     @@@PerlDef:
1967     @@@@@:
1968     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1969     ::ManakaiDOM:Perl.new>;
1970     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1971     $node->{<Q::pc:code>} = '';
1972 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'unparsed';
1973 wakaba 1.1 @@@@ImplNote:
1974     @@@@@lang:en
1975     @@@@@@:
1976 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:code>,
1977 wakaba 1.14 <Q::pc:sourceFile>, <Q::pc:sourceLine>,
1978     <Q::pc:useModuleName>,
1979 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
1980 wakaba 1.9
1981     @IntCloneMethod:
1982     @@Return:
1983     @@@Type:
1984     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1985     @@@PerlDef:
1986     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1987     ::ManakaiDOM:Perl.new>;
1988     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1989     for my $prop (<Q::pc:sourceFile>, <Q::pc:sourceLine>, <Q::pc:code>) {
1990     $node->{$prop} = $nodeObject->{$prop};
1991     }
1992     $node->{<Q::pc:nodeType>} = 'unparsed';
1993 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
1994     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
1995     $node->{<Q::pc:useModuleName>}
1996     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
1997 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
1998     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
1999 wakaba 1.5
2000     @Attr:
2001     @@Name: code
2002     @@enDesc:
2003     Perl code.
2004     @@Type:
2005     lang:Perl::ManakaiDOM:all
2006     @@Get:
2007     @@@disDef:
2008     @@@@GetProp: code
2009     @@Set:
2010     @@@disDef:
2011     @@@@SetProp: code
2012    
2013     @Attr:
2014     @@Name: sourceFile
2015     @@enDesc:
2016     The source file name of this fragment.
2017     @@Type:
2018 wakaba 1.12 DISLang:String::ManakaiDOM:all
2019 wakaba 1.5 @@Get:
2020     @@@enDesc:
2021     Any string identifying the source.
2022     @@@nullCase:
2023     @@@@enDesc: No source file name is set.
2024     @@@disDef:
2025     @@@@GetProp: sourceFile
2026     @@Set:
2027     @@@nullCase:
2028     @@@@enDesc: No (or unknown) source file.
2029     @@@disDef:
2030     @@@@SetProp: sourceFile
2031    
2032     @Attr:
2033     @@Name: sourceLine
2034     @@enDesc:
2035     Source file line number of the first line of this fragment.
2036     @@Type:
2037 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
2038 wakaba 1.5 @@Get:
2039     @@@disDef:
2040     @@@@GetProp: sourceLine
2041     @@Set:
2042     @@@disDef:
2043     @@@@SetProp: sourceLine
2044 wakaba 1.6
2045     @ToStringMethod:
2046     @@Return:
2047     @@@Type:
2048 wakaba 1.12 DISLang:String::ManakaiDOM:all
2049 wakaba 1.6 @@@enDesc:
2050     Perl code.
2051     @@@PerlDef:
2052     my $node = $self->{<Q::TreeCore:node>};
2053     __DEEP{
2054     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
2055 wakaba 1.19 $r = sprintf (qq<\n#line %d "%s [u] (Chunk #%d)"\n>,
2056 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
2057     $node->{<Q::pc:sourceFile>} ||
2058     $file-><AG::ManakaiPerlFile.sourceFile>,
2059 wakaba 1.6 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
2060     . $node->{<Q::pc:code>}
2061 wakaba 1.19 . sprintf (qq<\n#line 1 "%s [/u] (Chunk #%d)"\n>,
2062 wakaba 1.6 $file-><AG::ManakaiPerlFile.sourceFile>,
2063     $file-><M::ManakaiPerlFile.getNextChunkNumber>);
2064     }__;
2065 wakaba 1.1 ##PerlUnparsedCode
2066    
2067     ClsDef:
2068 wakaba 1.6 @ClsQName: ManakaiPerlInlineUnparsedCode
2069     @ClsISA: ManakaiPerlCodeFragment
2070     @enDesc:
2071     Unparsed Perl inline code fragments.
2072    
2073     @IntMethod:
2074     @@Name:newObject
2075     @@ManakaiDOM:isStatic:1
2076     @@Description:
2077     @@@lang:en
2078     @@@@:
2079     Creates a new instance object for
2080     <Class::ManakaiPerlInlineUnparsedCode>.
2081     @@Return:
2082     @@@Type:
2083     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2084     @@@Description:
2085     @@@@lang:en
2086     @@@@@:
2087     The newly created node object.
2088     @@@PerlDef:
2089     @@@@@:
2090     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2091     ::ManakaiDOM:Perl.new>;
2092     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2093     $node->{<Q::pc:code>} = '';
2094     $node->{<Q::pc:nodeType>} = 'inunparsed';
2095     @@@@ImplNote:
2096     @@@@@lang:en
2097     @@@@@@:
2098 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2099 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2100 wakaba 1.6
2101 wakaba 1.9 @IntCloneMethod:
2102     @@Return:
2103     @@@Type:
2104     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2105     @@@PerlDef:
2106     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2107     ::ManakaiDOM:Perl.new>;
2108     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2109     for my $prop (<Q::pc:code>) {
2110     $node->{$prop} = $nodeObject->{$prop};
2111     }
2112     $node->{<Q::pc:nodeType>} = 'inunparsed';
2113 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2114     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2115     $node->{<Q::pc:useModuleName>}
2116     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2117 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2118     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2119 wakaba 1.9
2120 wakaba 1.6 @Attr:
2121     @@Name: code
2122     @@enDesc:
2123     Perl code.
2124     @@Type:
2125     lang:Perl::ManakaiDOM:all
2126     @@Get:
2127     @@@disDef:
2128     @@@@GetProp: code
2129     @@Set:
2130     @@@disDef:
2131     @@@@SetProp: code
2132    
2133     @ToStringMethod:
2134     @@Return:
2135     @@@Type:
2136 wakaba 1.12 DISLang:String::ManakaiDOM:all
2137 wakaba 1.6 @@@enDesc:
2138     Perl code.
2139     @@@PerlDef:
2140     my $node = $self->{<Q::TreeCore:node>};
2141     $r = $node->{<Q::pc:code>};
2142     ##PerlInlineUnparsedCode
2143    
2144     ClsDef:
2145     @ClsQName: ManakaiPerlStringLiteral
2146     @ClsISA: ManakaiPerlCodeFragment
2147     @enDesc:
2148     Perl string literal.
2149    
2150     @IntMethod:
2151     @@Name:newObject
2152     @@ManakaiDOM:isStatic:1
2153     @@Description:
2154     @@@lang:en
2155     @@@@:
2156     Creates a new instance object for
2157     <Class::ManakaiPerlStringLiteral>.
2158     @@Return:
2159     @@@Type:
2160     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2161     @@@Description:
2162     @@@@lang:en
2163     @@@@@:
2164     The newly created node object.
2165     @@@PerlDef:
2166     @@@@@:
2167     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2168     ::ManakaiDOM:Perl.new>;
2169     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2170     $node->{<Q::infoset:data>} = '';
2171     $node->{<Q::pc:nodeType>} = 'string';
2172     @@@@ImplNote:
2173     @@@@@lang:en
2174     @@@@@@:
2175 wakaba 1.14 Properties: <Q::pc:nodeType>,
2176     <Q::infoset:data>, <Q::pc:useModuleName>,
2177 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2178 wakaba 1.6
2179 wakaba 1.9 @IntCloneMethod:
2180     @@Return:
2181     @@@Type:
2182     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2183     @@@PerlDef:
2184     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2185     ::ManakaiDOM:Perl.new>;
2186     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2187     for my $prop (<Q::infoset:data>) {
2188     $node->{$prop} = $nodeObject->{$prop};
2189     }
2190     $node->{<Q::pc:nodeType>} = 'string';
2191 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2192     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2193     $node->{<Q::pc:useModuleName>}
2194     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2195 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2196     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2197 wakaba 1.9
2198 wakaba 1.6 @Attr:
2199     @@Name: data
2200     @@enDesc:
2201     String data.
2202     @@Type:
2203     DISLang:String::ManakaiDOM:all
2204     @@Get:
2205     @@@disDef:
2206     @@@@GetProp:
2207     infoset:data
2208     @@Set:
2209     @@@disDef:
2210     @@@@SetProp:
2211     infoset:data
2212    
2213 wakaba 1.14 @NumValMethod:
2214     @@Return:
2215     @@@Type:
2216     DISIDL:AnyRealNumber::ManakaiDOM:all
2217     @@@enDesc:
2218     Numeric value of the Perl code.
2219     @@@PerlDef:
2220     $r = 0 + $self->{<Q::TreeCore:node>}->{<Q::infoset:data>};
2221    
2222 wakaba 1.6 @ToStringMethod:
2223     @@Return:
2224     @@@Type:
2225 wakaba 1.12 DISLang:String::ManakaiDOM:all
2226 wakaba 1.6 @@@enDesc:
2227     Perl code.
2228     @@@PerlDef:
2229     my $node = $self->{<Q::TreeCore:node>};
2230     $r = $node->{<Q::infoset:data>};
2231     $r =~ s/(['\\])/\\$1/g;
2232     $r = q<'> . $r . q<'>;
2233     ##PerlStringLiteral
2234    
2235 wakaba 1.12 ## TODO: -> Separate module
2236     PropDef:
2237     @QName:
2238     infoset:data
2239    
2240 wakaba 1.6 ClsDef:
2241     @ClsQName: ManakaiPerlBare
2242     @ClsISA: ManakaiPerlCodeFragment
2243     @enDesc:
2244     Unparsed Perl inline code fragments.
2245    
2246     @IntMethod:
2247     @@Name:newObject
2248     @@ManakaiDOM:isStatic:1
2249     @@Description:
2250     @@@lang:en
2251     @@@@:
2252     Creates a new instance object for
2253     <Class::ManakaiPerlInlineBare>.
2254     @@Return:
2255     @@@Type:
2256     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2257     @@@Description:
2258     @@@@lang:en
2259     @@@@@:
2260     The newly created node object.
2261     @@@PerlDef:
2262     @@@@@:
2263     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2264     ::ManakaiDOM:Perl.new>;
2265     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2266     $node->{<Q::pc:code>} = '';
2267     $node->{<Q::pc:nodeType>} = 'bare';
2268     @@@@ImplNote:
2269     @@@@@lang:en
2270     @@@@@@:
2271 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2272 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2273 wakaba 1.6
2274 wakaba 1.9 @IntCloneMethod:
2275     @@Return:
2276     @@@Type:
2277     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2278     @@@PerlDef:
2279     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2280     ::ManakaiDOM:Perl.new>;
2281     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2282     for my $prop (<Q::pc:code>) {
2283     $node->{$prop} = $nodeObject->{$prop};
2284     }
2285     $node->{<Q::pc:nodeType>} = 'bare';
2286 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2287     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2288     $node->{<Q::pc:useModuleName>}
2289     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2290 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2291     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2292 wakaba 1.9
2293 wakaba 1.6 @Attr:
2294     @@Name: code
2295     @@enDesc:
2296     Perl code.
2297     @@Type:
2298     lang:Perl::ManakaiDOM:all
2299     @@Get:
2300     @@@disDef:
2301     @@@@GetProp: code
2302     @@Set:
2303     @@@disDef:
2304     @@@@SetProp: code
2305    
2306     @ToStringMethod:
2307     @@Return:
2308     @@@Type:
2309 wakaba 1.12 DISLang:String::ManakaiDOM:all
2310 wakaba 1.6 @@@enDesc:
2311     Perl code.
2312     @@@PerlDef:
2313     my $node = $self->{<Q::TreeCore:node>};
2314     $r = $node->{<Q::pc:code>};
2315     ##PerlBare
2316    
2317     ClsDef:
2318     @ClsQName: ManakaiPerlAtom
2319     @ClsISA: ManakaiPerlBare
2320     @enDesc:
2321     Unparsed Perl atomic code fragments (such as numeric literal).
2322    
2323     @IntMethod:
2324     @@Name:newObject
2325     @@ManakaiDOM:isStatic:1
2326     @@Description:
2327     @@@lang:en
2328     @@@@:
2329     Creates a new instance object for
2330     <Class::ManakaiPerlAtom>.
2331     @@Return:
2332     @@@Type:
2333     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2334     @@@Description:
2335     @@@@lang:en
2336     @@@@@:
2337     The newly created node object.
2338     @@@PerlDef:
2339     @@@@@:
2340     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2341     ::ManakaiDOM:Perl.new>;
2342     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2343     $node->{<Q::pc:code>} = '';
2344     $node->{<Q::pc:nodeType>} = 'atom';
2345     @@@@ImplNote:
2346     @@@@@lang:en
2347     @@@@@@:
2348 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2349 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2350 wakaba 1.6
2351 wakaba 1.9 @IntCloneMethod:
2352     @@Return:
2353     @@@Type:
2354     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2355     @@@PerlDef:
2356     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2357     ::ManakaiDOM:Perl.new>;
2358     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2359     for my $prop (<Q::pc:code>) {
2360     $node->{$prop} = $nodeObject->{$prop};
2361     }
2362     $node->{<Q::pc:nodeType>} = 'atom';
2363 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2364     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2365     $node->{<Q::pc:useModuleName>}
2366     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2367 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2368     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2369 wakaba 1.14
2370     @NumValMethod:
2371     @@Return:
2372     @@@Type:
2373     DISIDL:AnyRealNumber::ManakaiDOM:all
2374     @@@enDesc:
2375     Numeric value of the Perl code.
2376     @@@PerlDef:
2377     $r = 0 + $self->{<Q::TreeCore:node>}->{<Q::pc:code>};
2378 wakaba 1.9
2379 wakaba 1.6 @ToStringMethod:
2380     @@Return:
2381     @@@Type:
2382 wakaba 1.12 DISLang:String::ManakaiDOM:all
2383 wakaba 1.6 @@@enDesc:
2384     Perl code.
2385     @@@PerlDef:
2386     my $node = $self->{<Q::TreeCore:node>};
2387     $r = $node->{<Q::pc:code>};
2388     ##PerlAtom
2389    
2390     ClsDef:
2391     @ClsQName: ManakaiPerlVariable
2392     @ClsISA: ManakaiPerlCodeFragment
2393     @enDesc:
2394     Unparsed Perl variable.
2395     \
2396     {NOTE:: Future version of the implementation may
2397     support to specify array index or hash key.
2398     \
2399     }
2400    
2401     @IntMethod:
2402     @@Name:newObject
2403     @@ManakaiDOM:isStatic:1
2404     @@Description:
2405     @@@lang:en
2406     @@@@:
2407     Creates a new instance object for
2408     <Class::ManakaiPerlVariable>.
2409     @@Return:
2410     @@@Type:
2411     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2412     @@@Description:
2413     @@@@lang:en
2414     @@@@@:
2415     The newly created node object.
2416     @@@PerlDef:
2417     @@@@@:
2418     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2419     ::ManakaiDOM:Perl.new>;
2420     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2421     $node->{<Q::pc:variableType>} = '';
2422     $node->{<Q::pc:nodeType>} = 'variable';
2423     @@@@ImplNote:
2424     @@@@@lang:en
2425     @@@@@@:
2426     Properties: <Q::pc:nodeType>, <Q::pc:variableType>,
2427     <Q::packageName>, <Q::localName> (required),
2428 wakaba 1.14 <Q::variableScope>, <Q::hashKey>, <Q::pc:useModuleName>,
2429 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2430 wakaba 1.9
2431     @IntCloneMethod:
2432     @@Return:
2433     @@@Type:
2434     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2435     @@@PerlDef:
2436     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2437     ::ManakaiDOM:Perl.new>;
2438     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2439     for my $prop (<Q::pc:variableType>, <Q::packageName>,
2440     <Q::localName>, <Q::variableScope>, <Q::hashKey>) {
2441     $node->{$prop} = $nodeObject->{$prop};
2442     }
2443     $node->{<Q::pc:nodeType>} = 'variable';
2444 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2445     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2446     $node->{<Q::pc:useModuleName>}
2447     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2448 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2449     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2450 wakaba 1.6
2451     @Attr:
2452     @@Name: variableType
2453     @@enDesc:
2454     Perl variable type (<CODE::$>, <CODE::@>, <CODE::%>,
2455     <CODE::&> or empty string).
2456     @@Type:
2457     lang:Perl::ManakaiDOM:all
2458     @@Get:
2459     @@@disDef:
2460     @@@@GetProp: variableType
2461     @@Set:
2462     @@@disDef:
2463     @@@@SetProp: variableType
2464    
2465     @Attr:
2466     @@Name: packageName
2467     @@enDesc:
2468     The name of the package to which this variable belongs.
2469     @@Type:
2470     Perl:package-name::ManakaiDOM:all
2471     @@Get:
2472     @@@nullCase:
2473     @@@@enDesc:
2474     This package belongs to the current package or
2475     does not belong to any package.
2476     @@@disDef:
2477     @@@@GetProp: packageName
2478     @@Set:
2479     @@@nullCase:
2480     @@@@enDesc:
2481     This package belongs to the current package or
2482     does not belong to any package.
2483     @@@disDef:
2484 wakaba 1.11 @@@@SetProp: packageName
2485 wakaba 1.6
2486     @Attr:
2487     @@Name: localName
2488     @@enDesc:
2489     The local variable name.
2490     @@Type:
2491     lang:Perl::ManakaiDOM:all
2492     @@Get:
2493     @@@disDef:
2494     @@@@GetProp: localName
2495     @@Set:
2496     @@@disDef:
2497     @@@@SetProp: localName
2498    
2499     @Attr:
2500     @@Name: variableScope
2501     @@enDesc:
2502     Scope modifier (<CODE::my> or <CODE::our> or <CODE::local>).
2503     @@Type:
2504     lang:Perl::ManakaiDOM:all
2505     @@Get:
2506     @@@nullCase:
2507     @@@@enDesc:
2508     This variable does not have scope modifier.
2509     @@@disDef:
2510     @@@@GetProp: variableScope
2511     @@Set:
2512     @@@nullCase:
2513     @@@@enDesc:
2514     This variable does not have scope modifier.
2515     @@@disDef:
2516     @@@@SetProp: variableScope
2517    
2518     @ToStringMethod:
2519     @@Return:
2520     @@@Type:
2521 wakaba 1.12 DISLang:String::ManakaiDOM:all
2522 wakaba 1.6 @@@enDesc:
2523     Perl code.
2524     @@@PerlDef:
2525     my $node = $self->{<Q::TreeCore:node>};
2526 wakaba 1.11 if ($node->{<Q::pc:variableScope>}) {
2527     $r = $node->{<Q::pc:variableScope>} . ' ';
2528     }
2529     $r .= $node->{<Q::pc:variableType>};
2530 wakaba 1.6 $r .= $node->{<Q::pc:packageName>} . '::'
2531     if defined $node->{<Q::pc:packageName>};
2532     $r .= $node->{<Q::pc:localName>};
2533     if ($node->{<Q::pc:variableType>} eq '$' and
2534     defined $node->{<Q::pc:hashKey>}) {
2535     my $hashKey = $node->{<Q::pc:hashKey>};
2536     $hashKey =~ s/(['\\])/\\$1/g;
2537     $r .= q<{'> . $hashKey . q<'}>;
2538     }
2539    
2540     @Attr:
2541     @@Name: hashKey
2542     @@enDesc:
2543     The key for hash.
2544     \
2545     {NOTE:: Using Perl code for key is not supported in the current
2546     version of the implementation.
2547     \
2548     }
2549     @@Type:
2550     DISLang:String::ManakaiDOM:all
2551     @@Get:
2552     @@@nullCase:
2553     @@@@enDesc:
2554     This variable is not for hash value access.
2555     @@@disDef:
2556     @@@@GetProp: hashKey
2557     @@Set:
2558     @@@nullCase:
2559     @@@@enDesc:
2560     This variable is not for hash value access.
2561     @@@disDef:
2562     @@@@SetProp: hashKey
2563 wakaba 1.15 ##PerlVariable
2564 wakaba 1.6
2565     PropDef:
2566     @QName: variableScope
2567     @enDesc:
2568     Variable scope (<CODE::local>, <CODE::my> or <CODE::our>).
2569    
2570     PropDef:
2571     @QName: variableType
2572     @enDesc:
2573     Variable type prefix.
2574    
2575     PropDef:
2576     @QName: hashKey
2577     @enDesc:
2578     Hash key string.
2579    
2580     ClsDef:
2581     @ClsQName: ManakaiPerlAnyContainer
2582     @ClsISA: ManakaiPerlCodeFragment
2583     @enDesc:
2584     A base class implemented by both inline container and
2585     block-level container.
2586    
2587     @Attr:
2588     @@Name: length
2589     @@enDesc:
2590     The number of child code fragments.
2591     @@Type:
2592 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
2593 wakaba 1.6 @@Get:
2594     @@@PerlDef:
2595     $r = @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}};
2596    
2597     @Method:
2598     @@Name: appendStringLiteral
2599     @@enDesc:
2600     Appends a Perl string literal (<CODE::q>).
2601     @@Param:
2602     @@@Name: stringArg
2603     @@@Type:
2604     DISLang:String::ManakaiDOM:all
2605     @@@enDesc:
2606     A string.
2607     @@Return:
2608     @@@Type: ManakaiPerlStringLiteral
2609     @@@enDesc:
2610     The newly created Perl string literal object.
2611     @@@PerlDef:
2612     $r = <ClassM::ManakaiPerlStringLiteral.newObject>;
2613     my $node = $self->{<Q::TreeCore:node>};
2614     $r->{<Q::infoset:data>} = $stringArg;
2615     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2616     ::ManakaiDOM:Perl.importTree> ($r);
2617     push @{$node->{<Q::pc:childNodes>}}, $r;
2618     $r->{<Q::pc:parent>} = $node;
2619     if (defined wantarray) {
2620     __CODE{ManakaiNode:getNewReference::
2621     $object => $r, $ref => $r,
2622     $class =>{<ClassName::ManakaiPerlStringLiteral>},
2623     }__;
2624     }
2625    
2626    
2627     @Method:
2628     @@Name: appendAtom
2629     @@enDesc:
2630     Appends a Perl atomic code fragment.
2631     @@Param:
2632     @@@Name: codeArg
2633     @@@Type:
2634     lang:Perl::ManakaiDOM:all
2635     @@@enDesc:
2636     An atom.
2637     @@Return:
2638     @@@Type: ManakaiPerlAtom
2639     @@@enDesc:
2640     The newly created Perl code object.
2641     @@@PerlDef:
2642     $r = <ClassM::ManakaiPerlAtom.newObject>;
2643     my $node = $self->{<Q::TreeCore:node>};
2644 wakaba 1.7 $r->{<Q::pc:code>} = $codeArg;
2645 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2646     ::ManakaiDOM:Perl.importTree> ($r);
2647     push @{$node->{<Q::pc:childNodes>}}, $r;
2648     $r->{<Q::pc:parent>} = $node;
2649     if (defined wantarray) {
2650     __CODE{ManakaiNode:getNewReference::
2651     $object => $r, $ref => $r,
2652     $class =>{<ClassName::ManakaiPerlAtom>},
2653     }__;
2654     }
2655    
2656    
2657     @Method:
2658     @@Name: appendBare
2659     @@enDesc:
2660     Appends a Perl bare code fragment.
2661     @@Param:
2662     @@@Name: codeArg
2663     @@@Type:
2664     lang:Perl::ManakaiDOM:all
2665     @@@enDesc:
2666 wakaba 1.7 An bare code.
2667 wakaba 1.6 @@Return:
2668     @@@Type: ManakaiPerlBare
2669     @@@enDesc:
2670     The newly created Perl code object.
2671     @@@PerlDef:
2672     $r = <ClassM::ManakaiPerlBare.newObject>;
2673     my $node = $self->{<Q::TreeCore:node>};
2674 wakaba 1.7 $r->{<Q::pc:code>} = $codeArg;
2675 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2676     ::ManakaiDOM:Perl.importTree> ($r);
2677     push @{$node->{<Q::pc:childNodes>}}, $r;
2678     $r->{<Q::pc:parent>} = $node;
2679     if (defined wantarray) {
2680     __CODE{ManakaiNode:getNewReference::
2681     $object => $r, $ref => $r,
2682     $class =>{<ClassName::ManakaiPerlBare>},
2683     }__;
2684     }
2685 wakaba 1.11
2686     @Method:
2687     @@Name: appendNewAssignment
2688     @@enDesc:
2689     Appends a newly created <Class::ManakaiPerlAssign> object.
2690     @@Param:
2691     @@@Name: leftArg
2692     @@@Type: ManakaiPerlCodeFragment
2693     @@@enDesc:
2694     A left hand side code fragment object.
2695     @@Param:
2696     @@@Name: rightArg
2697     @@@Type: ManakaiPerlCodeFragment
2698     @@@enDesc:
2699     A right hand side code fragment object.
2700     @@Return:
2701     @@@RaiseException:
2702     @@@@@:BAD_CHILD_ERR
2703     @@@@enDesc:
2704     An attempt is made to append a child
2705     that is not valid type.
2706     @@@RaiseException:
2707     @@@@@:IN_USE_NODE_ERR
2708     @@@@enDesc:
2709     An attempt is made to append a node that is
2710     already used elsewhere.
2711     @@@PerlDef:
2712     for my $arg ([leftArg => $leftArg], [rightArg => $rightArg]) {
2713     if ({
2714     atom => 1, bare => 1, incontainer => 1, assign => true,
2715     inunparsed => 1, variable => 1, string => true,
2716     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
2717     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
2718     __EXCEPTION{IN_USE_NODE_ERR::
2719     pc:childNode => {$arg->[1]},
2720     MDOMX:param-name => {$arg->[0]},
2721     }__;
2722     }
2723     } else {
2724     __EXCEPTION{BAD_CHILD_ERR::
2725     pc:parentNode => {$self},
2726     pc:childNode => {$arg->[1]},
2727     MDOMX:param-name => {$arg->[0]},
2728     }__;
2729     }
2730     } # left/right
2731    
2732     my $assign = <ClassM::ManakaiPerlAssignment.newObject>;
2733     $assign->{<Q::pc:left>} = $leftArg->{<Q::TreeCore:node>};
2734     $assign->{<Q::pc:right>} = $rightArg->{<Q::TreeCore:node>};
2735     $leftArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
2736     $rightArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
2737     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree> ($assign);
2738     $assign->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
2739     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $assign;
2740 wakaba 1.8 ##PerlAnyContainer
2741 wakaba 1.6
2742 wakaba 1.8 ClsDef:
2743     @ClsQName: ManakaiPerlStatement
2744     @ClsISA: ManakaiPerlInlineContainer
2745     @enDesc:
2746     Perl statements.
2747    
2748     @IntMethod:
2749     @@Name:newObject
2750     @@ManakaiDOM:isStatic:1
2751     @@Description:
2752     @@@lang:en
2753     @@@@:
2754     Creates a new instance object for
2755     <Class::ManakaiPerlStatement>.
2756     @@Return:
2757     @@@Type:
2758     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2759     @@@Description:
2760     @@@@lang:en
2761     @@@@@:
2762     The newly created node object.
2763     @@@PerlDef:
2764     @@@@@:
2765     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2766     ::ManakaiDOM:Perl.new>;
2767     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2768 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2769 wakaba 1.8 $node->{<Q::pc:childNodes>} = [];
2770     $node->{<Q::pc:nodeType>} = 'statement';
2771     @@@@ImplNote:
2772     @@@@@lang:en
2773     @@@@@@:
2774 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
2775     <Q::pc:parent>, <Q::pc:useModuleName>,
2776 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2777 wakaba 1.9
2778     @IntCloneMethod:
2779     @@Return:
2780     @@@Type:
2781     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2782     @@@PerlDef:
2783     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2784     ::ManakaiDOM:Perl.new>;
2785     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2786     $node->{<Q::pc:nodeType>} = 'statement';
2787 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2788 wakaba 1.9 $node->{<Q::pc:childNodes>} = [];
2789     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
2790     my $pack;
2791     my $nt = $cno->{<Q::pc:nodeType>};
2792     __CODE{pc:nodeTypeToPackageName::
2793     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
2794     ## NOTE: Method name written directly
2795 wakaba 1.15 my $cno_clone = $pack->_make_clone_object ($cno);
2796 wakaba 1.9 push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
2797     $cno_clone->{<Q::pc:parent>} = $node;
2798     ## NOTE: Tree ID is not updated yet.
2799     }
2800 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2801     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2802     $node->{<Q::pc:useModuleName>}
2803     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2804 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2805     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2806 wakaba 1.8
2807     @ToStringMethod:
2808     @@Return:
2809     @@@Type:
2810 wakaba 1.12 DISLang:String::ManakaiDOM:all
2811 wakaba 1.8 @@@enDesc:
2812     Perl code.
2813     @@@PerlDef:
2814     $r = $self->SUPER::stringify;
2815 wakaba 1.16 $r .= ";\n" if length $r;
2816 wakaba 1.8 ##PerlStatement
2817 wakaba 1.6
2818     ClsDef:
2819     @ClsQName: ManakaiPerlInlineContainer
2820     @ClsISA: ManakaiPerlAnyContainer
2821     @enDesc:
2822     Unparsed Perl inline code block.
2823    
2824     @IntMethod:
2825     @@Name:newObject
2826     @@ManakaiDOM:isStatic:1
2827     @@Description:
2828     @@@lang:en
2829     @@@@:
2830     Creates a new instance object for
2831     <Class::ManakaiPerlInlineContainer>.
2832     @@Return:
2833     @@@Type:
2834     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2835     @@@Description:
2836     @@@@lang:en
2837     @@@@@:
2838     The newly created node object.
2839     @@@PerlDef:
2840     @@@@@:
2841     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2842     ::ManakaiDOM:Perl.new>;
2843     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2844 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2845 wakaba 1.6 $node->{<Q::pc:childNodes>} = [];
2846     $node->{<Q::pc:nodeType>} = 'incontainer';
2847     @@@@ImplNote:
2848     @@@@@lang:en
2849     @@@@@@:
2850 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
2851 wakaba 1.14 <Q::pc:parent>, <Q::pc:useModuleName>,
2852 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
2853 wakaba 1.9
2854     @IntCloneMethod:
2855     @@Return:
2856     @@@Type:
2857     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2858     @@@PerlDef:
2859     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2860     ::ManakaiDOM:Perl.new>;
2861     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2862 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2863 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'incontainer';
2864     $node->{<Q::pc:childNodes>} = [];
2865     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
2866     my $pack;
2867     my $nt = $cno->{<Q::pc:nodeType>};
2868     __CODE{pc:nodeTypeToPackageName::
2869     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
2870     ## NOTE: Method name written directly
2871 wakaba 1.15 my $cno_clone = $pack->_make_clone_object ($cno);
2872 wakaba 1.9 push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
2873     $cno_clone->{<Q::pc:parent>} = $node;
2874     ## NOTE: Tree ID is not updated yet.
2875     }
2876 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2877     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2878     $node->{<Q::pc:useModuleName>}
2879     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2880 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
2881     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
2882 wakaba 1.6
2883     @Method:
2884     @@Name: appendCodeFragment
2885     @@enDesc:
2886     Appends a <Class::ManakaiPerlCodeFragment> object.
2887     @@Param:
2888     @@@Name: codeArg
2889     @@@Type: ManakaiPerlCodeFragment
2890     @@@enDesc:
2891     A code fragment object.
2892     @@Return:
2893     @@@RaiseException:
2894     @@@@@:BAD_CHILD_ERR
2895     @@@@enDesc:
2896     An attempt is made to append a child
2897     that is not a <Class::ManakaiPerlUnparsedCode>.
2898     @@@RaiseException:
2899     @@@@@:IN_USE_NODE_ERR
2900     @@@@enDesc:
2901     An attempt is made to append a node that is
2902     already used elsewhere.
2903     @@@PerlDef:
2904     if ({
2905 wakaba 1.11 atom => 1, bare => 1, incontainer => 1, assign => true,
2906     inunparsed => 1, variable => 1, string => 1,
2907 wakaba 1.6 }->{$codeArg->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
2908     if ($codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
2909     __EXCEPTION{IN_USE_NODE_ERR::
2910     pc:childNode => {$codeArg},
2911     }__;
2912     }
2913     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
2914     ($codeArg->{<Q::TreeCore:node>});
2915     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}},
2916     $codeArg->{<Q::TreeCore:node>};
2917     $codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
2918     = $self->{<Q::TreeCore:node>};
2919     } else {
2920     __EXCEPTION{BAD_CHILD_ERR::
2921     pc:parentNode => {$self},
2922     pc:childNode => {$codeArg},
2923     }__;
2924     }
2925    
2926     @Method:
2927     @@Name: appendCode
2928     @@enDesc:
2929     Appends an unparsed Perl code fragment.
2930     @@Param:
2931     @@@Name: codeArg
2932     @@@Type:
2933     lang:Perl::ManakaiDOM:all
2934     @@@enDesc:
2935     An unparsed Perl code fragment.
2936     @@Return:
2937     @@@Type: ManakaiPerlInlineUnparsedCode
2938     @@@enDesc:
2939     The newly created Perl code object.
2940     @@@PerlDef:
2941     $r = <ClassM::ManakaiPerlInlineUnparsedCode.newObject>;
2942     my $node = $self->{<Q::TreeCore:node>};
2943     $r->{<Q::code>} = $codeArg;
2944     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2945     ::ManakaiDOM:Perl.importTree> ($r);
2946     push @{$node->{<Q::pc:childNodes>}}, $r;
2947     $r->{<Q::pc:parent>} = $node;
2948     if (defined wantarray) {
2949     __CODE{ManakaiNode:getNewReference::
2950     $object => $r, $ref => $r,
2951     $class =>{<ClassName::ManakaiPerlInlineUnparsedCode>},
2952     }__;
2953     }
2954    
2955     @ToStringMethod:
2956     @@Return:
2957     @@@Type:
2958 wakaba 1.12 DISLang:String::ManakaiDOM:all
2959 wakaba 1.6 @@@enDesc:
2960     Perl code.
2961     @@@PerlDef:
2962     for my $cno (@{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}) {
2963 wakaba 1.7 my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
2964 wakaba 1.6 if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
2965     \ @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}} == 1) {
2966     $r .= '(' . $cn->stringify . ')';
2967     } else {
2968     $r .= $cn->stringify;
2969     }
2970     }
2971     ##PerlInlineContainer
2972    
2973 wakaba 1.8 ClsDef:
2974     @ClsQName: ManakaiPerlBlock
2975     @ClsISA: ManakaiPerlStatementContainer
2976     @enDesc:
2977     Perl block-level code block.
2978    
2979     @IntMethod:
2980     @@Name:newObject
2981     @@ManakaiDOM:isStatic:1
2982     @@Description:
2983     @@@lang:en
2984     @@@@:
2985     Creates a new instance object for
2986     <Class::ManakaiPerlBlock>.
2987     @@Return:
2988     @@@Type:
2989     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2990     @@@Description:
2991     @@@@lang:en
2992     @@@@@:
2993     The newly created node object.
2994     @@@PerlDef:
2995     @@@@@:
2996     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2997     ::ManakaiDOM:Perl.new>;
2998     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2999 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3000 wakaba 1.8 $node->{<Q::pc:childNodes>} = [];
3001     $node->{<Q::pc:nodeType>} = 'block';
3002     @@@@ImplNote:
3003     @@@@@lang:en
3004     @@@@@@:
3005 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>, <Q::pc:label>,
3006 wakaba 1.10 <Q::pc:parent>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
3007 wakaba 1.14 <Q::pc:currentSoruceFile>,
3008     <Q::pc:currentSourceLine>, <Q::pc:useModuleName>,
3009 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
3010 wakaba 1.9
3011     @IntCloneMethod:
3012     @@Return:
3013     @@@Type:
3014     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3015     @@@PerlDef:
3016     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3017     ::ManakaiDOM:Perl.new>;
3018     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3019 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3020 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'block';
3021     $node->{<Q::pc:childNodes>} = [];
3022     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
3023     my $pack;
3024     my $nt = $cno->{<Q::pc:nodeType>};
3025     __CODE{pc:nodeTypeToPackageName::
3026     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3027     ## NOTE: Method name written directly
3028     my $cno_clone = $pack->_make_clone_object ($cno);
3029     push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
3030     $cno_clone->{<Q::pc:parent>} = $node;
3031     ## NOTE: Tree ID is not updated yet.
3032     }
3033 wakaba 1.10 for my $prop (<Q::pc:label>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
3034     <Q::pc:currentSourceFile>, <Q::pc:currentSourceLine>) {
3035     $node->{$prop} = $nodeObject->{$prop};
3036     }
3037 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3038     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3039     $node->{<Q::pc:useModuleName>}
3040     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3041 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
3042     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
3043 wakaba 1.8
3044     @ToStringMethod:
3045     @@Return:
3046     @@@Type:
3047 wakaba 1.12 DISLang:String::ManakaiDOM:all
3048 wakaba 1.8 @@@enDesc:
3049     Perl code.
3050     @@@PerlDef:
3051 wakaba 1.9 my $node = $self->{<Q::TreeCore:node>};
3052     if (@{$node->{<Q::pc:childNodes>}} == 1 and
3053     $node->{<Q::pc:childNodes>}->[0]->{<Q::pc:nodeType>} eq 'block') {
3054     my $cn;
3055     __CODE{ManakaiNode:getWeakReference::
3056     $object => {$node->{<Q::pc:childNodes>}->[0]},
3057     $ref => $cn,
3058     $class => {<ClassName::ManakaiPerlBlock>}}__;
3059     $r = $cn->stringify;
3060     } else {
3061     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
3062     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
3063     if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
3064     \ @{$node->{<Q::pc:childNodes>}} == 1) {
3065     $r .= '(' . $cn->stringify . ')';
3066     } else {
3067     $r .= $cn->stringify;
3068     }
3069 wakaba 1.8 }
3070 wakaba 1.9 __DEEP{
3071     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
3072 wakaba 1.19 $r = sprintf (qq<\n{\n#line %d "%s [b] (Chunk #%d)"\n>,
3073 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
3074     $node->{<Q::pc:sourceFile>} ||
3075     $file-><AG::ManakaiPerlFile.sourceFile>,
3076 wakaba 1.9 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
3077     . $r
3078 wakaba 1.19 . sprintf (qq<\n#line 1 "%s [/b] (Chunk #%d)"\n}\n>,
3079 wakaba 1.9 $file-><AG::ManakaiPerlFile.sourceFile>,
3080 wakaba 1.21 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
3081     if length $r;
3082 wakaba 1.9 }__;
3083 wakaba 1.8 }
3084    
3085     ##PerlBlock
3086    
3087 wakaba 1.9 ClsDef:
3088     @ClsQName: ManakaiPerlBlockContainer
3089     @ClsISA: ManakaiPerlStatementContainer
3090     @enDesc:
3091     Perl block-level code container whose content may or may
3092     not semantically be self-contained.
3093    
3094     @IntMethod:
3095     @@Name:newObject
3096     @@ManakaiDOM:isStatic:1
3097     @@Description:
3098     @@@lang:en
3099     @@@@:
3100     Creates a new instance object for
3101     <Class::ManakaiPerlBlockContainer>.
3102     @@Return:
3103     @@@Type:
3104     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3105     @@@Description:
3106     @@@@lang:en
3107     @@@@@:
3108     The newly created node object.
3109     @@@PerlDef:
3110     @@@@@:
3111     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3112     ::ManakaiDOM:Perl.new>;
3113     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3114 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3115 wakaba 1.9 $node->{<Q::pc:childNodes>} = [];
3116     $node->{<Q::pc:nodeType>} = 'blockcontainer';
3117     @@@@ImplNote:
3118     @@@@@lang:en
3119     @@@@@@:
3120 wakaba 1.10 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
3121     <Q::pc:parent>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
3122 wakaba 1.14 <Q::pc:currentSourceFile>,
3123     <Q::pc:currentSourceLine>, <Q::pc:useModuleName>,
3124 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
3125 wakaba 1.9
3126     @IntCloneMethod:
3127     @@Return:
3128     @@@Type:
3129     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3130     @@@PerlDef:
3131     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3132     ::ManakaiDOM:Perl.new>;
3133     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3134 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3135 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'blockcontainer';
3136     $node->{<Q::pc:childNodes>} = [];
3137     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
3138     my $pack;
3139     my $nt = $cno->{<Q::pc:nodeType>};
3140     __CODE{pc:nodeTypeToPackageName::
3141     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3142     ## NOTE: Method name written directly
3143     my $cno_clone = $pack->_make_clone_object ($cno);
3144     push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
3145     $cno_clone->{<Q::pc:parent>} = $node;
3146     ## NOTE: Tree ID is not updated yet.
3147     }
3148 wakaba 1.10 for my $prop (<Q::pc:sourceFile>, <Q::pc:sourceLine>,
3149     <Q::pc:currentSourceFile>, <Q::pc:currentSourceLine>) {
3150     $node->{$prop} = $nodeObject->{$prop};
3151     }
3152 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3153     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3154     $node->{<Q::pc:useModuleName>}
3155     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3156 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
3157     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
3158 wakaba 1.9
3159     @ToStringMethod:
3160     @@Return:
3161     @@@Type:
3162 wakaba 1.12 DISLang:String::ManakaiDOM:all
3163 wakaba 1.9 @@@enDesc:
3164     Perl code.
3165     @@@PerlDef:
3166     my $node = $self->{<Q::TreeCore:node>};
3167     if (@{$node->{<Q::pc:childNodes>}} == 1 and
3168     {
3169     block => true, blockcontainer => true,
3170     }->{$node->{<Q::pc:childNodes>}->[0]->{<Q::pc:nodeType>}}) {
3171     my $cn;
3172     __CODE{ManakaiNode:getWeakReference::
3173     $object => {$node->{<Q::pc:childNodes>}->[0]},
3174     $ref => $cn,
3175     $class => {<ClassName::ManakaiPerlBlock>}}__;
3176     $r = $cn->stringify;
3177     } else {
3178     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
3179     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
3180     if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
3181     \ @{$node->{<Q::pc:childNodes>}} == 1) {
3182     $r .= '(' . $cn->stringify . ')';
3183     } else {
3184     $r .= $cn->stringify;
3185     }
3186     }
3187     __DEEP{
3188     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
3189 wakaba 1.19 $r = sprintf (qq<\n#line %d "%s [bc] (Chunk #%d)"\n>,
3190 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
3191     $node->{<Q::pc:sourceFile>} ||
3192     $file-><AG::ManakaiPerlFile.sourceFile>,
3193 wakaba 1.9 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
3194     . $r
3195 wakaba 1.19 . sprintf (qq<\n#line 1 "%s [/bc] (Chunk #%d)"\n>,
3196 wakaba 1.9 $file-><AG::ManakaiPerlFile.sourceFile>,
3197     $file-><M::ManakaiPerlFile.getNextChunkNumber>);
3198     }__;
3199     }
3200    
3201     ##PerlBlockContainer
3202    
3203 wakaba 1.11 ClsDef:
3204     @ClsQName: ManakaiPerlAssignment
3205     @ClsISA: ManakaiPerlCodeFragment
3206     @enDesc:
3207     Perl variable assignment.
3208    
3209     @IntMethod:
3210     @@Name:newObject
3211     @@ManakaiDOM:isStatic:1
3212     @@Description:
3213     @@@lang:en
3214     @@@@:
3215     Creates a new instance object for
3216     <Class::ManakaiPerlAssignment>.
3217     @@Return:
3218     @@@Type:
3219     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3220     @@@Description:
3221     @@@@lang:en
3222     @@@@@:
3223     The newly created node object.
3224     @@@PerlDef:
3225     @@@@@:
3226     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3227     ::ManakaiDOM:Perl.new>;
3228     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3229     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:left>, <Q::pc:right>;
3230     $node->{<Q::pc:nodeType>} = 'assign';
3231     @@@@ImplNote:
3232     @@@@@lang:en
3233     @@@@@@:
3234     Properties: <Q::pc:nodeType>, <Q::pc:left>, <Q::pc:right>,
3235 wakaba 1.14 <Q::pc:parent>, <Q::pc:useModuleName>,
3236 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
3237 wakaba 1.11
3238     @IntCloneMethod:
3239     @@Return:
3240     @@@Type:
3241     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3242     @@@PerlDef:
3243     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3244     ::ManakaiDOM:Perl.new>;
3245     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3246     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:left>, <Q::pc:right>;
3247     $node->{<Q::pc:nodeType>} = 'assign';
3248     for my $prop (<Q::pc:left>, <Q::pc:right>) {
3249     my $pack;
3250     my $cno = $nodeObject->{$prop};
3251     my $nt = $cno->{<Q::pc:nodeType>};
3252     __CODE{pc:nodeTypeToPackageName::
3253     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3254     ## NOTE: Method name written directly
3255     my $cno_clone = $pack->_make_clone_object ($cno);
3256     $node->{$prop} = $cno_clone;
3257     $cno_clone->{<Q::pc:parent>} = $node;
3258     ## NOTE: Tree ID is not updated yet.
3259     }
3260 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3261     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3262     $node->{<Q::pc:useModuleName>}
3263     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3264 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
3265     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
3266 wakaba 1.11
3267     @ToStringMethod:
3268     @@Return:
3269     @@@Type:
3270 wakaba 1.12 DISLang:String::ManakaiDOM:all
3271 wakaba 1.11 @@@enDesc:
3272     Perl code.
3273     @@@PerlDef:
3274     my $node = $self->{<Q::TreeCore:node>};
3275     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3276     ($node->{<Q::pc:left>})->stringify . ' = ' .
3277     <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3278     ($node->{<Q::pc:right>})->stringify;
3279     ##PerlAssignment
3280    
3281 wakaba 1.12 ClsDef:
3282     @ClsQName: ManakaiPerlIf
3283     @ClsISA: ManakaiPerlCodeFragment
3284     @enDesc:
3285     Perl variable assignment.
3286    
3287     @IntMethod:
3288     @@Name:newObject
3289     @@ManakaiDOM:isStatic:1
3290     @@Description:
3291     @@@lang:en
3292     @@@@:
3293     Creates a new instance object for
3294     <Class::ManakaiPerlAssignment>.
3295     @@Return:
3296     @@@Type:
3297     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3298     @@@Description:
3299     @@@@lang:en
3300     @@@@@:
3301     The newly created node object.
3302     @@@PerlDef:
3303     @@@@@:
3304     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3305     ::ManakaiDOM:Perl.new>;
3306     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3307     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:condition>,
3308     <Q::pc:true>, <Q::pc:false>;
3309     $node->{<Q::pc:nodeType>} = 'if';
3310     @@@@ImplNote:
3311     @@@@@lang:en
3312     @@@@@@:
3313     Properties: <Q::pc:nodeType>, <Q::pc:true>, <Q::pc:false>,
3314 wakaba 1.14 <Q::pc:parent>, <Q::pc:condition>, <Q::pc:useModuleName>,
3315 wakaba 1.19 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
3316 wakaba 1.12
3317     @IntCloneMethod:
3318     @@Return:
3319     @@@Type:
3320     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3321     @@@PerlDef:
3322     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3323     ::ManakaiDOM:Perl.new>;
3324     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3325     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:condition>,
3326     <Q::pc:true>, <Q::pc:false>;
3327     $node->{<Q::pc:nodeType>} = 'if';
3328     for my $prop (<Q::pc:true>, <Q::pc:false>, <Q::pc:condition>) {
3329     my $pack;
3330     my $cno = $nodeObject->{$prop};
3331     next unless $cno;
3332     my $nt = $cno->{<Q::pc:nodeType>};
3333     __CODE{pc:nodeTypeToPackageName::
3334     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3335     ## NOTE: Method name written directly
3336     my $cno_clone = $pack->_make_clone_object ($cno);
3337     $node->{$prop} = $cno_clone;
3338     $cno_clone->{<Q::pc:parent>} = $node;
3339     ## NOTE: Tree ID is not updated yet.
3340     }
3341 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3342     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3343     $node->{<Q::pc:useModuleName>}
3344     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3345 wakaba 1.19 $node->{<Q::pc:requireModuleName>}
3346     = {%{$nodeObject->{<Q::pc:requireModuleName>} || {}}};
3347 wakaba 1.12
3348     @ToStringMethod:
3349     @@Return:
3350     @@@Type:
3351     DISLang:String::ManakaiDOM:all
3352     @@@enDesc:
3353     Perl code.
3354     @@@PerlDef:
3355     my $node = $self->{<Q::TreeCore:node>};
3356     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3357     ($node->{<Q::pc:condition>})->stringify;
3358     my $true_code = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3359     ($node->{<Q::pc:true>})->stringify if $node->{<Q::pc:true>};
3360     my $false_code = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3361     ($node->{<Q::pc:false>})->stringify if $node->{<Q::pc:false>};
3362     if (defined $true_code) {
3363     if (defined $false_code) {
3364     $r = q<if (> . $r . q<) {> . $true_code .
3365     q<} else {> . $false_code . q<}>;
3366     } else {
3367     $r = q<if (> . $r . q<) {> . $true_code . q<}>;
3368     }
3369     } else {
3370     $r = q<unless (> . $r . q<) {> . $false_code . q<}>;
3371     }
3372     ##PerlIf
3373    
3374     PropDef:
3375     @QName:condition
3376     @enDesc:
3377     Condition.
3378     PropDef:
3379     @QName:true
3380     @enDesc:
3381     If true.
3382     PropDef:
3383     @QName:false
3384     @enDesc:
3385     If false.
3386    
3387 wakaba 1.11 PropDef:
3388     @QName:left
3389     @FullName:
3390     @@lang:en
3391     @@@: Left hand side
3392     PropDef:
3393     @QName:right
3394     @FullName:
3395     @@lang:en
3396     @@@: Right hand side
3397    
3398 wakaba 1.8 PropDef:
3399     @QName:label
3400     @enDesc:
3401     Perl statement / block label.
3402    
3403 wakaba 1.6 ElementTypeBinding:
3404     @Name: RaiseException
3405     @ElementType:
3406     ManakaiDOM:raises
3407    
3408     ClsDef:
3409     @ClsQName: ManakaiPerlCodeImplementation
3410 wakaba 1.1 @enDesc:
3411     The class that provides factory methods.
3412 wakaba 1.20
3413     @ClsISA:
3414     dx:ManakaiDefaultExceptionHandler::ManakaiDOM:Perl
3415 wakaba 1.17
3416     @DISLang:role:
3417     DOMMetaImpl:ManakaiAnyImplementationRole
3418     @DOMMetaImpl:provideFeature: CoreFeature10
3419 wakaba 1.1
3420     @Role:
3421     @@@:
3422     DOMCore:DOMImplementation::ManakaiDOM:ManakaiDOM
3423     @@compat:
3424     DOMCore:ManakaiDOMImplementation::ManakaiDOM:ManakaiDOMLatest
3425    
3426     @Method:
3427     @@Name: createPerlFile
3428     @@enDesc:
3429     Creates a Perl code file.
3430     @@Return:
3431     @@@Type: ManakaiPerlFile
3432     @@@enDesc: A newly created Perl source file object.
3433     @@@PerlDef:
3434     $r = <ClassM::ManakaiPerlFile.newObject>;
3435 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
3436     $object => $r, $ref => $r,
3437     $class => {<ClassName::ManakaiPerlFile>}}__;
3438 wakaba 1.1
3439 wakaba 1.13 @Method:
3440     @@Name: createPerlPackage
3441     @@enDesc:
3442     Creates a new package scope block.
3443     @@Param:
3444     @@@Name: packageName
3445     @@@Type:
3446     Perl:package-name::ManakaiDOM:all
3447     @@@enDesc:
3448     The fully-qualified name of the package to create.
3449     @@Return:
3450     @@@Type: ManakaiPerlPackageScope
3451     @@@enDesc:
3452     The newly created package scope object.
3453     @@@PerlDef:
3454     $r = <ClassM::ManakaiPerlPackageScope.newObject>;
3455     $r->{<Q::pc:packageName>} = $packageName;
3456     __CODE{ManakaiNode:getNewReference::
3457     $object => $r, $ref => $r,
3458     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
3459    
3460 wakaba 1.1 @IntMethod:
3461     @@Name: perlComment
3462     @@ManakaiDOM:isStatic:1
3463     @@enDesc:
3464     Generates a Perl comment string.
3465     @@Param:
3466     @@@Name: str
3467     @@@Type:
3468 wakaba 1.12 DISLang:String::ManakaiDOM:all
3469 wakaba 1.1 @@@enDesc:
3470     A comment text.
3471     @@Return:
3472     @@@Type:
3473 wakaba 1.12 DISLang:String::ManakaiDOM:all
3474 wakaba 1.1 @@@enDesc:
3475     A Perl comment string.
3476     @@@PerlDef:
3477     $r = $str;
3478     $r =~ s/\n/\n## /g;
3479     $r =~ s/\n## $/\n/s;
3480     $r .= "\n" unless $r =~ /\n$/;
3481     $r = q<## > . $r;
3482    
3483     @IntMethod:
3484     @@Name: rfc3339DateTime
3485     @@ManakaiDOM:isStatic:1
3486     @@enDesc:
3487     Returns RFC 3339 <CODE::date-time> representation of a date.
3488     @@Param:
3489     @@@Name: perlDate
3490     @@@Type:
3491 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
3492 wakaba 1.1 @@@enDesc:
3493     A Perl representation of date.
3494     @@Return:
3495     @@@Type:
3496 wakaba 1.12 DISLang:String::ManakaiDOM:all
3497 wakaba 1.1 @@@enDesc:
3498     RFC 3339 date string.
3499     @@@PerlDef:
3500     my @time = gmtime $perlDate;
3501     $r = sprintf q<%04d-%02d-%02dT%02d:%02d:%02d+00:00>,
3502     $time[5] + 1900, $time[4] + 1, @time[3,2,1,0];
3503    
3504     @IntMethod:
3505     @@Name: versionDateTime
3506     @@ManakaiDOM:isStatic:1
3507     @@enDesc:
3508     Returns date for version.
3509     @@Param:
3510     @@@Name: perlDate
3511     @@@Type:
3512 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
3513 wakaba 1.1 @@@enDesc:
3514     A Perl representation of date.
3515     @@Return:
3516     @@@Type:
3517 wakaba 1.12 DISLang:String::ManakaiDOM:all
3518 wakaba 1.1 @@@enDesc:
3519     A Perl number literal.
3520     @@@PerlDef:
3521     my @time = gmtime $perlDate;
3522     $r = sprintf q<%04d%02d%02d.%02d%02d>,
3523     $time[5] + 1900, $time[4] + 1, @time[3,2,1];
3524    
3525     @Method:
3526     @@Name: perlLiteral
3527     @@enDesc:
3528     Perl code representation.
3529     @@Param:
3530     @@@Name: val
3531     @@@Type:
3532 wakaba 1.12 DOMMain:any::ManakaiDOM:all
3533 wakaba 1.1 @@@enDesc:
3534     A Perl value.
3535     @@Return:
3536     @@@Type:
3537 wakaba 1.12 DISLang:String::ManakaiDOM:all
3538 wakaba 1.1 @@@enDesc:
3539     A Perl lexical representation of <P::val>.
3540     @@@PerlDef:
3541     unless (defined $val) {
3542     $r = q<undef>;
3543     } elsif (ref $val eq 'ARRAY') {
3544     __DEEP{
3545     $r = q<[> . <ClassM::ManakaiPerlCodeImplementation
3546 wakaba 1.14 .perlList> ($val) . q<]>;
3547 wakaba 1.1 }__;
3548     } elsif (ref $val eq 'HASH') {
3549     __DEEP{
3550     $r = q<{> . <ClassM::ManakaiPerlCodeImplementation
3551 wakaba 1.14 .perlList> ([%$val]) . q<}>;
3552 wakaba 1.1 }__;
3553     } else {
3554     $val =~ s/(['\\])/\\$1/g;
3555     $r = q<'> . $val . q<'>;
3556     }
3557    
3558     @Method:
3559     @@Name: perlList
3560     @@enDesc:
3561     Perl code representation of a list.
3562     @@Param:
3563     @@@Name: val
3564     @@@Type:
3565 wakaba 1.12 Perl:ARRAY::ManakaiDOM:all
3566 wakaba 1.1 @@@enDesc:
3567     A Perl array reference.
3568     @@Return:
3569     @@@Type:
3570 wakaba 1.12 DISLang:String::ManakaiDOM:all
3571 wakaba 1.1 @@@enDesc:
3572     A Perl lexical representation of <CODE::@$val>.
3573     @@@PerlDef:
3574     __DEEP{
3575     $r = join (q<, >, map {<ClassM::ManakaiPerlCodeImplementation
3576     .perlLiteral> ($_)} @{$val});
3577     }__;
3578 wakaba 1.5
3579     @Method:
3580     @@Name: createPerlSub
3581     @@enDesc:
3582     Creates a new <Class::ManakaiPerlSub> object.
3583     @@Param:
3584     @@@Name: subName
3585     @@@Type:
3586 wakaba 1.12 DISLang:String::ManakaiDOM:all
3587 wakaba 1.5 @@@enDesc:
3588     The name of the subroutine to create.
3589     @@@nullCase:
3590     @@@@enDesc:
3591     The subroutine created has no name.
3592     @@Return:
3593     @@@Type:ManakaiPerlSub
3594     @@@enDesc:
3595     Newly created Perl subroutine object.
3596     @@@PerlDef:
3597     __DEEP{
3598 wakaba 1.6 $r = <ClassM::ManakaiPerlSub.newObject>;
3599     __CODE{ManakaiNode:getNewReference::
3600     $object => $r, $ref => $r,
3601     $class => {<ClassName::ManakaiPerlSub>}}__;
3602     $r-><AS::ManakaiPerlSub.localName> ($subName) if defined $subName;
3603 wakaba 1.5 }__;
3604    
3605     @Method:
3606     @@Name: createPerlUnparsedCode
3607     @@enDesc:
3608     Creates a new <Class::ManakaiPerlUnparsedCode> object.
3609     @@Param:
3610     @@@Name: codeArg
3611     @@@Type:
3612     lang:Perl::ManakaiDOM:all
3613     @@@enDesc:
3614     The code fragment.
3615     @@@nullCase:
3616     @@@@enDesc:
3617     The fragment initially has no code.
3618     @@Return:
3619     @@@Type:ManakaiPerlUnparsedCode
3620     @@@enDesc:
3621     Newly created Perl code object.
3622     @@@PerlDef:
3623     __DEEP{
3624 wakaba 1.6 $r = <ClassM::ManakaiPerlUnparsedCode.newObject>;
3625     __CODE{ManakaiNode:getNewReference::
3626     $object => $r, $ref => $r,
3627     $class => {<ClassName::ManakaiPerlUnparsedCode>}}__;
3628 wakaba 1.7 $r-><AS::ManakaiPerlUnparsedCode.code> ($codeArg) if defined $codeArg;
3629 wakaba 1.6 }__;
3630    
3631     @Method:
3632     @@Name: createPerlInlineContainer
3633     @@enDesc:
3634     Creates a new <Class::ManakaiPerlInlineContainer> object.
3635     @@Return:
3636     @@@Type:ManakaiPerlInlineContainer
3637     @@@enDesc:
3638     Newly created Perl code object.
3639     @@@PerlDef:
3640     __DEEP{
3641     $r = <ClassM::ManakaiPerlInlineContainer.newObject>;
3642     __CODE{ManakaiNode:getNewReference::
3643     $object => $r, $ref => $r,
3644     $class => {<ClassName::ManakaiPerlInlineContainer>}}__;
3645     }__;
3646    
3647     @Method:
3648     @@Name: createPerlInlineUnparsedCode
3649     @@enDesc:
3650     Creates a new <Class::ManakaiPerlInlineUnparsedCode> object.
3651     @@Param:
3652     @@@Name: codeArg
3653     @@@Type:
3654     lang:Perl::ManakaiDOM:all
3655     @@@enDesc:
3656     The code fragment.
3657     @@@nullCase:
3658     @@@@enDesc:
3659     The fragment initially has no code.
3660     @@Return:
3661     @@@Type:ManakaiPerlInlineUnparsedCode
3662     @@@enDesc:
3663     Newly created Perl code object.
3664     @@@PerlDef:
3665     __DEEP{
3666     $r = <ClassM::ManakaiPerlInlineUnparsedCode.newObject>;
3667     __CODE{ManakaiNode:getNewReference::
3668     $object => $r, $ref => $r,
3669     $class => {<ClassName::ManakaiPerlInlineUnparsedCode>}}__;
3670 wakaba 1.7 $r-><AS::ManakaiPerlInlineUnparsedCode.code> ($codeArg)
3671 wakaba 1.6 if defined $codeArg;
3672     }__;
3673    
3674     @Method:
3675     @@Name: createPerlBare
3676     @@enDesc:
3677     Creates a new <Class::ManakaiPerlBare> object.
3678     @@Param:
3679     @@@Name: codeArg
3680     @@@Type:
3681     lang:Perl::ManakaiDOM:all
3682     @@@enDesc:
3683     The code fragment.
3684     @@Return:
3685     @@@Type:ManakaiPerlBare
3686     @@@enDesc:
3687     Newly created Perl code object.
3688     @@@PerlDef:
3689     __DEEP{
3690     $r = <ClassM::ManakaiPerlBare.newObject>;
3691     __CODE{ManakaiNode:getNewReference::
3692     $object => $r, $ref => $r,
3693     $class => {<ClassName::ManakaiPerlBare>}}__;
3694 wakaba 1.7 $r-><AS::ManakaiPerlBare.code> ($codeArg);
3695 wakaba 1.6 }__;
3696    
3697     @Method:
3698     @@Name: createPerlAtom
3699     @@enDesc:
3700     Creates a new <Class::ManakaiPerlAtom> object.
3701     @@Param:
3702     @@@Name: codeArg
3703     @@@Type:
3704     lang:Perl::ManakaiDOM:all
3705     @@@enDesc:
3706     The code fragment.
3707     @@Return:
3708     @@@Type:ManakaiPerlAtom
3709     @@@enDesc:
3710     Newly created Perl code object.
3711     @@@PerlDef:
3712     __DEEP{
3713     $r = <ClassM::ManakaiPerlAtom.newObject>;
3714     __CODE{ManakaiNode:getNewReference::
3715     $object => $r, $ref => $r,
3716     $class => {<ClassName::ManakaiPerlAtom>}}__;
3717 wakaba 1.7 $r-><AS::ManakaiPerlBare.code> ($codeArg);
3718 wakaba 1.6 }__;
3719    
3720     @Method:
3721     @@Name: createPerlStringLiteral
3722     @@enDesc:
3723     Creates a new <Class::ManakaiPerlStringLiteral> object.
3724     @@Param:
3725     @@@Name: stringArg
3726     @@@Type:
3727     DISLang:String::ManakaiDOM:all
3728     @@@enDesc: A string.
3729     @@Return:
3730     @@@Type:ManakaiPerlStringLiteral
3731     @@@enDesc:
3732     Newly created Perl code object.
3733     @@@PerlDef:
3734     __DEEP{
3735     $r = <ClassM::ManakaiPerlStringLiteral.newObject>;
3736     __CODE{ManakaiNode:getNewReference::
3737     $object => $r, $ref => $r,
3738     $class => {<ClassName::ManakaiPerlStringLiteral>}}__;
3739 wakaba 1.7 $r-><AS::ManakaiPerlStringLiteral.data> ($stringArg);
3740 wakaba 1.6 }__;
3741    
3742     @Method:
3743     @@Name: createPerlVariable
3744     @@enDesc:
3745     Creates a new <Class::ManakaiPerlVariable> object.
3746     @@Param:
3747     @@@Name: variableType
3748     @@@Type:
3749     DISLang:String::ManakaiDOM:all
3750     @@@enDesc:
3751     Variable prefix.
3752 wakaba 1.16 @@@nullCase:
3753     @@@@enDesc:
3754     If the <P::packageName> is <DOM::null>, then
3755     the <P::variableType> is detected by the prefix of
3756     <P::localName>. Otherwise, it is an unprefixed variable
3757     such as file handle.
3758 wakaba 1.6 @@Param:
3759     @@@Name: packageName
3760     @@@Type:
3761     Perl:package-name::ManakaiDOM:all
3762     @@@enDesc:
3763     Package name.
3764     @@@nullCase:
3765     @@@@enDesc:
3766     The variable belongs to the current package or a
3767     lexical-scoped variable.
3768     @@Param:
3769     @@@Name: localName
3770     @@@Type:
3771     DISLang:String::ManakaiDOM:all
3772     @@@enDesc:
3773 wakaba 1.16 Variable name. If both <P::variableType> and <P::packageName>
3774     is <DOM::null>, the <P::localName> value may be prefixed
3775     by any possible <P::variableType> value.
3776 wakaba 1.6 @@Return:
3777     @@@Type:ManakaiPerlVariable
3778     @@@enDesc:
3779     Newly created Perl variable object.
3780     @@@PerlDef:
3781     __DEEP{
3782     $r = <ClassM::ManakaiPerlVariable.newObject>;
3783     __CODE{ManakaiNode:getNewReference::
3784     $object => $r, $ref => $r,
3785     $class => {<ClassName::ManakaiPerlVariable>}}__;
3786 wakaba 1.16 if (not $variableType and not $packageName and
3787     $localName =~ s/^(\\?[\$\@%&*])//) {
3788     $variableType = $1;
3789     }
3790 wakaba 1.7 $r-><AS::ManakaiPerlVariable.variableType> ($variableType);
3791     $r-><AS::ManakaiPerlVariable.packageName> ($packageName);
3792     $r-><AS::ManakaiPerlVariable.localName> ($localName);
3793 wakaba 1.8 }__;
3794    
3795     @Method:
3796     @@Name: createPerlBlock
3797     @@enDesc:
3798     Creates a new <Class::ManakaiPerlBlock> object.
3799     @@Return:
3800     @@@Type:ManakaiPerlBlock
3801     @@@enDesc:
3802     Newly created Perl code object.
3803     @@@PerlDef:
3804     __DEEP{
3805     $r = <ClassM::ManakaiPerlBlock.newObject>;
3806     __CODE{ManakaiNode:getNewReference::
3807     $object => $r, $ref => $r,
3808     $class => {<ClassName::ManakaiPerlBlock>}}__;
3809 wakaba 1.5 }__;
3810 wakaba 1.9
3811     @Method:
3812     @@Name: createPerlBlockContainer
3813     @@enDesc:
3814     Creates a new <Class::ManakaiPerlBlockContainer> object.
3815     @@Return:
3816     @@@Type:ManakaiPerlBlockContainer
3817     @@@enDesc:
3818     Newly created Perl code object.
3819     @@@PerlDef:
3820     __DEEP{
3821     $r = <ClassM::ManakaiPerlBlockContainer.newObject>;
3822     __CODE{ManakaiNode:getNewReference::
3823     $object => $r, $ref => $r,
3824     $class => {<ClassName::ManakaiPerlBlockContainer>}}__;
3825     }__;
3826 wakaba 1.11
3827     @Method:
3828     @@Name: createPerlStatement
3829     @@enDesc:
3830     Creates a new Perl statement.
3831     @@Param:
3832     @@@Name: codeArg
3833     @@@Type:
3834     lang:Perl::ManakaiDOM:all
3835     @@@enDesc:
3836     A Perl statement without terminating <Perl::;>.
3837     @@@nullCase:
3838     @@@@enDesc:
3839     No initial content.
3840     @@Return:
3841     @@@Type: ManakaiPerlStatement
3842     @@@enDesc:
3843     The newly created Perl code object.
3844     @@@PerlDef:
3845     $r = <ClassM::ManakaiPerlStatement.newObject>;
3846     __CODE{ManakaiNode:getNewReference::
3847     $object => $r, $ref => $r,
3848     $class =>{<ClassName::ManakaiPerlStatement>},
3849     }__;
3850     if (defined $codeArg) {
3851     __DEEP{
3852     $r-><M::ManakaiPerlAnyContainer.appendBare> ($codeArg);
3853     }__;
3854     }
3855 wakaba 1.12
3856     @Method:
3857     @@Name: createPerlIf
3858     @@enDesc:
3859     Creates a <Class::ManakaiPerlIf> object.
3860     @@Param:
3861     @@@Name: conditionArg
3862     @@@Type: ManakaiPerlCodeFragment
3863     @@@enDesc:
3864     Conditoon code fragment object.
3865     @@Param:
3866     @@@Name: trueArg
3867     @@@Type: ManakaiPerlCodeFragment
3868     @@@enDesc:
3869     A true code fragment object.
3870     @@@nullCase:
3871     @@@@enDesc: No true code.
3872     @@Param:
3873     @@@Name: falseArg
3874     @@@Type: ManakaiPerlCodeFragment
3875     @@@enDesc:
3876     A false code fragment object.
3877     @@@nullCase:
3878     @@@@enDesc: No false code.
3879     @@Return:
3880 wakaba 1.21 @@@Type: ManakaiPerlIf
3881 wakaba 1.12 @@@RaiseException:
3882     @@@@@:BAD_CHILD_ERR
3883     @@@@enDesc:
3884     An attempt is made to append a child
3885     that is not valid type.
3886     @@@RaiseException:
3887     @@@@@:IN_USE_NODE_ERR
3888     @@@@enDesc:
3889     An attempt is made to append a node that is
3890     already used elsewhere.
3891     @@@PerlDef:
3892     for my $arg ([conditionArg => $conditionArg]) {
3893     if ({
3894     atom => 1, bare => 1, incontainer => 1, assign => true,
3895     inunparsed => 1, variable => 1, string => true,
3896     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
3897     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
3898     __EXCEPTION{IN_USE_NODE_ERR::
3899     pc:childNode => {$arg->[1]},
3900     MDOMX:param-name => {$arg->[0]},
3901     }__;
3902     }
3903     } else {
3904     __EXCEPTION{BAD_CHILD_ERR::
3905     pc:parentNode => {$self},
3906     pc:childNode => {$arg->[1]},
3907     MDOMX:param-name => {$arg->[0]},
3908     }__;
3909     }
3910     } # c
3911    
3912     for my $arg ([trueArg => $trueArg],
3913     [falseArg => $falseArg]) {
3914     next unless $arg->[1];
3915     if ({
3916     blockcontainer => true,
3917     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
3918     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
3919     __EXCEPTION{IN_USE_NODE_ERR::
3920     pc:childNode => {$arg->[1]},
3921     MDOMX:param-name => {$arg->[0]},
3922     }__;
3923     }
3924     } else {
3925     __EXCEPTION{BAD_CHILD_ERR::
3926     pc:parentNode => {$self},
3927     pc:childNode => {$arg->[1]},
3928     MDOMX:param-name => {$arg->[0]},
3929     }__;
3930     }
3931     } # t/f
3932    
3933     my $assign = <ClassM::ManakaiPerlIf.newObject>;
3934     $assign->{<Q::pc:condition>} = $conditionArg->{<Q::TreeCore:node>};
3935     $assign->{<Q::pc:true>} = $trueArg->{<Q::TreeCore:node>} if $trueArg;
3936     $assign->{<Q::pc:false>} = $falseArg->{<Q::TreeCore:node>} if $falseArg;
3937 wakaba 1.21 $assign-><M::MNodeObject.importTree> ($_)
3938 wakaba 1.12 for (grep {$_}
3939     $assign->{<Q::pc:condition>}, $assign->{<Q::pc:true>},
3940     $assign->{<Q::pc:false>});
3941     $conditionArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
3942     $trueArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $trueArg;
3943     $falseArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $falseArg;
3944 wakaba 1.21 if (defined wantarray) {
3945     __CODE{ManakaiNode:getNewReference::
3946     $object => $assign, $ref => $r,
3947     $class =>{<ClassName::ManakaiPerlIf>},
3948     }__;
3949     }
3950 wakaba 1.1 ##PerlCodeImplementation
3951    
3952 wakaba 1.5 ResourceDef:
3953     @QName: MNodeObject
3954     @rdf:type:
3955     ManakaiDOM:Class
3956     @AliasFor:
3957     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3958    
3959 wakaba 1.1 PropDef:
3960     @QName: code
3961     @enDesc: Perl code.
3962    
3963     PropDef:
3964     @QName: sourceFile
3965     @enDesc:
3966     Source file.
3967    
3968     PropDef:
3969     @QName: sourceLine
3970     @enDesc:
3971     Source line number.
3972 wakaba 1.10
3973     PropDef:
3974     @QName: currentSourceFile
3975     @enDesc:
3976     <QUOTE::Current> source file.
3977    
3978     PropDef:
3979     @QName: currentSourceLine
3980     @enDesc:
3981     <QUOTE::Current> source line number.
3982 wakaba 1.1
3983     PropDef:
3984     @QName: prototype
3985     @enDesc:
3986     Prototype of subroutine.
3987    
3988     PropDef:
3989     @QName: parent
3990     @enDesc:
3991     Higher-level object.
3992    
3993     PropDef:
3994     @QName: sub
3995     @enDesc:
3996     Perl subroutines.
3997    
3998     PropDef:
3999     @QName: packageName
4000     @Type:
4001 wakaba 1.12 Perl:package-name::ManakaiDOM:all
4002 wakaba 1.1 @enDesc:
4003     The fully qualified names of packages.
4004    
4005     PropDef:
4006     @QName: childNodes
4007     @enDesc:
4008     Child code fragments.
4009    
4010     PropDef:
4011     @QName: localName
4012     @enDesc:
4013     Scoped names.
4014 wakaba 1.4
4015     ## -- Exceptions
4016    
4017     ExceptionDef:
4018     @ClsQName: ManakaiPerlCodeException
4019     @enDesc:
4020     Exceptions for the <Module::PerlCode> module.
4021     @ClsISA:
4022     ManakaiDOM:ManakaiDOMException::ManakaiDOM:Perl
4023     @XConstGroupDef:
4024     @@ClsQName: ManakaiPerlCodeExceptionCode
4025     @@enDesc:
4026     Exception codes for <Class::ManakaiPerlCodeException>.
4027 wakaba 1.5 @@XConstDef:
4028     @@@Name: HIERARCHY_REQUEST_ERR
4029     @@@Value:3
4030     @@@enDesc:
4031     An attempt is made to break the hierarchy.
4032     @@@XSubTypeDef:
4033     @@@@QName: BAD_CHILD_ERR
4034     @@@@enDesc:
4035     An attempt is made to append a node as a child whose type
4036     is not allowed.
4037     @@@@XParam:
4038     @@@@@QName: childNode
4039     @@@@@enDesc:
4040     The node attempted to append.
4041     @@@@XParam:
4042     @@@@@QName: parentNode
4043     @@@@@enDesc:
4044     The node to whose child list an attempt to append is made.
4045     @@@XSubTypeDef:
4046     @@@@QName: IN_USE_NODE_ERR
4047     @@@@enDesc:
4048     An attempt is made to append a node that has already been used
4049     elsewhere.
4050     @@@@XParam:
4051     @@@@@QName: childNode
4052     @@@@@enDesc:
4053     The node attempted to append.
4054     @@@@XParam:
4055     @@@@@QName: parentNode
4056     @@@@@enDesc:
4057     The parent node of the <XP::childNode>.
4058 wakaba 1.4 @@XConstDef:
4059     @@@Name: NOT_SUPPORTED_ERR
4060     @@@Value:9
4061     @@@enDesc:
4062     An attempt is made to do something the implementation does not support.
4063     @@@XSubTypeDef:
4064     @@@@QName: UNSUPPORTED_OPERATOR_ERR
4065     @@@@enDesc:
4066     The implementation does not support the specified operator.
4067     @@@@XParam:
4068     @@@@@QName: operator
4069     @@@@@enDesc:
4070     The operator that is not supported.
4071     @@@@enMufDef:
4072     Operator "%p (name => {<Q::pc:operator>});" is not supported
4073    
4074     ElementTypeBinding:
4075     @Name: ExceptionDef
4076     @ElementType:
4077     dis:ResourceDef
4078     @ShadowContent:
4079     @@rdf:type:
4080     ManakaiDOM:ExceptionClass
4081     @@AliasFor:
4082     @@@@:
4083     ::ManakaiDOM:Perl
4084     @@@For:
4085     !=ManakaiDOM:Perl
4086     @@ForCheck:
4087     ManakaiDOM:Perl
4088     @@DOMMain:implementFeature: CoreFeature10
4089    
4090     ElementTypeBinding:
4091     @Name: XConstGroupDef
4092     @ElementType:
4093     dis:ResourceDef
4094     @ShadowContent:
4095     @@rdf:type:
4096     ManakaiDOM:ConstGroup
4097     @@Type:
4098     DOMMain:unsigned-short::ManakaiDOM:all
4099     @@rdfs:subClassOf:
4100     DOMMain:unsigned-short::ManakaiDOM:all
4101    
4102     ElementTypeBinding:
4103     @Name: XConstDef
4104     @ElementType:
4105     dis:ResourceDef
4106     @ShadowContent:
4107     @@rdf:type:
4108     ManakaiDOM:Const
4109    
4110     ElementTypeBinding:
4111     @Name: XSubTypeDef
4112     @ElementType:
4113     dis:ResourceDef
4114     @ShadowContent:
4115     @@rdf:type:
4116     ManakaiDOM:ExceptionOrWarningSubType
4117    
4118     ElementTypeBinding:
4119     @Name: XParam
4120     @ElementType:
4121     ManakaiDOM:exceptionOrWarningParameter
4122    
4123     ElementTypeBinding:
4124     @Name: XParamDef
4125     @ElementType:
4126     dis:ResourceDef
4127     @ShadowContent:
4128     @@rdf:type:
4129     DOMMain:XWParameter
4130     @@AliasFor:
4131     @@@For:
4132     !=ManakaiDOM:all
4133     @@@@:
4134     ::ManakaiDOM:all
4135    
4136     ElementTypeBinding:
4137     @Name: enMufDef
4138     @ElementType:
4139     dis:Def
4140     @ShadowContent:
4141     @@ContentType:
4142     lang:muf
4143     @@lang:en
4144    
4145 wakaba 1.1
4146     ElementTypeBinding:
4147     @Name: ClsDef
4148     @ElementType:
4149     dis:ResourceDef
4150     @ShadowContent:
4151     @@rdf:type:
4152     ManakaiDOM:Class
4153     @@AliasFor:
4154     @@@@:
4155     ::ManakaiDOM:Perl
4156     @@@For:
4157     !=ManakaiDOM:Perl
4158     @@ForCheck:
4159     ManakaiDOM:Perl
4160     @@DOMMain:implementFeature: CoreFeature10
4161    
4162     ElementTypeBinding:
4163     @Name: ClsQName
4164     @ElementType:
4165     dis:QName
4166    
4167     ElementTypeBinding:
4168     @Name: ClsISA
4169     @ElementType:
4170     dis:ISA
4171    
4172     ElementTypeBinding:
4173     @Name: Method
4174     @ElementType:
4175     dis:ResourceDef
4176     @ShadowContent:
4177     @@rdf:type:
4178     DISLang:Method
4179    
4180     ElementTypeBinding:
4181     @Name: ToStringMethod
4182     @ElementType:
4183     dis:ResourceDef
4184     @ShadowContent:
4185     @@rdf:type:
4186     DISLang:Method
4187     @@Operator:
4188     @@@@:
4189     DISPerl:AsStringMethod
4190     @@@ContentType:
4191     dis:TypeQName
4192     @@Description:
4193     @@@lang:en
4194     @@@@:
4195     Returns the textual Perl source code representation of this object.
4196 wakaba 1.9
4197 wakaba 1.14 ElementTypeBinding:
4198     @Name: NumValMethod
4199     @ElementType:
4200     dis:ResourceDef
4201     @ShadowContent:
4202     @@rdf:type:
4203     DISLang:Method
4204     @@Operator:
4205     @@@@: 0+
4206     @@@ContentType:
4207     lang:Perl
4208     @@Description:
4209     @@@lang:en
4210     @@@@:
4211     Returns the numeric value of this object.
4212 wakaba 1.9
4213     ElementTypeBinding:
4214     @Name: IntCloneMethod
4215     @ElementType:
4216     dis:ResourceDef
4217     @ShadowContent:
4218     @@rdf:type:
4219     DISLang:Method
4220     @@Name: makeCloneObject
4221     @@Description:
4222     @@@lang:en
4223     @@@@:
4224     Returns the node object of a deep clone of a node object.
4225     @@ManakaiDOM:isStatic:1
4226     @@ManakaiDOM:isForInternal:1
4227     @@ResourceDef:
4228     @@@rdf:type:
4229     DISLang:MethodParameter
4230     @@@Name: nodeObject
4231     @@@Type:
4232     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
4233     @@@Description:
4234     @@@@lang:en
4235     @@@@@: Node object to copy.
4236     @ShadowSibling:
4237     @@ResourceDef:
4238     @@@rdf:type:
4239     DISLang:Method
4240     @@@Operator:
4241     @@@@@:
4242     DISPerl:CloneMethod
4243     @@@@ContentType:
4244     dis:TypeQName
4245     @@@Description:
4246     @@@@lang:en
4247     @@@@@:
4248     Generates a deep clone of this node and returns it.
4249     @@@ResourceDef:
4250     @@@@rdf:type:
4251     DISLang:MethodReturn
4252     @@@@Type: ManakaiPerlCodeFragment
4253     @@@@Description:
4254     @@@@@lang:en
4255     @@@@@@:
4256     The newly created clone node.
4257     \
4258     {NOTE:: The <A::.parentNode> attribute of the clone
4259     is set to <DOM::null>.
4260     \
4261     }
4262     @@@@Def:
4263     @@@@@ContentType:
4264     lang:Perl
4265     @@@@@@:
4266     ## NOTE: Method name directly written
4267     my $ro = $self->_make_clone_object ($self->{<Q::TreeCore:node>});
4268     $ro-><M::ManakaiDOM:ManakaiDOMNodeObject
4269     ::ManakaiDOM:Perl.changeTreeID>
4270     (<Code::ManakaiDOM:generateUniqueID
4271     ::ManakaiDOM:Perl>);
4272     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($ro);
4273 wakaba 1.1
4274     ElementTypeBinding:
4275     @Name: IntMethod
4276     @ElementType:
4277     dis:ResourceDef
4278     @ShadowContent:
4279     @@rdf:type:
4280     DISLang:Method
4281     @@ManakaiDOM:isForInternal:1
4282    
4283     ElementTypeBinding:
4284     @Name: Attr
4285     @ElementType:
4286     dis:ResourceDef
4287     @ShadowContent:
4288     @@rdf:type:
4289     DISLang:Attribute
4290    
4291     ElementTypeBinding:
4292     @Name: Return
4293     @ElementType:
4294     dis:ResourceDef
4295     @ShadowContent:
4296     @@rdf:type:
4297     DISLang:MethodReturn
4298    
4299     ElementTypeBinding:
4300     @Name: Get
4301     @ElementType:
4302     dis:ResourceDef
4303     @ShadowContent:
4304     @@rdf:type:
4305     DISLang:AttributeGet
4306    
4307     ElementTypeBinding:
4308     @Name: Set
4309     @ElementType:
4310     dis:ResourceDef
4311     @ShadowContent:
4312     @@rdf:type:
4313     DISLang:AttributeSet
4314    
4315     ElementTypeBinding:
4316     @Name: Param
4317     @ElementType:
4318     dis:ResourceDef
4319     @ShadowContent:
4320     @@rdf:type:
4321     DISLang:MethodParameter
4322    
4323     ElementTypeBinding:
4324     @Name: PerlDef
4325     @ElementType:
4326     dis:Def
4327     @ShadowContent:
4328     @@ContentType:
4329     lang:Perl
4330    
4331     ElementTypeBinding:
4332     @Name: disDef
4333     @ElementType:
4334     dis:Def
4335     @ShadowContent:
4336     @@ContentType:
4337     lang:dis
4338    
4339     ElementTypeBinding:
4340     @Name: InCase
4341     @ElementType:
4342     dis:ResourceDef
4343     @ShadowContent:
4344     @@rdf:type:
4345     ManakaiDOM:InCase
4346    
4347     ElementTypeBinding:
4348     @Name: nullCase
4349     @ElementType:
4350     dis:ResourceDef
4351     @ShadowContent:
4352     @@rdf:type:
4353     ManakaiDOM:InCase
4354     @@Value:
4355     @@@is-null:1
4356    
4357     ElementTypeBinding:
4358     @Name: TrueCase
4359     @ElementType:
4360     dis:ResourceDef
4361     @ShadowContent:
4362     @@rdf:type:
4363     ManakaiDOM:InCase
4364     @@Value:true
4365     @@Type:
4366 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
4367 wakaba 1.1
4368    
4369     ElementTypeBinding:
4370     @Name: FalseCase
4371     @ElementType:
4372     dis:ResourceDef
4373     @ShadowContent:
4374     @@rdf:type:
4375     ManakaiDOM:InCase
4376     @@Value:false
4377     @@Type:
4378 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
4379 wakaba 1.1
4380     ElementTypeBinding:
4381     @Name: enDesc
4382     @ElementType:
4383     dis:Description
4384     @ShadowContent:
4385     @@lang:en
4386    
4387     ElementTypeBinding:
4388     @Name: PropDef
4389     @ElementType:
4390     dis:ResourceDef
4391     @ShadowContent:
4392     @@rdf:type:
4393     rdf:Property
4394     @@AliasFor:
4395     @@@@:
4396     ::ManakaiDOM:all
4397     @@@For:
4398     !=ManakaiDOM:all
4399    
4400     ElementTypeBinding:
4401     @Name: NamedParam
4402     @ElementType:
4403     dis:ResourceDef
4404     @ShadowContent:
4405     @@rdf:type:
4406     DISLang:MethodParameter
4407     @@DISPerl:isNamedParameter:1
4408    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24