This work is in support of a POJO automated documentation tool that will be released shortly.
Find attached commented xml file walkthroughs of the comment.xml and reflection.org files that are consumed by Sandcastle Help File Builder to generate documentation and working samples to test these conclusions
Steps to generate docs:
C:\docGen\
C:\docGen\docGen.shfbproj
C:\docGen\Explained\
C:\docGen\Explained\comments.xml
C:\docGen\Explained\reflection.org
C:\docGen\Output\
C:\docGen\Output\docgen.org
C:\docGen\Output\docgen.xml
C:\docGen\Projects\
C:\docGen\Projects\docgen.project.xml
If uncompressed to the default directory shown, you may simply dblclick docGen.shfbproj and build the sample help file.
Otherwise you will need to change output path and working path in the Paths section of config and redirect the AjaxDoc plugin.
To take a step back and walk through configuring a SHFB project to generate JS docs:
- File>New Project
- Build section>PlugInConfigurations Dialog>Add AjaxDoc Builder plugin.
- Configure>
Set AjaxDoc URL to the root of your doc project (C:\docGen) or to a virtual directory.
Set project name to 'docGen'
UNCHECK Regenerate the output files. We are not using Bertrands MS Ajax doc tool, just the directory structure that the plugin recognizes.
OK>CLOSE.
- Paths section>
Output Path>C:\docGen\Help
Working Path>C:\docGen\Temp
- Help File section>Syntax Filters>
uncheck all but JScript. This is as close as it gets.
- Build the help file.
Walkthroughs:
comments.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
//
// salientJS JavaScript Library v1.0
// http://skysanders.net/code/salientJs/
//
// Copyright (c) 2009 Sky Sanders - sky@skysanders.net
// Dual licensed under the MIT and GPL licenses.
// http://skysanders.net/code/salientJs/license.txt
//
COMMENTS.XML FILE WALKTHROUGH
The comments file and reflection file are used in tandem to generate documentation.
Each <member/> element in this file will be referenced by an <api/> element in the
reflection file for documentation.
This represents the minimum content required in the comments file to generate Javascript
Documentation using Sandcastle/SHFB/AjaxDocPlugin.
While salient.docGen will extract and SHFB and Sandcastle will recognize and render
the full compliment of xml doc comments (http://msdn.microsoft.com/en-us/library/b2s063f7.aspx),
the Visual Studio JavaScript Intellisense formatter only recognizes summary, param, field,
value and returns. It is recommended to utilize these tags to convey relevant information
to the programmer and defer use of the other tags for supplemental information.
Informative documentation regarding the format and implementation of the comments and reflection
file schemas can be found at (insert the documents i was unable to find here. lolz)
NOTE: version 1 of salient.docGen does not traverse inheritance. All type members are explicitely
documented on the type. Typically non-overridden inherited members are referenced in the elements
node of the declaration.
-->
<doc>
<members>
<!--
PROJECT SUMMARY
Note: if specified in the comments file AND in the SHFB Gui both instances will be rendered. Choose one
location to create them.
salient.docGen reads the project summary from the project.xml file and namespace summary from the
project.xml and the xml comments in the namespace object itself giving priority to the source code.
This is to enable documentation of object literal namespace declarations and any static fields they might
expose as an object literal does not expose source code for parsing of comments.
-->
<member name="R:Project">
<summary>{project summary}</summary>
</member>
<!--
NAMESPACE SUMMARY see PROJECT SUMMARY
-->
<member name="N:{namespace}">
<summary>{namespace summary}</summary>
</member>
<!--
TYPE COMMENTS
-->
<member name="T:{namespace}.{type}">
<summary>{type summary}</summary>
</member>
<!--
METHOD COMMENTS
If the method accepts params the param types should be included in the signature. e.g.
<member name="M:mynamespace.myclass.mymethod(String,Boolean)">
The javascript syntaxGenerator and Visual Studio JavaScript Intellisense formatter do not
provide for optional params that are so prevelant in js code.
Specify in the param description that a param is optional and in the summary what behavior
to expect.
This applies to constructor methods as well.
-->
<!--
METHOD COMMENTS
-->
<member name="M:{namespace}.{type}.{method}{signature}">
<summary>{method summary}</summary>
<param name="{param}">{param description}</param>
<returns>{return summary}</returns>
<exception cref="T:{type}">{error description}</exception>
</member>
<!--
CONSTRUCTOR COMMENTS
-->
<member name="M:{namespace}.{type}.#ctor">
<summary>{.ctor summary}</summary>
</member>
<!--
FIELD COMMENTS
-->
<member name="F:{namespace}.{type}.{field}">
<summary>{field summary}</summary>
</member>
<!--
STATIC NAMESPACE STATIC METHOD AND FIELD HACK
JavaScript 'namespaces' are objects and as such can and do contain static methods and fields.
These can be documented in a limited fashion by declaring the method or field as a type (T:).
This will result in the method or field being listed as a direct child of the namespace in the TOC.
The limitation of this hack is that in the namespace content page there is not a section for
methods and fields, only classes, enums, interfaces etc.
So the only place the method or field is discoverable is in the TOC, Index and search. In that they are
immediate children of the namespace this seems to be an acceptable concession.
Also be aware that VS intellisense formatter does not parse comments for object literals.
An alternative is to create a static type of the same name as the namespace.
This will give full discovery.
Short version of preceding text: declare static methods and fields as types (T:) and omit the typename
in the name attribute effectively hanging them directly off the namespace.
-->
<member name="T:{namespace}.{method}{signature}">
<summary>{method summary}</summary>
<param name="{param}">{param description}</param>
</member>
<member name="T:{namespace}.{field}">
<summary>{field summary}</summary>
</member>
<member name="T:{namespace}.{field}">
<summary>{field summary}</summary>
</member>
</members>
</doc>
reflection.org
lt;?xml version="1.0" encoding="utf-8"?>
<!--
//
// salientJS JavaScript Library v1.0
// http://skysanders.net/code/salientJs/
//
// Copyright (c) 2009 Sky Sanders - sky@skysanders.net
// Dual licensed under the MIT and GPL licenses.
// http://skysanders.net/code/salientJs/license.txt
//
REFLECTION.ORG FILE WALKTHROUGH FROM A JAVASCRIPT DOCUMENTATION PERSPECTIVE
The comments file and reflection file are used in tandem to generate documentation.
Each <api/> element in this file will look for a <member/> element in the comments
file for documentation.
This represents the minimum content required in the comments file to generate Javascript
Documentation using Sandcastle/SHFB/AjaxDocPlugin.
While salient.docGen will extract and SHFB and Sandcastle will recognize and render
the full compliment of xml doc comments (http://msdn.microsoft.com/en-us/library/b2s063f7.aspx),
the Visual Studio JavaScript Intellisense formatter only recognizes summary, param, field,
value and returns. It is recommended to utilize these tags to convey relevant information
to the programmer and defer use of the other tags for supplemental information.
Informative documentation regarding the format and implementation of the comments and reflection
file schemas can be found at (insert the documents i was unable to find here. lolz)
NOTE: version 1 of salient.docGen does not traverse inheritance. All type members are explicitely
documented on the type. Typically non-overridden inherited members are referenced in the elements
node of the declaration.
-->
<reflection>
<apis>
<!--
NAMESPACE REFLECTION
-->
<api id="N:{namespace}">
<apidata name="{namespace}" group="namespace"/>
<elements>
<element api="T:{namespace}.{type}"/>
<element api="T:{namespace}.{method}{signature}"/>
<element api="T:{namespace}.{field}"/>
<!--
to hang static members directly off the namespace object declare the member as a type (T:) and
set both container element to point to N:{namespace}. See hack notes at the end of this document
for gory details.
-->
<element api="T:{method}{signature}"/>
<element api="T:{field}"/>
</elements>
</api>
<!--
TYPE REFLECTION
Static and instance types are declared similarly with the exception of the typedata.static attribute.
From a documentation generation perspective this flag has no effect. For clarity perhaps it should be
set if the class is static.
On the other hand, the static flag on methods and fields DO render a static 's' in the docs.
-->
<api id="T:{namespace}.{type}">
<apidata name="{type}" group="type" subgroup="class"/>
<!-- note static attribute. -->
<typedata visibility="public" static="false"/>
<family>
<ancestors>
<!--
Optional. Ancestors are listed in ascending order.
i.e. closest base class first.
-->
<type api="T:{namespace}.{type}" ref="true"/>
<type api="T:{type}" ref="true"/>
</ancestors>
</family>
<elements>
<!-- type members -->
<element api="M:{namespace}.{type}.#ctor" />
<element api="M:{namespace}.{type}.{method}{signature}"/>
<element api="F:{namespace}.{type}.{field}"/>
</elements>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
</containers>
</api>
<!--
METHOD REFLECTION
Static and instance methods are declared similarly with the exception of the memberdata.static
attribute.
If the method accepts params the param types should be included in the signature. e.g.
<member name="M:mynamespace.myclass.mymethod(String,Boolean)">
The javascript syntaxGenerator and Visual Studio JavaScript Intellisense formatter do not
provide for optional params that are so prevelant in js code. Specify in the param description
that a param is optional and in the summary what behavior to expect.
This applies constructor methods as well.
The method names of the constructor(s) is an ummutable #ctor and .ctor. The method belongs to
the constructor subgroup and is marked special.
Method signature and params follow the same pattern as normal method declaraions.
Of course multiple constructors are possible and would be very nice in the documentation. What
is needed is a convention for documenting it.
TODO: add special case for method comment blocks and extract multiple blocks if they are seperated
by the constant /* OVERLOADS */
-->
<api id="M:{namespace}.{type}.{method}{signature}">
<apidata name="{method}" group="member" subgroup="method"/>
<!-- note static attribute.
All methods on a static class should be marked static.
-->
<memberdata visibility="public" static="{static}"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="{param}">
<type api="T:{type}" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="T:{namespace}.{type}" ref="true"/>
</containers>
</api>
<!--
CONSTRUCTOR METHOD REFLECTION
-->
<api id="M:{namespace}.{type}.#ctor">
<apidata name=".ctor" group="member" subgroup="constructor" />
<memberdata visibility="public" special="true"/>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="T:{namespace}.{type}" ref="true"/>
</containers>
</api>
<!--
FIELD REFLECTION
Static and instance fields are declared similarly with the exception of th fielddata.static attribute.
-->
<api id="F:{namespace}.{type}.{field}">
<apidata name="{field}" group="member" subgroup="field"/>
<!-- note 'static' attribute -->
<memberdata visibility="public" static="{static}"/>
<fielddata literal="false"/>
<returns>
<type api="T:{type}" ref="true"/>
</returns>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="T:{namespace}.{type}" ref="true"/>
</containers>
</api>
<!--
CONSTANT FIELD REFLECTION
A constant field is a static literal field with a return value type.
-->
<api id="F:{namespace}.{type}.{field}">
<apidata name="{field}" group="member" subgroup="field"/>
<!-- note 'static' attribute -->
<memberdata visibility="public" static="true"/>
<!-- note 'literal' attribute -->
<fielddata literal="true" />
<returns>
<type api="T:{type}" ref="false"/>
</returns>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="T:{namespace}.{type}" ref="false"/>
</containers>
</api>
<!--
ENUM REFLECTION
-->
<api id="T:{namespace}.{type}">
<apidata name="{type}" group="type" subgroup="enumeration"/>
<typedata visibility="public"/>
<elements>
<element api="F:{namespace}.{type}.{field}"/>
<!-- repeat -->
</elements>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
</containers>
</api>
<!--
ENUM FIELD REFLECTION
An enum field is simply a static literal (constant) field.
<returns/> element is not required for enum fields.
-->
<api id="F:{namespace}.{type}.{field}">
<apidata name="{field}" group="member" subgroup="field"/>
<!-- note 'static' attribute -->
<memberdata visibility="public" static="true"/>
<!-- note 'literal' attribute -->
<fielddata literal="true" />
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="T:{namespace}.{type}" ref="false"/>
</containers>
</api>
<!--
STATIC NAMESPACE STATIC METHOD AND FIELD HACK
JavaScript 'namespaces' are objects and as such can and do contain static methods and fields.
These can be documented in a limited fashion by declaring the method or field as a type (T:).
This will result in the method or field being listed as a direct child of the namespace in the TOC.
The limitation of this hack is that in the namespace content page there is not a section for methods
and fields, only classes, enums, interfaces etc. So the only place the method or field is discoverable
is in the TOC, Index and search. In that they are immediate children of the namespace this seems to
be an acceptable concession.
Also be aware that VS intellisense formatter does not parse comments for object literals.
An alternative is to create a static type of the same name as the namespace. This will give full discovery.
Short version of preceding text: declare static methods and fields as types (T:) and omit the typename in
the name attribute effectively hanging them directly off the namespace.
-->
<api id="T:{namespace}.{method}{signature}">
<apidata name="{method}" group="member" subgroup="method"/>
<memberdata visibility="public" static="true"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="{param}">
<type api="T:{type}" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="N:{namespace}" ref="true"/>
</containers>
</api>
<!--
STATIC NAMESPACE FIELD HACK REFLECTION
-->
<api id="T:{namespace}.{field}">
<apidata name="{field}" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="false" />
<returns>
<type api="T:{type}" ref="true"/>
</returns>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="N:{namespace}" ref="true"/>
</containers>
</api>
<!--
STATIC NAMESPACE CONSTANT HACK REFLECTION
-->
<api id="T:{namespace}.{field}">
<apidata name="{field}" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<returns>
<type api="T:{type}" ref="false"/>
</returns>
<containers>
<library assembly="{file}" module="{project}"/>
<namespace api="N:{namespace}"/>
<type api="N:{namespace}" ref="false"/>
</containers>
</api>
</apis>
</reflection>
Samples:
comments.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
//
// salientJS JavaScript Library v1.0
// http://skysanders.net/code/salientJs/
//
// Copyright (c) 2009 Sky Sanders - sky@skysanders.net
// Dual licensed under the MIT and GPL licenses.
// http://skysanders.net/code/salientJs/license.txt
//
-->
<doc>
<members>
<member name="R:Project">
<summary>docGen example documentation</summary>
</member>
<member name="N:docGen">
<summary>docGen is a Sandcastle helper for POJO code.</summary>
</member>
<member name="T:docGen.class01">
<summary>class01 Summary</summary>
</member>
<member name="M:docGen.class01.#ctor">
<summary>.ctor summary</summary>
</member>
<member name="M:docGen.class01.method01(String)">
<summary>method01 summary</summary>
<param name="arg">arg description</param>
<returns>returns a string</returns>
<exception cref="T:Error">Throws a javascript Error if you have been bad</exception>
</member>
<member name="F:docGen.class01.field01">
<summary>field01 summary</summary>
</member>
<member name="M:docGen.class01.staticMethod01(String)">
<summary>staticMethod01 summary</summary>
<param name="arg">arg description</param>
<returns>returns a string</returns>
<exception cref="T:Error">Throws a javascript Error if you have been bad</exception>
</member>
<member name="F:docGen.class01.staticField01">
<summary>field01 summary</summary>
</member>
<member name="F:docGen.class01.constantField">
<summary>constantField summary</summary>
</member>
<member name="T:docGen.subClass01">
<summary>subClass01 Summary</summary>
</member>
<member name="M:docGen.subClass01.#ctor">
<summary>.ctor summary</summary>
</member>
<member name="M:docGen.subClass01.method01(String)">
<summary>method01 summary</summary>
<param name="arg">arg description</param>
<returns>returns a string</returns>
<exception cref="T:Error">Throws a javascript Error if you have been bad</exception>
</member>
<member name="F:docGen.subClass01.field01">
<summary>field01 summary</summary>
</member>
<member name="M:docGen.subClass01.staticMethod01(String)">
<summary>staticMethod01 summary</summary>
<param name="arg">arg description</param>
<returns>returns a string</returns>
<exception cref="T:Error">Throws a javascript Error if you have been bad</exception>
</member>
<member name="F:docGen.subClass01.staticField01">
<summary>field01 summary</summary>
</member>
<member name="F:docGen.subClass01.constantField">
<summary>constantField summary</summary>
</member>
<member name="T:docGen.staticClass01">
<summary>staticClass01 summary</summary>
</member>
<member name="M:docGen.staticClass01.method01(String)">
<summary>method01 summary</summary>
<param name="arg">arg description</param>
<returns>returns a string</returns>
<exception cref="T:Error">Throws a javascript Error if you have been bad</exception>
</member>
<member name="F:docGen.staticClass01.field01">
<summary>field01 summary</summary>
</member>
<member name="F:docGen.staticClass01.constantField">
<summary>constantField summary</summary>
</member>
<member name="T:docGen.enumClass01">
<summary>An enum as easy as 1,2,3</summary>
</member>
<member name="F:docGen.enumClass01.field01">
<summary>the number 1</summary>
</member>
<member name="F:docGen.enumClass01.field02">
<summary>the number 2</summary>
</member>
<member name="F:docGen.enumClass01.field03">
<summary>the number 3</summary>
</member>
<member name="T:docGen.staticNamespaceMethod(String)">
<summary>staticNamespaceMethod summary</summary>
<param name="arg">arg description</param>
</member>
<member name="T:docGen.staticNamespaceField">
<summary>staticNamespaceField summary</summary>
</member>
<member name="T:docGen.namespaceConstantField">
<summary>namespaceConstantField summary</summary>
</member>
</members>
</doc>
reflection.org
<?xml version="1.0" encoding="utf-8"?>
<!--
//
// salientJS JavaScript Library v1.0
// http://skysanders.net/code/salientJs/
//
// Copyright (c) 2009 Sky Sanders - sky@skysanders.net
// Dual licensed under the MIT and GPL licenses.
// http://skysanders.net/code/salientJs/license.txt
//
-->
<reflection>
<apis>
<api id="N:docGen">
<apidata name="docGen" group="namespace"/>
<elements>
<element api="T:docGen.class01"/>
<element api="T:docGen.subClass01"/>
<element api="T:docGen.staticClass01"/>
<element api="T:docGen.enumClass01"/>
<element api="T:docGen.staticNamespaceMethod(String)"/>
<element api="T:docGen.staticNamespaceField"/>
<element api="T:docGen.namespaceConstantField"/>
</elements>
</api>
<api id="T:docGen.class01">
<apidata name="class01" group="type" subgroup="class"/>
<typedata visibility="public" static="false"/>
<family>
<ancestors>
<type api="T:Object" ref="true"/>
</ancestors>
</family>
<elements>
<element api="M:docGen.class01.#ctor" />
<element api="M:docGen.class01.method01(String)"/>
<element api="F:docGen.class01.field01"/>
<element api="M:docGen.class01.staticMethod01(String)"/>
<element api="F:docGen.class01.staticField01"/>
<element api="F:docGen.class01.constantField"/>
</elements>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
</containers>
</api>
<api id="M:docGen.class01.#ctor">
<apidata name=".ctor" group="member" subgroup="constructor" />
<memberdata visibility="public" special="true"/>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="true"/>
</containers>
</api>
<api id="M:docGen.class01.method01(String)">
<apidata name="method01" group="member" subgroup="method"/>
<memberdata visibility="public"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="true"/>
</containers>
</api>
<api id="F:docGen.class01.field01">
<apidata name="field01" group="member" subgroup="field"/>
<memberdata visibility="public"/>
<fielddata literal="false"/>
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="true"/>
</containers>
</api>
<api id="M:docGen.class01.staticMethod01(String)">
<apidata name="staticMethod01" group="member" subgroup="method"/>
<memberdata visibility="public" static="true"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="true"/>
</containers>
</api>
<api id="F:docGen.class01.staticField01">
<apidata name="staticField01" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="false"/>
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="true"/>
</containers>
</api>
<api id="F:docGen.class01.constantField">
<apidata name="constantField" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<returns>
<type api="T:String" ref="false"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.class01" ref="false"/>
</containers>
</api>
<api id="T:docGen.subClass01">
<apidata name="subClass01" group="type" subgroup="class"/>
<typedata visibility="public" static="false"/>
<family>
<ancestors>
<type api="T:docGen.class01" ref="true"/>
<type api="T:Object" ref="true"/>
</ancestors>
</family>
<elements>
<element api="M:docGen.subClass01.#ctor" />
<element api="M:docGen.subClass01.method01(String)"/>
<element api="F:docGen.subClass01.field01"/>
<element api="M:docGen.subClass01.staticMethod01(String)"/>
<element api="F:docGen.subClass01.staticField01"/>
<element api="F:docGen.subClass01.constantField"/>
</elements>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
</containers>
</api>
<api id="M:docGen.subClass01.#ctor">
<apidata name=".ctor" group="member" subgroup="constructor" />
<memberdata visibility="public" special="true"/>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="true"/>
</containers>
</api>
<api id="M:docGen.subClass01.method01(String)">
<apidata name="method01" group="member" subgroup="method"/>
<memberdata visibility="public"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="true"/>
</containers>
</api>
<api id="F:docGen.subClass01.field01">
<apidata name="field01" group="member" subgroup="field"/>
<memberdata visibility="public"/>
<fielddata literal="false"/>
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="true"/>
</containers>
</api>
<api id="M:docGen.subClass01.staticMethod01(String)">
<apidata name="staticMethod01" group="member" subgroup="method"/>
<memberdata visibility="public" static="true"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="true"/>
</containers>
</api>
<api id="F:docGen.subClass01.staticField01">
<apidata name="staticField01" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="false"/>
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="true"/>
</containers>
</api>
<api id="F:docGen.subClass01.constantField">
<apidata name="constantField" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<returns>
<type api="T:String" ref="false"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.subClass01" ref="false"/>
</containers>
</api>
<api id="T:docGen.staticClass01">
<apidata name="staticClass01" group="type" subgroup="class"/>
<typedata visibility="public"/>
<family>
<ancestors>
<type api="T:Object" ref="true"/>
</ancestors>
</family>
<elements>
<element api="M:docGen.staticClass01.method01(String)"/>
<element api="F:docGen.staticClass01.field01"/>
<element api="F:docGen.staticClass01.constantField"/>
</elements>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
</containers>
</api>
<api id="M:docGen.staticClass01.method01(String)">
<apidata name="method01" group="member" subgroup="method"/>
<memberdata visibility="public" static="true"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.staticClass01" ref="true"/>
</containers>
</api>
<api id="F:docGen.staticClass01.field01">
<apidata name="field01" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="false"/>
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.staticClass01" ref="true"/>
</containers>
</api>
<api id="F:docGen.staticClass01.constantField">
<apidata name="constantField" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<returns>
<type api="T:String" ref="false"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.staticClass01" ref="false"/>
</containers>
</api>
<api id="T:docGen.enumClass01">
<apidata name="enumClass01" group="type" subgroup="enumeration"/>
<typedata visibility="public"/>
<family>
<ancestors>
<type api="T:Object" ref="true"/>
</ancestors>
</family>
<elements>
<element api="F:docGen.enumClass01.field01"/>
<element api="F:docGen.enumClass01.field02"/>
<element api="F:docGen.enumClass01.field03"/>
</elements>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
</containers>
</api>
<api id="F:docGen.enumClass01.field01">
<apidata name="field01" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.enumClass01" ref="false"/>
</containers>
</api>
<api id="F:docGen.enumClass01.field02">
<apidata name="field02" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.enumClass01" ref="false"/>
</containers>
</api>
<api id="F:docGen.enumClass01.field03">
<apidata name="field03" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="T:docGen.enumClass01" ref="false"/>
</containers>
</api>
<api id="T:docGen.staticNamespaceMethod(String)">
<apidata name="staticNamespaceMethod" group="member" subgroup="method"/>
<memberdata visibility="public" static="true"/>
<proceduredata virtual="false"/>
<parameters>
<parameter name="arg">
<type api="T:String" ref="true"/>
</parameter>
</parameters>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="N:docGen" ref="true"/>
</containers>
</api>
<api id="T:docGen.staticNamespaceField">
<apidata name="staticNamespaceField" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="false" />
<returns>
<type api="T:String" ref="true"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="N:docGen" ref="true"/>
</containers>
</api>
<api id="T:docGen.namespaceConstantField">
<apidata name="namespaceConstantField" group="member" subgroup="field"/>
<memberdata visibility="public" static="true"/>
<fielddata literal="true" />
<returns>
<type api="T:String" ref="false"/>
</returns>
<containers>
<library assembly="source.js" module="docGen"/>
<namespace api="N:docGen"/>
<type api="N:docGen" ref="false"/>
</containers>
</api>
</apis>
</reflection>