| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | //-----------------------------------------------------------------------------// Copyright (c) 2012 GarageGames, LLC//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS// IN THE SOFTWARE.//-----------------------------------------------------------------------------// This file exists solely to document consoleDoc.cpp/// @defgroup  script_autodoc Script Auto-Documentation/// @ingroup   console_system Console System////// @section script_autodoc_using        Using Script Auto-Documentation////// There are on the order of three hundred functions exposed to the script language/// through the console. It is therefore extremely important that they be documented,/// but due to their number, it is difficult to maintain a seperate reference document./// /// Therefore, a simple documentation system has been built into the scripting engine. It/// was initially added by Mark Frohnmayer, and later enhanced by Ben Garney. The/// scripting engine supports grouping functions and methods, to help organize the /// several hundred functions, as well as associating a "usage string" with functions and/// groups.////// @note The results of a console doc dump will vary depending on when you run it. If///       you run it, for example, while in the game menu, it won't output any data for///       the script-defined classes which are defined for gameplay. To get comprehensive///       documentation, you may need to write a special script that will get all your///       classes loaded into the scripting engine.////// The script documentation system is designed to output a dump of the current state/// of the scripting engine in a format understandable by Doxygen. It does this by /// traversing the namespace/class hierarchy in memory at the time of the dump, and/// outputting psuedo-C++ code equivalent to this class hierarchy./// /// @subsection script_autodoc_using_script For the Scripter...////// Currently, there is no way to associate usage strings or other documentation with script code/// like you can with C++ code.////// You can get a list of all the methods and fields of an object from any object which inherits/// from SimObject (ie, every object), as well as the documentation on those objects by using the/// dump() method from the console:////// @code/// ==>$foo = new SimObject();/// ==>$foo.dump();/// Member Fields:/// Tagged Fields:/// Methods:///   delete() - obj.delete()///   dump() - obj.dump()///   getClassName() - obj.getClassName()///   getGroup() - obj.getGroup()///   getId() - obj.getId()///   getName() - obj.getName()///   getType() - obj.getType()///   save() - obj.save(fileName, <selectedOnly>)///   schedule() - object.schedule(time, command, <arg1...argN>);///   setName() - obj.setName(newName)/// @endcode////// In the Torque example app, there are two functions defined in common\\client\\scriptDoc.tscript/// which automate the process of dumping the documentation. They make use of the ConsoleLogger/// object to output the documentation to a file, and look like this:////// @note You may want to add this code, or code like it, to your project if you have///       rewritten the script code in common. ////// @code/// // Writes out all script functions to a file/// function writeOutFunctions() {///    new ConsoleLogger( logger, "ConsoleFunctions.txt", false );///    dumpConsoleFunctions();///    logger.delete();/// }/// /// // Writes out all script classes to a file/// function writeOutClasses() {///    new ConsoleLogger( logger, "scriptClasses.txt", false );///    dumpConsoleClasses();///    logger.delete();/// }/// @endcode////// @subsection script_autodoc_using_coder  For the C++ Coder...////// @note <b>It is of the utmost important that you keep your usage strings up to date!</b>///       Usage strings are the only way that a scripter has to know how to use the methods,///       functions, and variables you expose. Misleading, missing, or out of date documentation///       will make their lives much harder - and yours, too, because you'll have to keep///       explaining things to them! So make everyone's lives easier - keep your usage strings///       clear, concise, and up to date.////// There are four types of items which can be documented using the autodocumentation system: ///   - <b>Fields</b>, which are defined using the addField() calls. They are documented///     by passing a string to the usage parameter.///   - <b>Field groups</b>, which are defined using the beginGroup() and endGroup() calls.///     They are documented by passing a descriptive string to the usage parameter.///   - <b>Method groups</b>, which are defined using beginCommandGroup(), endCommandGroup(),///     ConsoleMethodGroupEnd(), ConsoleMethodGroupBegin(), ConsoleFunctionGroupEnd(), and///     ConsoleFunctionGroupBegin().///   - <b>Methods and functions</b>, which are defined using either SimObject::addCommand(),///     the ConsoleMethod() macro, or the ConsoleFunction() macro. Methods and functions are///     special in that the usage strings should be in a specific format, so///     that parameter information can be extracted from them and placed into the Doxygen///     output. ////// You can use standard Doxygen commands in your comments, to make the documentation clearer./// Of particular use are \@returns, \@param, \@note, and \@deprecated.////// <b>Examples using global definitions.</b>////// @code///    // Example of using Doxygen commands.///    ConsoleFunction(alxGetWaveLen, S32, 2, 2, "(string filename)"///                    "Get length of a wave file\n\n"///                    "@param filename File to determine length of.\n"///                    "@returns Length in milliseconds.")//////    // A function group...///    ConsoleFunctionGroupBegin(Example, "This is an example group! Notice that the name for the group"///                                       "must be a valid identifier, due to limitations in the C preprocessor.");//////    // ConsoleFunction definitions go here.//////    ConsoleFunctionGroupEnd(Example);//////    // You can do similar things with methods...///    ConsoleMethodGroupBegin(SimSet, UsefulFuncs, "Here are some useful functions involving a SimSet.");///    ConsoleMethod(SimSet, listObjects, void, 2, 2, "set.listObjects();")///    ConsoleMethodGroupEnd(SimSet, UsefulFuncs, "Here are some more useful functions involving a SimSet.");/// @endcode////// <b>Examples using addField</b>////// @note Using addCommand is strongly deprecated.////// @code///   // Example of a field group.///   addGroup( "Logging", "Things relating to logging." );///   addField( "level",   TYPEID< ConsoleLogLevel >(),     Offset( mLevel,    ConsoleLogger ) );///   endGroup( "Logging" );/// @endcode////// @section script_autodoc_makingdocs   How to Generate Script Docs////// Script docs can be generated by running the dumpConsoleFunctions() and/// dumpConsoleClasses(), then running the output through Doxygen. There is an/// example Doxygen configuration file to do this at/// doc\\doxygen\\html\\script_doxygen.html.cfg. Doxygen will parse the psuedo-C++/// generated by the console doc code and produce a class hierarchy and documentation/// of the global namespace. You may need to tweak the paths in the configuration file/// slightly to reflect your individual setup.////// @section script_autodoc_internals Script Auto-Documentation Internals/// /// The consoleDoc system works by inserting "hidden" entries in Namespace and/// AbstractClassRep; these hidden entries are assigned special type IDs so that/// they aren't touched by the standard name resolution code. At documentation/// creation time, the dumpConsole functions iterate through the Namespace hierarchy/// and the AbstractClassRep data and extract this "hidden" information, outputting/// it in a Doxygen-compatible format.////// @note You can customize the output of the console documentation system by modifying///       these functions:///            - printClassHeader()///            - printClassMethod()///            - printGroupStart()///            - printClassMember()///            - printGroupEnd()///            - printClassFooter()////// @note There was once support for 'overloaded' script functions; ie, script functions///       with multiple usage strings. Certain functions in the audio library used this.///       However, it was deemed too complex, and removed from the scripting engine. There///       are still some latent traces of it, however.
 |