Fixes #9364 and add moduleDescription to jsondoc (#9396)

This fixes `jsondoc0` so that it has comments in the output as described
by the documentation. It also fixes `jsondoc`/`jsondoc2` as it stored
it's output in a file with an html extension. Along with this it also
adds a new field `moduleDescription` to `jsondoc`/`jsondoc2` which
contains the module description.
This commit is contained in:
PMunch 2018-10-17 00:34:47 +02:00 • committed by Andreas Rumpf
commit db95fad6fa
4 changed files with 28 additions and 12 deletions

View file

@ -35,6 +35,9 @@
### Tool changes ### Tool changes
- `jsondoc` now include a `moduleDescription` field with the module
description. `jsondoc0` shows comments as it's own objects as shown in the
documentation.
### Compiler changes ### Compiler changes

View file

@ -787,13 +787,13 @@ proc generateDoc*(d: PDoc, n, orig: PNode) =
proc add(d: PDoc; j: JsonNode) = proc add(d: PDoc; j: JsonNode) =
if j != nil: d.jArray.add j if j != nil: d.jArray.add j
proc generateJson*(d: PDoc, n: PNode) = proc generateJson*(d: PDoc, n: PNode, includeComments: bool = true) =
case n.kind case n.kind
of nkCommentStmt: of nkCommentStmt:
if startsWith(n.comment, "##"): if includeComments:
let stripped = n.comment.substr(2).strip d.add %*{"comment": genComment(d, n)}
d.add %{ "comment": %stripped, "line": %n.info.line.int, else:
"col": %n.info.col } add(d.modDesc, genComment(d, n))
of nkProcDef: of nkProcDef:
when useEffectSystem: documentRaises(d.cache, n) when useEffectSystem: documentRaises(d.cache, n)
d.add genJsonItem(d, n, n.sons[namePos], skProc) d.add genJsonItem(d, n, n.sons[namePos], skProc)
@ -821,11 +821,11 @@ proc generateJson*(d: PDoc, n: PNode) =
succ(skType, ord(n.kind)-ord(nkTypeSection))) succ(skType, ord(n.kind)-ord(nkTypeSection)))
of nkStmtList: of nkStmtList:
for i in countup(0, sonsLen(n) - 1): for i in countup(0, sonsLen(n) - 1):
generateJson(d, n.sons[i]) generateJson(d, n.sons[i], includeComments)
of nkWhenStmt: of nkWhenStmt:
# generate documentation for the first branch only: # generate documentation for the first branch only:
if not checkForFalse(n.sons[0].sons[0]): if not checkForFalse(n.sons[0].sons[0]):
generateJson(d, lastSon(n.sons[0])) generateJson(d, lastSon(n.sons[0]), includeComments)
else: discard else: discard
proc genTagsItem(d: PDoc, n, nameNode: PNode, k: TSymKind): string = proc genTagsItem(d: PDoc, n, nameNode: PNode, k: TSymKind): string =
@ -951,8 +951,12 @@ proc writeOutput*(d: PDoc, useWarning = false) =
outfile.string) outfile.string)
proc writeOutputJson*(d: PDoc, useWarning = false) = proc writeOutputJson*(d: PDoc, useWarning = false) =
var modDesc: string
for desc in d.modDesc:
modDesc &= desc
let content = %*{"orig": d.filename, let content = %*{"orig": d.filename,
"nimble": getPackageName(d.conf, d.filename), "nimble": getPackageName(d.conf, d.filename),
"moduleDescription": modDesc,
"entries": d.jArray} "entries": d.jArray}
if optStdout in d.conf.globalOptions: if optStdout in d.conf.globalOptions:
write(stdout, $content) write(stdout, $content)
@ -962,7 +966,9 @@ proc writeOutputJson*(d: PDoc, useWarning = false) =
write(f, $content) write(f, $content)
close(f) close(f)
else: else:
discard "fixme: error report" localError(d.conf, newLineInfo(d.conf, AbsoluteFile d.filename, -1, -1),
warnUser, "unable to open file \"" & d.destFile.string &
"\" for writing")
proc commandDoc*(cache: IdentCache, conf: ConfigRef) = proc commandDoc*(cache: IdentCache, conf: ConfigRef) =
var ast = parseFile(conf.projectMainIdx, cache, conf) var ast = parseFile(conf.projectMainIdx, cache, conf)

View file

@ -55,20 +55,26 @@ proc processNodeJson(c: PPassContext, n: PNode): PNode =
result = n result = n
var g = PGen(c) var g = PGen(c)
if shouldProcess(g): if shouldProcess(g):
generateJson(g.doc, n) generateJson(g.doc, n, false)
proc myOpen(graph: ModuleGraph; module: PSym): PPassContext = template myOpenImpl(ext: untyped) {.dirty.} =
var g: PGen var g: PGen
new(g) new(g)
g.module = module g.module = module
var d = newDocumentor(AbsoluteFile toFullPath(graph.config, FileIndex module.position), var d = newDocumentor(AbsoluteFile toFullPath(graph.config, FileIndex module.position),
graph.cache, graph.config) graph.cache, graph.config, ext)
d.hasToc = true d.hasToc = true
g.doc = d g.doc = d
result = g result = g
proc myOpen(graph: ModuleGraph; module: PSym): PPassContext =
myOpenImpl(HtmlExt)
proc myOpenJson(graph: ModuleGraph; module: PSym): PPassContext =
myOpenImpl(JsonExt)
const docgen2Pass* = makePass(open = myOpen, process = processNode, close = close) const docgen2Pass* = makePass(open = myOpen, process = processNode, close = close)
const docgen2JsonPass* = makePass(open = myOpen, process = processNodeJson, const docgen2JsonPass* = makePass(open = myOpenJson, process = processNodeJson,
close = closeJson) close = closeJson)
proc finishDoc2Pass*(project: string) = proc finishDoc2Pass*(project: string) =

View file

@ -117,6 +117,7 @@ Output::
{ {
"orig": "docgen_sample.nim", "orig": "docgen_sample.nim",
"nimble": "", "nimble": "",
"moduleDescription": "This module is a sample",
"entries": [ "entries": [
{ {
"name": "helloWorld", "name": "helloWorld",