/[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.19 - (hide annotations) (download)
Tue May 3 12:34:38 2005 UTC (20 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.18: +98 -42 lines
Make phase3 Message/Util and Message/Markup and Message/DOM/DOMMetaImpl now ready

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24