/[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.27 - (hide annotations) (download)
Mon Sep 19 16:17:52 2005 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.26: +21 -22 lines
++ ./bin/ChangeLog	19 Sep 2005 12:05:15 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* mkdisdump.pl (progress_inc, progress_reset): New functions.

++ ./lib/Message/Util/ChangeLog	19 Sep 2005 12:14:55 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* DIS.dis: Parameter "databaseArg" added to various
	methods to support objects that have no associated
	database.
	(getNamespaceBindingList, getDefaultNamespaceURIRef): New
	methods.
	(NO_RDF_TYPE_ERR): New error type.
	(loadResource): Throws NO_RDF_TYPE_ERR if no rdf:type
	attribute specified for a resource definition.

++ ./lib/Message/Util/Error/ChangeLog	19 Sep 2005 12:21:57 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* Core.dis: Missing rdf:type attribute added to classes.

++ ./lib/Message/Util/DIS/ChangeLog	19 Sep 2005 12:23:54 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* Value.dis (sourceNodePath): New attribute.
	(DVNSValue, DVNSOrderedList): New interfaces and classes.

	* Perl.dis: Some alias definitions moved from ../DIS.dis.
	The "namespaceContext" parameters added to some methods.
	(plCodeFragment): Now Perl'ize new DISCore:Integer typed string.
	(plImplementation): Directly instantiates PCImplementation
	to reduce overheads to find an implementation by ImplementationRegistry.

++ ./lib/Message/DOM/ChangeLog	19 Sep 2005 12:08:55 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* DOMMain.dis (ManakaiDOM:DOMMethod, ManakaiDOM:DOMMethodReturn,
	ManakaiDOM:DOMAttribute, ManakaiDOM:DOMAttrGet,
	ManakaiDOM:DOMAttrSet, ManakaiDOM:DOMMethodParam): Removed.
	(ManakaiDOMTimeStamp): Removed.

	* DOMBoot.dis, DOMMetaImpl.dis, DOMMetaImpl.pm: Removed (they are no
	longer in use).

2005-09-18  Wakaba  <wakaba@suika.fam.cx>

	* DOMMain.dis (StringOutOfBoundsException): New exception.

++ ./lib/manakai/ChangeLog	19 Sep 2005 12:23:20 -0000
2005-09-19  Wakaba  <wakaba@suika.fam.cx>

	* DISCore.dis (DISCore:Boolean): New preferred name
	to dis:Boolean.
	(DISCore:Integer): New type.
	(dis:Value): Default type is changed to DISCore:String.

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24