chg: replaced ant with gradle

This commit is contained in:
Tobi Schäfer 2020-03-16 16:53:52 +01:00
parent ced560f0c7
commit 7eebeee1d0
615 changed files with 87626 additions and 638 deletions

View file

@ -0,0 +1,291 @@
package JSDoc::XMI;
use strict;
use warnings;
use HTML::Template;
use Data::Dumper;
=head1 DESCRIPTION
@packages
@classes
$classname
$classid
$classuuid
$classvisibility (public|protected|private)
@specializationids
$specializationid
$generalizationid
@attributes
$attributeid
$attributeuuid
$attributename
$attributevisibility (public|protected|private)
$ownerscope (instance|classifier)
$classid
$typeid
@methods
$methodid
$methoduuid
$methodname
$methodvisibility (public|protected|private)
$ownerscope (instance|classifier)
$returnid
$returnuuid
$returntypeid
@datatypes
$datatypeid
$datatypeuuid
$datatypename
@generalizations
$generalizationid
$generalizationuuid
$generalizationchild
$generalizationparent
=cut
sub new {
my ($package, $location) = @_;
bless {
location => "${location}JSDoc/",
idcounter => 2,
types => {},
classes => {},
generalizations => {}
}, $package;
}
sub output {
my ($self, $classes) = @_;
my $template = HTML::Template->new(
filename => $self->{location} . 'xmi.tmpl',
die_on_bad_params => 1);
my @packages = $self->get_packages($classes);
my @datatypes = $self->get_datatypes;
my @generalizations = $self->get_generalizations;
$template->param(
packages => \@packages,
datatypes => \@datatypes,
generalizations => \@generalizations );
return $template->output;
}
sub get_id {
'xmi.' . shift->{idcounter}++;
}
sub get_uuid {
my @chars = ('A'..'Z', 'a'..'z', 0..9);
my @uuid;
for (1..32){
push @uuid, $chars[rand(@chars)];
}
join("", @uuid);
}
sub get_packages {
my ($self, $classes) = @_;
my %packages;
push(@{$packages{$_->{package}}}, $_)
for $self->get_classes($classes);
map {
name => $_,
classes => $packages{$_},
packageid => $self->get_id,
packageuuid => $self->get_uuid
}, keys %packages;
}
sub get_classes {
my ($self, $classes) = @_;
my @classes;
# Store all the class-ids before we start on anything else
$self->add_class($_) for keys %$classes;
for my $cname (keys %$classes){
my $class = {
classname => $cname,
classid => $self->add_class($cname),
classuuid => $self->get_uuid,
classvisibility =>
defined($classes->{$cname}->{constructor_vars}->{private})
? 'private' : 'public'
};
$class->{attributes} = $self->get_attributes(
$class->{classid},
$classes->{$cname});
$class->{methods} = $self->get_methods(
$class->{classid},
$classes->{$cname});
$class->{generalizationid} =
$self->get_generalizationid($classes->{$cname});
$class->{package} =
defined($classes->{$cname}->{constructor_vars}->{package})
? $classes->{$cname}->{constructor_vars}->{package}->[0] : '';
push @classes, $class;
}
for my $class (@classes){
$class->{specializationids} = $self->get_specializationids($class);
}
@classes;
}
sub get_methods {
my ($self, $classid, $class) = @_;
my @methods;
for my $k (qw(instance class)){
for my $method (@{$class->{"${k}_methods"}}){
my $type = defined($method->{vars}->{type})
? $method->{vars}->{type}->[0] : 'Object';
my $meth = {
methodid => $self->get_id,
methoduuid => $self->get_uuid,
methodname => $method->{mapped_name},
methodvisibility =>
defined($method->{vars}->{private})
? 'private' : 'public',
ownerscope =>
$k eq 'class' ? 'classifier' : 'instance',
returnid => $self->get_id,
returnuuid => $self->get_uuid,
returntypeid => $self->add_type($type)
};
push @methods, $meth;
}
}
return \@methods;
}
sub get_attributes {
my ($self, $classid, $class) = @_;
my @attributes;
for my $k (qw(instance class)){
for my $field (@{$class->{"${k}_fields"}}){
my $type = defined($field->{field_vars}->{type})
? $field->{field_vars}->{type}->[0] : 'Object';
my $attr = {
attributeid => $self->get_id,
attributeuuid => $self->get_uuid,
attributename => $field->{field_name},
attributevisibility =>
defined($field->{field_vars}->{private})
? 'private' : 'public',
ownerscope =>
$k eq 'class' ? 'classifier' : 'instance',
classid => $classid,
typeid => $self->add_type($type)
};
push @attributes, $attr;
}
}
\@attributes;
}
sub get_generalizationid {
my ($self, $class) = @_;
if ($class->{extends}){
return $self->add_generalization(
$class->{classname},
$class->{extends});
}
'';
}
sub get_specializationids {
my ($self, $class) = @_;
my $cname = $class->{classname};
my $cid = $self->add_class($cname);
my @specializationids;
for my $id (keys %{$self->{generalizations}}){
my $generalization = $self->{generalizations}->{$id};
if ($generalization->{parent} eq $cid){
push @specializationids, { specializationid => $id };
}
}
\@specializationids;
}
sub get_datatypes {
my ($self) = @_;
my @datatypes;
while (my ($type, $id) = each(%{$self->{types}})){
push @datatypes, {
datatypeid => $id,
datatypeuuid => $self->get_uuid,
datatypename => $type };
}
@datatypes;
}
sub get_generalizations {
my ($self) = @_;
my @generalizations;
while (my ($id, $generalization) = each(%{$self->{generalizations}})){
push @generalizations, {
generalizationid => $id,
generalizationuuid => $self->get_uuid,
generalizationchild => $generalization->{parent},
generalizationparent => $generalization->{child}};
}
@generalizations;
}
sub add_type {
my ($self, $type) = @_;
$type =~ s/^\s*(\S+)\s*$/$1/;
if (defined($self->{classes}->{$type})){
return $self->add_class($type);
} elsif (defined($self->{types}->{$type})){
return $self->{types}->{$type};
}
$self->{types}->{$type} = $self->get_id;
}
sub add_class {
my ($self, $class) = @_;
$class =~ s/^\s*(\S+)\s*$/$1/;
if (defined($self->{classes}->{$class})){
return $self->{classes}->{$class};
}
$self->{classes}->{$class} = $self->get_id;
}
sub add_generalization {
my ($self, $subclassname, $superclassname) = @_;
my $subclassid = $self->add_class($subclassname);
my $superclassid = $self->add_class($superclassname);
my $generalization = {
child => $subclassid,
parent => $superclassid };
my $generalizationid = $self->get_id;
$self->{generalizations}->{$generalizationid} = $generalization;
$generalizationid;
}
1;

