/[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.34 - (hide annotations) (download)
Sat Oct 8 15:05:46 2005 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.33: +2 -2 lines
++ manakai/lib/Message/Markup/ChangeLog	8 Oct 2005 14:01:45 -0000
	* SuikaWikiConfig21.dis (MUErrorHandler): Removed.
	(ManakaiSWCFGNode): Extends ManakaiDefaultErrorHandler.

2005-10-08  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Util/ChangeLog	8 Oct 2005 15:01:39 -0000
	* DIS.dis (readProperties): Recognizes hexdecimal
	in "DISCore:Integer" (prefixed by "0x").

2005-10-08  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Util/Error/ChangeLog	8 Oct 2005 14:04:28 -0000
	* DOMException.dis: Old long alias names removed.

2005-10-08  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Util/DIS/ChangeLog	8 Oct 2005 15:03:27 -0000
	* Perl.dis (plCodeFragment): Ignores method name if it is a URI.

2005-10-08  Wakaba  <wakaba@suika.fam.cx>

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24