Merge pull request #742 from onionhammer/master
Added jsondoc compiler switch
This commit is contained in:
commit
eae275c114
3 changed files with 211 additions and 132 deletions
|
|
@ -14,7 +14,7 @@
|
||||||
import
|
import
|
||||||
ast, strutils, strtabs, options, msgs, os, ropes, idents,
|
ast, strutils, strtabs, options, msgs, os, ropes, idents,
|
||||||
wordrecg, syntaxes, renderer, lexer, rstast, rst, rstgen, times, highlite,
|
wordrecg, syntaxes, renderer, lexer, rstast, rst, rstgen, times, highlite,
|
||||||
importer, sempass2
|
importer, sempass2, json
|
||||||
|
|
||||||
type
|
type
|
||||||
TSections = array[TSymKind, PRope]
|
TSections = array[TSymKind, PRope]
|
||||||
|
|
@ -255,6 +255,22 @@ proc genItem(d: PDoc, n, nameNode: PNode, k: TSymKind) =
|
||||||
toRope(getName(d, nameNode, d.splitAfter)), result, comm, toRope(d.id)]))
|
toRope(getName(d, nameNode, d.splitAfter)), result, comm, toRope(d.id)]))
|
||||||
setIndexTerm(d[], $d.id, getName(d, nameNode))
|
setIndexTerm(d[], $d.id, getName(d, nameNode))
|
||||||
|
|
||||||
|
proc genJSONItem(d: PDoc, n, nameNode: PNode, k: TSymKind): PJsonNode =
|
||||||
|
if not isVisible(nameNode): return
|
||||||
|
var
|
||||||
|
name = getName(d, nameNode)
|
||||||
|
comm = genRecComment(d, n).ropeToStr()
|
||||||
|
r: TSrcGen
|
||||||
|
|
||||||
|
initTokRender(r, n, {renderNoBody, renderNoComments, renderDocComments})
|
||||||
|
|
||||||
|
result = %{ "name": %name, "type": %($k) }
|
||||||
|
|
||||||
|
if comm != nil and comm != "":
|
||||||
|
result["description"] = %comm
|
||||||
|
if r.buf != nil:
|
||||||
|
result["code"] = %r.buf
|
||||||
|
|
||||||
proc checkForFalse(n: PNode): bool =
|
proc checkForFalse(n: PNode): bool =
|
||||||
result = n.kind == nkIdent and IdentEq(n.ident, "false")
|
result = n.kind == nkIdent and IdentEq(n.ident, "false")
|
||||||
|
|
||||||
|
|
@ -299,6 +315,48 @@ proc generateDoc*(d: PDoc, n: PNode) =
|
||||||
of nkFromStmt, nkImportExceptStmt: traceDeps(d, n.sons[0])
|
of nkFromStmt, nkImportExceptStmt: traceDeps(d, n.sons[0])
|
||||||
else: nil
|
else: nil
|
||||||
|
|
||||||
|
proc generateJson(d: PDoc, n: PNode, jArray: PJsonNode = nil): PJsonNode =
|
||||||
|
case n.kind
|
||||||
|
of nkCommentStmt:
|
||||||
|
if n.comment != nil and startsWith(n.comment, "##"):
|
||||||
|
let stripped = n.comment.substr(2).strip
|
||||||
|
result = %{ "comment": %stripped }
|
||||||
|
of nkProcDef:
|
||||||
|
when useEffectSystem: documentRaises(n)
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skProc)
|
||||||
|
of nkMethodDef:
|
||||||
|
when useEffectSystem: documentRaises(n)
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skMethod)
|
||||||
|
of nkIteratorDef:
|
||||||
|
when useEffectSystem: documentRaises(n)
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skIterator)
|
||||||
|
of nkMacroDef:
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skMacro)
|
||||||
|
of nkTemplateDef:
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skTemplate)
|
||||||
|
of nkConverterDef:
|
||||||
|
when useEffectSystem: documentRaises(n)
|
||||||
|
result = genJSONItem(d, n, n.sons[namePos], skConverter)
|
||||||
|
of nkTypeSection, nkVarSection, nkLetSection, nkConstSection:
|
||||||
|
for i in countup(0, sonsLen(n) - 1):
|
||||||
|
if n.sons[i].kind != nkCommentStmt:
|
||||||
|
# order is always 'type var let const':
|
||||||
|
result = genJSONItem(d, n.sons[i], n.sons[i].sons[0],
|
||||||
|
succ(skType, ord(n.kind)-ord(nkTypeSection)))
|
||||||
|
of nkStmtList:
|
||||||
|
var elem = jArray
|
||||||
|
if elem == nil: elem = newJArray()
|
||||||
|
for i in countup(0, sonsLen(n) - 1):
|
||||||
|
var r = generateJson(d, n.sons[i], elem)
|
||||||
|
if r != nil:
|
||||||
|
elem.add(r)
|
||||||
|
if result == nil: result = elem
|
||||||
|
of nkWhenStmt:
|
||||||
|
# generate documentation for the first branch only:
|
||||||
|
if not checkForFalse(n.sons[0].sons[0]) and jArray != nil:
|
||||||
|
discard generateJson(d, lastSon(n.sons[0]), jArray)
|
||||||
|
else: nil
|
||||||
|
|
||||||
proc genSection(d: PDoc, kind: TSymKind) =
|
proc genSection(d: PDoc, kind: TSymKind) =
|
||||||
const sectionNames: array[skModule..skTemplate, string] = [
|
const sectionNames: array[skModule..skTemplate, string] = [
|
||||||
"Imports", "Types", "Vars", "Lets", "Consts", "Vars", "Procs", "Methods",
|
"Imports", "Types", "Vars", "Lets", "Consts", "Vars", "Procs", "Methods",
|
||||||
|
|
@ -388,6 +446,20 @@ proc CommandRst2TeX*() =
|
||||||
splitter = "\\-"
|
splitter = "\\-"
|
||||||
CommandRstAux(gProjectFull, TexExt)
|
CommandRstAux(gProjectFull, TexExt)
|
||||||
|
|
||||||
|
proc CommandJSON*() =
|
||||||
|
var ast = parseFile(gProjectMainIdx)
|
||||||
|
if ast == nil: return
|
||||||
|
var d = newDocumentor(gProjectFull, options.gConfigVars)
|
||||||
|
d.hasToc = true
|
||||||
|
var json = generateJson(d, ast)
|
||||||
|
var content = newRope(pretty(json))
|
||||||
|
|
||||||
|
if optStdout in gGlobalOptions:
|
||||||
|
writeRope(stdout, content)
|
||||||
|
else:
|
||||||
|
echo getOutFile(gProjectFull, JsonExt)
|
||||||
|
writeRope(content, getOutFile(gProjectFull, JsonExt), useWarning = false)
|
||||||
|
|
||||||
proc CommandBuildIndex*() =
|
proc CommandBuildIndex*() =
|
||||||
var content = mergeIndexes(gProjectFull).toRope
|
var content = mergeIndexes(gProjectFull).toRope
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -363,6 +363,12 @@ proc MainCommand* =
|
||||||
LoadConfigs(DocTexConfig)
|
LoadConfigs(DocTexConfig)
|
||||||
wantMainModule()
|
wantMainModule()
|
||||||
CommandRst2TeX()
|
CommandRst2TeX()
|
||||||
|
of "jsondoc":
|
||||||
|
gCmd = cmdDoc
|
||||||
|
LoadConfigs(DocConfig)
|
||||||
|
wantMainModule()
|
||||||
|
DefineSymbol("nimdoc")
|
||||||
|
CommandJSON()
|
||||||
of "buildindex":
|
of "buildindex":
|
||||||
gCmd = cmdDoc
|
gCmd = cmdDoc
|
||||||
LoadConfigs(DocConfig)
|
LoadConfigs(DocConfig)
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ const
|
||||||
NimExt* = "nim"
|
NimExt* = "nim"
|
||||||
RodExt* = "rod"
|
RodExt* = "rod"
|
||||||
HtmlExt* = "html"
|
HtmlExt* = "html"
|
||||||
|
JsonExt* = "json"
|
||||||
TexExt* = "tex"
|
TexExt* = "tex"
|
||||||
IniExt* = "ini"
|
IniExt* = "ini"
|
||||||
DefaultConfig* = "nimrod.cfg"
|
DefaultConfig* = "nimrod.cfg"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue