From 74350447edb3f826b73a66c28b7f2736bf39e449 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 13 Jan 2020 13:05:38 -0800 Subject: [PATCH] fixes #13100 nim doc now treats `export localSymbol` correctly (#13123) [backport] * fix #13100 nim doc now treats `export localSymbol` correctly * use owner instead (cherry picked from commit 49d1822c8f1cfd418e978a5c9c58343369d9f956) --- compiler/docgen.nim | 40 ++++++++++++++++++++++++++-------------- compiler/docgen2.nim | 2 +- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 63ea9aac43..3a7b2d052a 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -26,6 +26,7 @@ type TSections = array[TSymKind, Rope] TDocumentor = object of rstgen.RstGenerator modDesc: Rope # module description + module: PSym modDeprecationMsg: Rope toc, section: TSections indexValFilename: string @@ -115,9 +116,10 @@ proc getOutFile2(conf: ConfigRef; filename: RelativeFile, else: result = getOutFile(conf, filename, ext) -proc newDocumentor*(filename: AbsoluteFile; cache: IdentCache; conf: ConfigRef, outExt: string = HtmlExt): PDoc = +proc newDocumentor*(filename: AbsoluteFile; cache: IdentCache; conf: ConfigRef, outExt: string = HtmlExt, module: PSym = nil): PDoc = declareClosures() new(result) + result.module = module result.conf = conf result.cache = cache initRstGenerator(result[], (if conf.cmd != cmdRst2tex: outHtml else: outLatex), @@ -631,8 +633,12 @@ proc genDeprecationMsg(d: PDoc, n: PNode): Rope = else: doAssert false -proc genItem(d: PDoc, n, nameNode: PNode, k: TSymKind) = - if not isVisible(d, nameNode): return +type DocFlags = enum + kDefault + kForceExport + +proc genItem(d: PDoc, n, nameNode: PNode, k: TSymKind, docFlags: DocFlags) = + if (docFlags != kForceExport) and not isVisible(d, nameNode): return let name = getName(d, nameNode) nameRope = name.rope @@ -848,7 +854,9 @@ proc documentRaises*(cache: IdentCache; n: PNode) = if p4 != nil: n.sons[pragmasPos].add p4 if p5 != nil: n.sons[pragmasPos].add p5 -proc generateDoc*(d: PDoc, n, orig: PNode) = +proc generateDoc*(d: PDoc, n, orig: PNode, docFlags: DocFlags = kDefault) = + template genItemAux(skind) = + genItem(d, n, n[namePos], skind, docFlags) case n.kind of nkPragma: let pragmaNode = findPragma(n, wDeprecated) @@ -856,27 +864,27 @@ proc generateDoc*(d: PDoc, n, orig: PNode) = of nkCommentStmt: add(d.modDesc, genComment(d, n)) of nkProcDef: when useEffectSystem: documentRaises(d.cache, n) - genItem(d, n, n.sons[namePos], skProc) + genItemAux(skProc) of nkFuncDef: when useEffectSystem: documentRaises(d.cache, n) - genItem(d, n, n.sons[namePos], skFunc) + genItemAux(skFunc) of nkMethodDef: when useEffectSystem: documentRaises(d.cache, n) - genItem(d, n, n.sons[namePos], skMethod) + genItemAux(skMethod) of nkIteratorDef: when useEffectSystem: documentRaises(d.cache, n) - genItem(d, n, n.sons[namePos], skIterator) - of nkMacroDef: genItem(d, n, n.sons[namePos], skMacro) - of nkTemplateDef: genItem(d, n, n.sons[namePos], skTemplate) + genItemAux(skIterator) + of nkMacroDef: genItemAux(skMacro) + of nkTemplateDef: genItemAux(skTemplate) of nkConverterDef: when useEffectSystem: documentRaises(d.cache, n) - genItem(d, n, n.sons[namePos], skConverter) + genItemAux(skConverter) of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: for i in 0 ..< len(n): if n.sons[i].kind != nkCommentStmt: # order is always 'type var let const': - genItem(d, n.sons[i], n.sons[i].sons[0], - succ(skType, ord(n.kind)-ord(nkTypeSection))) + genItem(d, n[i], n[i][0], + succ(skType, ord(n.kind)-ord(nkTypeSection)), docFlags) of nkStmtList: for i in 0 ..< len(n): generateDoc(d, n.sons[i], orig) of nkWhenStmt: @@ -887,7 +895,11 @@ proc generateDoc*(d: PDoc, n, orig: PNode) = for it in n: traceDeps(d, it) of nkExportStmt: for it in n: - if it.kind == nkSym: exportSym(d, it.sym) + if it.kind == nkSym: + if d.module != nil and d.module == it.sym.owner: + generateDoc(d, it.sym.ast, orig, kForceExport) + else: + exportSym(d, it.sym) of nkExportExceptStmt: discard "transformed into nkExportStmt by semExportExcept" of nkFromStmt, nkImportExceptStmt: traceDeps(d, n.sons[0]) of nkCallKinds: diff --git a/compiler/docgen2.nim b/compiler/docgen2.nim index e19b3a9893..aa4d9cbef4 100644 --- a/compiler/docgen2.nim +++ b/compiler/docgen2.nim @@ -62,7 +62,7 @@ template myOpenImpl(ext: untyped) {.dirty.} = g.module = module g.config = graph.config var d = newDocumentor(AbsoluteFile toFullPath(graph.config, FileIndex module.position), - graph.cache, graph.config, ext) + graph.cache, graph.config, ext, module) d.hasToc = true g.doc = d result = g