/[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.32 - (hide annotations) (download)
Thu Sep 29 15:18:10 2005 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.31: +2 -2 lines
++ manakai/lib/Message/Util/ChangeLog	29 Sep 2005 14:43:39 -0000
2005-09-29  Wakaba  <wakaba@suika.fam.cx>

	* DIS.dis: Shares local name, namespace URI and for URI
	if possible.

	* PerlCode.dis (stringify): Sorts "require" statements by module
	name.

++ manakai/lib/Message/Util/DIS/ChangeLog	29 Sep 2005 14:44:23 -0000
2005-09-29  Wakaba  <wakaba@suika.fam.cx>

	* DNLite.dis: Shares element type expanded URI where possible.

	* Value.dis: Shares data type URI where possible.

++ manakai/lib/manakai/ChangeLog	29 Sep 2005 14:45:10 -0000
2005-09-29  Wakaba  <wakaba@suika.fam.cx>

	* DISPerl.dis (DISPerl:HashStringRef, DISPerl:StringRef): New.

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24