From 3467c455c0a90a9f507e92b72cb7dd1a9aaf85e8 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Mon, 17 Sep 2018 17:35:00 +0200 Subject: [PATCH] fixes #1616; fixes 'nim doc' regressions --- compiler/docgen.nim | 54 ++++++++++++++++++++++++++++++++----------- compiler/semexprs.nim | 11 +++++---- compiler/transf.nim | 3 ++- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/compiler/docgen.nim b/compiler/docgen.nim index ca3b1ac2d0..e7920ad066 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -19,6 +19,9 @@ import typesrenderer, astalgo, modulepaths, lineinfos, sequtils, intsets, pathutils +const + exportSection = skTemp + type TSections = array[TSymKind, Rope] TDocumentor = object of rstgen.RstGenerator @@ -254,6 +257,15 @@ proc belongsToPackage(conf: ConfigRef; module: PSym): bool = result = module.kind == skModule and module.owner != nil and module.owner.id == conf.mainPackageId +proc externalDep(d: PDoc; module: PSym): string = + if optWholeProject in d.conf.globalOptions: + let full = AbsoluteFile toFullPath(d.conf, FileIndex module.position) + let tmp = getOutFile2(d.conf, full.relativeTo(d.conf.projectPath), HtmlExt, + RelativeDir"htmldocs", sfMainModule notin module.flags) + result = relativeTo(tmp, d.thisDir, '/').string + else: + result = extractFilename toFullPath(d.conf, FileIndex module.position) + proc nodeToHighlightedHtml(d: PDoc; n: PNode; result: var Rope; renderFlags: TRenderFlags = {}) = var r: TSrcGen var literal = "" @@ -290,12 +302,7 @@ proc nodeToHighlightedHtml(d: PDoc; n: PNode; result: var Rope; renderFlags: TRe if s != nil and s.kind == skType and sfExported in s.flags and s.owner != nil and belongsToPackage(d.conf, s.owner) and d.target == outHtml: - - let full = AbsoluteFile toFullPath(d.conf, FileIndex s.owner.position) - let tmp = getOutFile2(d.conf, full.relativeTo(d.conf.projectPath), - HtmlExt, RelativeDir"htmldocs", sfMainModule notin s.owner.flags) - - let external = tmp.relativeTo(d.thisDir, '/') + let external = externalDep(d, s.owner) result.addf "$3", [rope changeFileExt(external, "html").string, rope literal, rope(esc(d.target, literal))] @@ -688,16 +695,33 @@ proc traceDeps(d: PDoc, it: PNode) = a.sons[2] = x traceDeps(d, a) elif it.kind == nkSym and belongsToPackage(d.conf, it.sym): - let full = AbsoluteFile toFullPath(d.conf, FileIndex it.sym.position) - let tmp = getOutFile2(d.conf, full.relativeTo(d.conf.projectPath), HtmlExt, - RelativeDir"htmldocs", sfMainModule notin it.sym.flags) - let external = relativeTo(tmp, d.thisDir, '/').string + let external = externalDep(d, it.sym) if d.section[k] != nil: add(d.section[k], ", ") dispA(d.conf, d.section[k], "$1", "$1", [rope esc(d.target, changeFileExt(external, "")), rope changeFileExt(external, "html")]) +proc exportSym(d: PDoc; s: PSym) = + const k = exportSection + if s.kind == skModule and belongsToPackage(d.conf, s): + let external = externalDep(d, s) + if d.section[k] != nil: add(d.section[k], ", ") + dispA(d.conf, d.section[k], + "$1", + "$1", [rope esc(d.target, changeFileExt(external, "")), + rope changeFileExt(external, "html")]) + elif s.owner != nil: + let module = originatingModule(s) + if belongsToPackage(d.conf, module): + let external = externalDep(d, module) + if d.section[k] != nil: add(d.section[k], ", ") + # XXX proper anchor generation here + dispA(d.conf, d.section[k], + "$1", + "$1", [rope esc(d.target, s.name.s), + rope changeFileExt(external, "html")]) + proc generateDoc*(d: PDoc, n, orig: PNode) = if orig.info.fileIndex != n.info.fileIndex: return case n.kind @@ -732,7 +756,11 @@ proc generateDoc*(d: PDoc, n, orig: PNode) = if not checkForFalse(n.sons[0].sons[0]): generateDoc(d, lastSon(n.sons[0]), orig) of nkImportStmt: - for i in 0 .. sonsLen(n)-1: traceDeps(d, n.sons[i]) + for it in n: traceDeps(d, it) + of nkExportStmt: + for it in n: + if it.kind == nkSym: exportSym(d, it.sym) + of nkExportExceptStmt: discard "transformed into nkExportStmt by semExportExcept" of nkFromStmt, nkImportExceptStmt: traceDeps(d, n.sons[0]) of nkCallKinds: var comm: Rope = nil @@ -828,8 +856,8 @@ proc generateTags*(d: PDoc, n: PNode, r: var Rope) = else: discard proc genSection(d: PDoc, kind: TSymKind) = - const sectionNames: array[skModule..skTemplate, string] = [ - "Imports", "Types", "Vars", "Lets", "Consts", "Vars", "Procs", "Funcs", + const sectionNames: array[skTemp..skTemplate, string] = [ + "Exports", "Imports", "Types", "Vars", "Lets", "Consts", "Vars", "Procs", "Funcs", "Methods", "Iterators", "Converters", "Macros", "Templates" ] if d.section[kind] == nil: return diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 43f04fc9fe..61c530f611 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2267,6 +2267,7 @@ proc semExportExcept(c: PContext, n: PNode): PNode = return n let exceptSet = readExceptSet(c, n) let exported = moduleName.sym + result = newNodeI(nkExportStmt, n.info) strTableAdd(c.module.tab, exported) var i: TTabIter var s = initTabIter(i, exported.tab) @@ -2274,11 +2275,12 @@ proc semExportExcept(c: PContext, n: PNode): PNode = if s.kind in ExportableSymKinds+{skModule} and s.name.id notin exceptSet: strTableAdd(c.module.tab, s) + result.add newSymNode(s, n.info) s = nextIter(i, exported.tab) - result = n proc semExport(c: PContext, n: PNode): PNode = - var x = newNodeI(n.kind, n.info) + result = newNodeI(nkExportStmt, n.info) + for i in 0..