View file

@ -0,0 +1,72 @@
package JSDoc::XML;
use strict;
use warnings;
use HTML::Template;
sub new {
my ($package, $location) = @_;
bless { location => "${location}JSDoc/" }, $package;
}
sub output {
my ($self, $classes) = @_;
my @classes = _preprocess(
grep {defined($_->{classname})} values %$classes);
my $template = HTML::Template->new(
filename => $self->{location} . 'xml.tmpl',
die_on_bad_params => 1);
$template->param(classes => \@classes);
return $template->output;
}
sub _preprocess {
my @classes = @_;
for (@classes){
$_->{inherits} = _preprocess_inherits($_->{inherits});
$_->{constructor_vars} = _preprocess_vars($_->{constructor_vars});
for my $method (@{$_->{instance_methods}}, @{$_->{class_methods}}){
$method->{vars} = _preprocess_vars($method->{vars});
}
for my $field (@{$_->{instance_fields}}, @{$_->{class_fields}}){
$field->{field_vars} = _preprocess_vars($field->{field_vars});
}
}
@classes;
}
sub _preprocess_inherits {
my ($inherits) = @_;
my @inherits;
for my $class (keys %$inherits){
my $inherit = {
class => $class,
methods => [map { name => $_ },
@{$inherits->{$class}->{instance_methods}}]};
push @inherits, $inherit;
}
\@inherits;
}
sub _preprocess_vars {
my ($vars) = @_;
return $vars if ref($vars) eq 'ARRAY';
my @vars;
for my $key (keys %$vars){
my $var;
if (ref($vars->{$key}) eq 'ARRAY'){
$var = {
'@name' => $key,
values => [map { val => $_ }, @{$vars->{$key}}] };
} else {
$var = {
'@name' => $key,
values => [ { val => $vars->{$key} } ] };
}
push @vars, $var;
}
\@vars;
}
1;

