summary refs log tree commit diff stats
path: root/compiler/docgen2.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/docgen2.nim')
-rw-r--r--compiler/docgen2.nim80
1 files changed, 80 insertions, 0 deletions
diff --git a/compiler/docgen2.nim b/compiler/docgen2.nim
new file mode 100644
index 000000000..7fb11a3bd
--- /dev/null
+++ b/compiler/docgen2.nim
@@ -0,0 +1,80 @@
+#
+#
+#           The Nim Compiler
+#        (c) Copyright 2012 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# This module implements a new documentation generator that runs after
+# semantic checking.
+
+import
+  options, ast, msgs, docgen, lineinfos, pathutils, packages
+
+from modulegraphs import ModuleGraph, PPassContext
+
+type
+  TGen = object of PPassContext
+    doc: PDoc
+    module: PSym
+    config: ConfigRef
+  PGen = ref TGen
+
+proc shouldProcess(g: PGen): bool =
+  (optWholeProject in g.doc.conf.globalOptions and g.doc.conf.belongsToProjectPackage(g.module)) or
+      sfMainModule in g.module.flags or g.config.projectMainIdx == g.module.info.fileIndex
+
+template closeImpl(body: untyped) {.dirty.} =
+  var g = PGen(p)
+  let useWarning = sfMainModule notin g.module.flags
+  let groupedToc = true
+  if shouldProcess(g):
+    finishGenerateDoc(g.doc)
+    body
+    try:
+      generateIndex(g.doc)
+    except IOError:
+      discard
+
+proc closeDoc*(graph: ModuleGraph; p: PPassContext, n: PNode): PNode =
+  result = nil
+  closeImpl:
+    writeOutput(g.doc, useWarning, groupedToc)
+
+proc closeJson*(graph: ModuleGraph; p: PPassContext, n: PNode): PNode =
+  result = nil
+  closeImpl:
+    writeOutputJson(g.doc, useWarning)
+
+proc processNode*(c: PPassContext, n: PNode): PNode =
+  result = n
+  var g = PGen(c)
+  if shouldProcess(g):
+    generateDoc(g.doc, n, n, g.config)
+
+proc processNodeJson*(c: PPassContext, n: PNode): PNode =
+  result = n
+  var g = PGen(c)
+  if shouldProcess(g):
+    generateJson(g.doc, n, g.config, false)
+
+template myOpenImpl(ext: untyped) {.dirty.} =
+  var g: PGen
+  new(g)
+  g.module = module
+  g.config = graph.config
+  var d = newDocumentor(AbsoluteFile toFullPath(graph.config, FileIndex module.position),
+      graph.cache, graph.config, ext, module, hasToc = true)
+  g.doc = d
+  result = g
+
+proc openHtml*(graph: ModuleGraph; module: PSym; idgen: IdGenerator): PPassContext =
+  myOpenImpl(HtmlExt)
+
+proc openTex*(graph: ModuleGraph; module: PSym; idgen: IdGenerator): PPassContext =
+  myOpenImpl(TexExt)
+
+proc openJson*(graph: ModuleGraph; module: PSym; idgen: IdGenerator): PPassContext =
+  myOpenImpl(JsonExt)
class='alt'>