# limitations under the License.
# Documentation generator for the nit language.
+#
# Generate API documentation in HTML format from nit source code.
module nitdoc
import modelbuilder
import doc
-# process options
+redef class ToolContext
+ # Nitdoc generation phase.
+ var docphase: Phase = new Nitdoc(self, null)
+
+ # Do not generate documentation for attributes.
+ var opt_no_attributes = new OptionBool("Ignore the attributes", "--no-attributes")
+
+ # Do not generate documentation for private properties.
+ var opt_private = new OptionBool("Also generate private API", "--private")
+
+ redef init do
+ super
+ option_context.add_option(opt_no_attributes, opt_private)
+ end
+end
+
+# Nitdoc phase explores the model and generate pages for each mentities found
+private class Nitdoc
+ super Phase
+ redef fun process_mainmodule(mainmodule, mmodules)
+ do
+ var min_visibility = private_visibility
+ if not toolcontext.opt_private.value then min_visibility = protected_visibility
+ var accept_attribute = true
+ if toolcontext.opt_no_attributes.value then accept_attribute = false
+
+ var filters = new ModelFilter(
+ min_visibility,
+ accept_attribute = accept_attribute,
+ accept_fictive = false)
+ var doc = new DocModel(toolcontext.modelbuilder.model, mainmodule, filters)
+
+ var phases = [
+ new IndexingPhase(toolcontext, doc),
+ new MakePagePhase(toolcontext, doc),
+ new POSetPhase(toolcontext, doc),
+ new ConcernsPhase(toolcontext, doc),
+ new StructurePhase(toolcontext, doc),
+ new InheritanceListsPhase(toolcontext, doc),
+ new IntroRedefListPhase(toolcontext, doc),
+ new LinListPhase(toolcontext, doc),
+ new GraphPhase(toolcontext, doc),
+ new ReadmePhase(toolcontext, doc),
+ new RenderHTMLPhase(toolcontext, doc),
+ new DocTestPhase(toolcontext, doc): DocPhase]
+
+ for phase in phases do
+ toolcontext.info("# {phase.class_name}", 1)
+ phase.apply
+ end
+ end
+end
+
+# build toolcontext
var toolcontext = new ToolContext
-var ctx = new NitdocContext(toolcontext)
-ctx.process_options(args)
-var arguments = ctx.toolcontext.option_context.rest
+var tpl = new Template
+tpl.add "Usage: nitdoc [OPTION]... <file.nit>...\n"
+tpl.add "Generates HTML pages of API documentation from Nit source files."
+toolcontext.tooldescription = tpl.write_to_string
+
+# process options
+toolcontext.process_options(args)
+var arguments = toolcontext.option_context.rest
# build model
var model = new Model
-var mbuilder = new ModelBuilder(model, ctx.toolcontext)
-var mmodules = mbuilder.parse(arguments)
+var mbuilder = new ModelBuilder(model, toolcontext)
+var mmodules = mbuilder.parse_full(arguments)
+# process
if mmodules.is_empty then return
mbuilder.run_phases
-var mainmodule: MModule
-if mmodules.length == 1 then
- mainmodule = mmodules.first
-else
- mainmodule = new MModule(model, null, "<main>", new Location(null, 0, 0, 0, 0))
- mainmodule.is_fictive = true
- mainmodule.set_imported_mmodules(mmodules)
-end
-
-# generate doc
-var nitdoc = new Nitdoc(ctx, model, mainmodule)
-nitdoc.generate
-
+toolcontext.run_global_phases(mmodules)