View file

@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmi.version="1.0">
<XMI.header>
<XMI.documentation>
<XMI.exporter>JSDoc XMI Export</XMI.exporter>
<XMI.exporterVersion>0.1</XMI.exporterVersion>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" xmi.version="1.3"/>
</XMI.header>
<XMI.content>
<Model_Management.Model xmi.id="xmi.1" xmi.uuid="10-0-0-5-3605f878:101c2e18bff:-8000">
<Foundation.Core.ModelElement.name>JSDoc</Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isRoot xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isLeaf xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isAbstract xmi.value="false"/>
<Foundation.Core.Namespace.ownedElement>
<!-- BEGIN PACKAGES -->
<TMPL_LOOP NAME="packages">
<TMPL_IF NAME="name">
<Model_Management.Package
xmi.id="<TMPL_VAR NAME="packageid">"
xmi.uuid="<TMPL_VAR NAME="packageuuid">">
<Foundation.Core.ModelElement.name><TMPL_VAR NAME="name"></Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isRoot xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isLeaf xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isAbstract xmi.value="false"/>
<Foundation.Core.ModelElement.namespace>
<Foundation.Core.Namespace xmi.idref="xmi.1"/>
</Foundation.Core.ModelElement.namespace>
</TMPL_IF>
<!-- BEGIN CLASS DESCRIPTIONS -->
<TMPL_LOOP NAME="classes">
<TMPL_IF NAME="package">
<Foundation.Core.Namespace.ownedElement>
</TMPL_IF>
<!-- BEGIN CLASS -->
<Foundation.Core.Class
xmi.id="<TMPL_VAR NAME=classid>"
xmi.uuid="<TMPL_VAR NAME=classuuid>">
<!-- CLASS NAME -->
<Foundation.Core.ModelElement.name><!-- TMPL_VAR NAME="classname" --></Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.visibility
xmi.value="<TMPL_VAR NAME=classvisibility>"/>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isRoot xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isLeaf xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isAbstract xmi.value="false"/>
<Foundation.Core.Class.isActive xmi.value="false"/>
<Foundation.Core.ModelElement.namespace>
<Foundation.Core.Namespace xmi.idref="xmi.1"/>
</Foundation.Core.ModelElement.namespace>
<!-- BEGIN REFERENCE TO INHERITANCE -->
<TMPL_IF NAME="generalizationid">
<Foundation.Core.GeneralizableElement.generalization>
<Foundation.Core.Generalization
xmi.idref="<TMPL_VAR NAME=generalizationid >"/>
</Foundation.Core.GeneralizableElement.generalization>
</TMPL_IF>
<TMPL_LOOP NAME="specializationids">
<Foundation.Core.GeneralizableElement.specialization>
<Foundation.Core.Generalization
xmi.idref="<TMPL_VAR NAME=specializationid >"/>
</Foundation.Core.GeneralizableElement.specialization>
</TMPL_LOOP>
<!-- END REFERENCE TO INHERITANCE -->
<Foundation.Core.Classifier.feature>
<!-- BEGIN ATTRIBUTES -->
<TMPL_LOOP NAME="attributes">
<!-- BEGIN ATTRIBUTE -->
<Foundation.Core.Attribute
xmi.id="<TMPL_VAR NAME=attributeid>"
xmi.uuid="<TMPL_VAR NAME=attributeuuid>">
<Foundation.Core.ModelElement.name><!-- TMPL_VAR NAME="attributename" --></Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.visibility xmi.value="<TMPL_VAR NAME=attributevisibility>"/>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.Feature.ownerScope
xmi.value="<TMPL_VAR NAME=ownerscope>"/>
<!--Foundation.Core.StructuralFeature.multiplicity>
<Foundation.Data_Types.Multiplicity xmi.id="xmi.5">
<Foundation.Data_Types.Multiplicity.range>
<Foundation.Data_Types.MultiplicityRange xmi.id="xmi.6">
<Foundation.Data_Types.MultiplicityRange.lower>1</Foundation.Data_Types.MultiplicityRange.lower>
<Foundation.Data_Types.MultiplicityRange.upper>1</Foundation.Data_Types.MultiplicityRange.upper>
</Foundation.Data_Types.MultiplicityRange>
</Foundation.Data_Types.Multiplicity.range>
</Foundation.Data_Types.Multiplicity>
</Foundation.Core.StructuralFeature.multiplicity-->
<Foundation.Core.StructuralFeature.changeability xmi.value="changeable"/>
<Foundation.Core.StructuralFeature.targetScope xmi.value="instance"/>
<Foundation.Core.Feature.owner>
<Foundation.Core.Classifier
xmi.idref="<TMPL_VAR NAME=classid>"/>
</Foundation.Core.Feature.owner>
<Foundation.Core.StructuralFeature.type>
<Foundation.Core.Classifier
xmi.idref="<TMPL_VAR NAME=typeid>"/>
</Foundation.Core.StructuralFeature.type>
<!--Foundation.Core.ModelElement.taggedValue>
<Foundation.Extension_Mechanisms.TaggedValue xmi.id="xmi.8">
<Foundation.Extension_Mechanisms.TaggedValue.tag>transient</Foundation.Extension_Mechanisms.TaggedValue.tag>
<Foundation.Extension_Mechanisms.TaggedValue.value>false</Foundation.Extension_Mechanisms.TaggedValue.value>
<Foundation.Extension_Mechanisms.TaggedValue.modelElement>
<Foundation.Core.ModelElement xmi.idref="xmi.4"/>
</Foundation.Extension_Mechanisms.TaggedValue.modelElement>
</Foundation.Extension_Mechanisms.TaggedValue>
<Foundation.Extension_Mechanisms.TaggedValue xmi.id="xmi.9">
<Foundation.Extension_Mechanisms.TaggedValue.tag>volatile</Foundation.Extension_Mechanisms.TaggedValue.tag>
<Foundation.Extension_Mechanisms.TaggedValue.value>false</Foundation.Extension_Mechanisms.TaggedValue.value>
<Foundation.Extension_Mechanisms.TaggedValue.modelElement>
<Foundation.Core.ModelElement xmi.idref="xmi.4"/>
</Foundation.Extension_Mechanisms.TaggedValue.modelElement>
</Foundation.Extension_Mechanisms.TaggedValue>
</Foundation.Core.ModelElement.taggedValue-->
</Foundation.Core.Attribute>
<!-- END ATTRIBUTE -->
</TMPL_LOOP>
<!-- END ATTRIBUTES -->
<!-- BEGIN METHODS -->
<TMPL_LOOP NAME="methods">
<!-- BEGIN METHOD -->
<Foundation.Core.Operation
xmi.id="<TMPL_VAR NAME=methodid>"
xmi.uuid="<TMPL_VAR NAME=methoduuid>">
<Foundation.Core.ModelElement.name><!-- TMPL_VAR NAME="methodname" --></Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.visibility
xmi.value="<TMPL_VAR NAME=methodvisibility>"/>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.Feature.ownerScope
xmi.value="<TMPL_VAR NAME=ownerscope>"/>
<Foundation.Core.BehavioralFeature.isQuery xmi.value="false"/>
<Foundation.Core.Operation.concurrency xmi.value="sequential"/>
<Foundation.Core.Operation.isRoot xmi.value="false"/>
<Foundation.Core.Operation.isLeaf xmi.value="false"/>
<Foundation.Core.Operation.isAbstract xmi.value="false"/>
<Foundation.Core.Feature.owner>
<Foundation.Core.Classifier
xmi.idref="<TMPL_VAR NAME=classid>"/>
</Foundation.Core.Feature.owner>
<Foundation.Core.BehavioralFeature.parameter>
<!-- BEGIN RETURN TYPE -->
<Foundation.Core.Parameter
xmi.id="<TMPL_VAR NAME=returnid>"
xmi.uuid="<TMPL_VAR NAME=returnuuid>">
<Foundation.Core.ModelElement.name>return</Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.Parameter.kind xmi.value="return"/>
<!--Foundation.Core.Parameter.behavioralFeature>
<Foundation.Core.BehavioralFeature xmi.idref="xmi.10"/>
</Foundation.Core.Parameter.behavioralFeature-->
<Foundation.Core.Parameter.type>
<Foundation.Core.Classifier
xmi.idref="<TMPL_VAR NAME=returntypeid>"/>
</Foundation.Core.Parameter.type>
</Foundation.Core.Parameter>
<!-- END RETURN TYPE -->
</Foundation.Core.BehavioralFeature.parameter>
</Foundation.Core.Operation>
<!-- END METHOD -->
</TMPL_LOOP>
<!-- END METHODS -->
</Foundation.Core.Classifier.feature>
</Foundation.Core.Class>
<!-- END CLASS -->
<TMPL_IF NAME="package">
</Foundation.Core.Namespace.ownedElement>
</TMPL_IF>
</TMPL_LOOP>
<!-- END CLASS DESCRIPTIONS -->
<TMPL_IF name="name">
</Model_Management.Package>
</TMPL_IF>
</TMPL_LOOP>
<!-- END PACKAGES -->
<!-- BEGIN DATATYPE DESCRIPTIONS -->
<TMPL_LOOP name="datatypes">
<!-- BEGIN DATATYPE -->
<Foundation.Core.DataType
xmi.id="<TMPL_VAR NAME=datatypeid>"
xmi.uuid="<TMPL_VAR NAME=datatypeuuid>">
<Foundation.Core.ModelElement.name><!-- TMPL_VAR NAME="datatypename" --></Foundation.Core.ModelElement.name>
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isRoot xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isLeaf xmi.value="false"/>
<Foundation.Core.GeneralizableElement.isAbstract xmi.value="false"/>
<Foundation.Core.ModelElement.namespace>
<Foundation.Core.Namespace xmi.idref="xmi.1"/>
</Foundation.Core.ModelElement.namespace>
</Foundation.Core.DataType>
<!-- END DATATYPE -->
</TMPL_LOOP>
<!-- END DATATYPE DESCRIPTIONS -->
<!-- BEGIN GENERALIZATIONS -->
<TMPL_LOOP NAME="generalizations">
<!-- BEGIN GENERALIZATION -->
<Foundation.Core.Generalization
xmi.id="<TMPL_VAR NAME=generalizationid >"
xmi.uuid="<TMPL_VAR NAME=generalizationuuid >" >
<Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
<Foundation.Core.ModelElement.namespace>
<Foundation.Core.Namespace xmi.idref="xmi.1"/>
</Foundation.Core.ModelElement.namespace>
<Foundation.Core.Generalization.child>
<Foundation.Core.GeneralizableElement
xmi.idref="<TMPL_VAR NAME=generalizationchild >"/>
</Foundation.Core.Generalization.child>
<Foundation.Core.Generalization.parent>
<Foundation.Core.GeneralizableElement
xmi.idref="<TMPL_VAR NAME=generalizationparent >"/>
</Foundation.Core.Generalization.parent>
</Foundation.Core.Generalization>
<!-- END GENERALIZATION -->
</TMPL_LOOP>
<!-- END GENERALIZATIONS -->
</Foundation.Core.Namespace.ownedElement>
</Model_Management.Model>
</XMI.content>
</XMI>

