/[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.28 - (hide annotations) (download)
Thu Sep 22 11:02:33 2005 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.27: +13 -3 lines
++ manakai/bin/ChangeLog	22 Sep 2005 10:33:43 -0000
2005-09-22  Wakaba  <wakaba@suika.fam.cx>

	* dac2pm.pl (status_msg_, status_msg): New functions.
	(--create-perl-module): New option.

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

	* dac.pl: Show how long the process takes.
	(status_msg_, status_msg): New functions.
	(dac_load_module_file): Converts dis document into DNLite document.

	* dac2pm.pl: Unused namespace bindings removed.

++ manakai/lib/Message/Util/ChangeLog	22 Sep 2005 10:40:13 -0000
2005-09-22  Wakaba  <wakaba@suika.fam.cx>

	* DIS.dis (Util:): Added for DIS|ForEmpty and DIS|ForLatest.
	(disIsNullable): Reimplemented.

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

	* DIS.dis (addNamespaceBinding): New method.

++ manakai/lib/Message/Util/DIS/ChangeLog	22 Sep 2005 10:56:00 -0000
2005-09-21  Wakaba  <wakaba@suika.fam.cx>

	* Value.dis (DVValue): Extends DIS|NSResolverDIS.

	* DNLite.dis: "databaseArg" parameter added to some methods.
	(free, addNamespaceBinding, getDefaultNamespaceURIRef,
	getNamespaceBindingList): New methods.
	(DNLElement): Inherits DIS/Perl|DISElementPerl.
	(expandedURI, disGetAttribute, plImplementation): New.

	* Perl.dis (plCodeFragment): "databaseArg" parameter added.

++ manakai/lib/Message/DOM/ChangeLog	22 Sep 2005 10:36:20 -0000
2005-09-21  Wakaba  <wakaba@suika.fam.cx>

	* DOMCore.pm (DOMImplementation): Provides "XML" and "XMLVersion"
	features if it is "for" ManakaiDOM:DOMXMLFeature.

	* DOMMain.pm (StringExtended): Code portions of raising
	StringOutOfBoundsException is temporary disabled since
	it is not a DOM-style exception supported by
	current implementation of ManakaiNode - it will be
	recovered in later revision.

++ manakai/lib/manakai/ChangeLog	22 Sep 2005 11:00:19 -0000
2005-09-21  Wakaba  <wakaba@suika.fam.cx>

	* DISPerl.dis (DISPerl:packageName): New.

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24