/[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.26 - (hide annotations) (download)
Sat Sep 17 15:03:03 2005 UTC (19 years, 10 months ago) by wakaba
Branch: MAIN
Changes since 1.25: +15 -5 lines
Perl-related methods moved from DIS to DIS/Perl; DIS readProperties method implemented (still buggy)

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24