View file

@ -0,0 +1,128 @@
<?xml version="1.0"?>
<javascript>
<classes>
<TMPL_LOOP NAME="classes">
<class
name="<TMPL_VAR NAME="classname">"
<TMPL_IF NAME="extends">extends="<TMPL_VAR NAME='extends'>"</TMPL_IF> >
<constructor_args><!-- TMPL_VAR NAME="constructor_args" --></constructor_args>
<constructor_vars>
<TMPL_LOOP NAME="constructor_vars">
<var name="<TMPL_VAR NAME='@name'>">
<TMPL_LOOP NAME="values">
<value><![CDATA[<TMPL_VAR NAME="val">]]></value>
</TMPL_LOOP>
</var>
</TMPL_LOOP>
</constructor_vars>
<constructor_detail><![CDATA[<TMPL_VAR NAME="constructor_detail">]]></constructor_detail>
<instance-methods>
<TMPL_LOOP NAME="instance_methods">
<method mapped_name="<TMPL_VAR NAME='mapped_name'>">
<description><![CDATA[<TMPL_VAR NAME="description">]]></description>
<argument_list><!--
TMPL_VAR NAME="argument_list"
--></argument_list>
<vars>
<TMPL_LOOP NAME="vars">
<var name="<TMPL_VAR NAME='@name'>">
<TMPL_LOOP NAME="values">
<value><![CDATA[<TMPL_VAR NAME="val">]]></value>
</TMPL_LOOP>
</var>
</TMPL_LOOP>
</vars>
</method>
</TMPL_LOOP>
</instance-methods>
<instance-fields>
<TMPL_LOOP NAME="instance_fields">
<field name="<TMPL_VAR NAME='field_name'>">
<field-value><![CDATA[<TMPL_VAR NAME="field_value">]]></field-value>
<field-description><![CDATA[<TMPL_VAR NAME="field_description">]]></field-description>
<vars>
<TMPL_LOOP NAME="field_vars">
<var name="<TMPL_VAR NAME='@name'>">
<TMPL_LOOP NAME="values">
<value><![CDATA[<TMPL_VAR NAME="val">]]></value>
</TMPL_LOOP>
</var>
</TMPL_LOOP>
</vars>
</field>
</TMPL_LOOP>
</instance-fields>
<class-methods>
<TMPL_LOOP NAME="class_methods">
<method mapped_name="<TMPL_VAR NAME='mapped_name'>">
<description><![CDATA[<TMPL_VAR NAME="description">]]></description>
<argument_list><!--
TMPL_VAR NAME="argument_list"
--></argument_list>
<vars>
<TMPL_LOOP NAME="vars">
<var name="<TMPL_VAR NAME='@name'>">
<TMPL_LOOP NAME="values">
<value><![CDATA[<TMPL_VAR NAME="val">]]></value>
</TMPL_LOOP>
</var>
</TMPL_LOOP>
</vars>
</method>
</TMPL_LOOP>
</class-methods>
<class-fields>
<TMPL_LOOP NAME="class_fields">
<field name="<TMPL_VAR NAME='field_name'>">
<field-value><![CDATA[<TMPL_VAR NAME="field_value">]]></field-value>
<field-description><![CDATA[<TMPL_VAR NAME="field_description">]]></field-description>
<vars>
<TMPL_LOOP NAME="field_vars">
<var name="<TMPL_VAR NAME='@name'>">
<TMPL_LOOP NAME="values">
<value><![CDATA[<TMPL_VAR NAME="val">]]></value>
</TMPL_LOOP>
</var>
</TMPL_LOOP>
</vars>
</field>
</TMPL_LOOP>
</class-fields>
<inner-classes>
<TMPL_LOOP NAME="inner_classes">
<class name="<TMPL_VAR NAME='class_name'>"/>
</TMPL_LOOP>
</inner-classes>
<TMPL_LOOP NAME="inherits">
<inherits from="<TMPL_VAR NAME='class'>">
<TMPL_IF NAME="methods">
<methods>
<TMPL_LOOP NAME="methods">
<method><!-- TMPL_VAR NAME="name" --></method>
</TMPL_LOOP>
</methods>
</TMPL_IF>
<TMPL_IF NAME="fields">
<fields>
</fields>
</TMPL_IF>
</inherits>
</TMPL_LOOP>
</class>
</TMPL_LOOP>
</classes>
</javascript>