diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-09-03 00:40:56 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-09-03 00:43:12 +0200 |
commit | 0d68ef9f1135e934e6b7af4d69fa6e4e5f61d15b (patch) | |
tree | 3eb30061fce6a57abecf011f334bbf472d6096b1 /compiler | |
parent | 06dbe9697ff6b688bfe75156357b57f24cf08184 (diff) | |
download | Nim-0d68ef9f1135e934e6b7af4d69fa6e4e5f61d15b.tar.gz |
runnableExample: put each example to its own file; fixes #7285
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/docgen.nim | 37 | ||||
-rw-r--r-- | compiler/docgen2.nim | 20 |
2 files changed, 27 insertions, 30 deletions
diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 968a955f6..c38b9b87c 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -31,7 +31,7 @@ type isPureRst: bool conf*: ConfigRef cache*: IdentCache - runnableExamples*: PNode + exampleCounter: int PDoc* = ref TDocumentor ## Alias to type less. @@ -285,29 +285,26 @@ proc nodeToHighlightedHtml(d: PDoc; n: PNode; result: var Rope; renderFlags: TRe dispA(d.conf, result, "<span class=\"Other\">$1</span>", "\\spanOther{$1}", [rope(esc(d.target, literal))]) -proc testExamples*(d: PDoc) = - if d.runnableExamples == nil or d.conf.errorCounter > 0: return +proc testExample(d: PDoc; ex: PNode) = + if d.conf.errorCounter > 0: return let outputDir = d.conf.getNimcacheDir / "runnableExamples" createDir(outputDir) - let inp = toFullPath(d.conf, d.runnableExamples.info) - let outp = outputDir / extractFilename(inp.changeFileExt"" & "_examples.nim") - let nimcache = outp.changeFileExt"" & "_nimcache" - renderModule(d.runnableExamples, inp, outp, conf = d.conf) + inc d.exampleCounter + let outp = outputDir / extractFilename(d.filename.changeFileExt"" & + "_examples" & $d.exampleCounter & ".nim") + #let nimcache = outp.changeFileExt"" & "_nimcache" + renderModule(ex, d.filename, outp, conf = d.conf) let backend = if isDefined(d.conf, "js"): "js" elif isDefined(d.conf, "cpp"): "cpp" elif isDefined(d.conf, "objc"): "objc" else: "c" if os.execShellCmd(os.getAppFilename() & " " & backend & - " --nimcache:" & nimcache & " -r " & outp) != 0: + " --nimcache:" & outputDir & " -r " & outp) != 0: quit "[Examples] failed: see " & outp else: # keep generated source file `outp` to allow inspection. rawMessage(d.conf, hintSuccess, ["runnableExamples: " & outp]) removeFile(outp.changeFileExt(ExeExt)) - try: - removeDir(nimcache) - except OSError: - discard proc extractImports(n: PNode; result: PNode) = if n.kind in {nkImportStmt, nkImportExceptStmt, nkFromStmt}: @@ -317,16 +314,15 @@ proc extractImports(n: PNode; result: PNode) = for i in 0..<n.safeLen: extractImports(n[i], result) proc prepareExamples(d: PDoc; n: PNode) = - let inp = toFullPath(d.conf, n.info) - if d.runnableExamples == nil: - d.runnableExamples = newTree(nkStmtList, - newTree(nkImportStmt, newStrNode(nkStrLit, expandFilename(inp)))) - d.runnableExamples.info = n.info + var runnableExamples = newTree(nkStmtList, + newTree(nkImportStmt, newStrNode(nkStrLit, d.filename))) + runnableExamples.info = n.info let imports = newTree(nkStmtList) var savedLastSon = copyTree n.lastSon extractImports(savedLastSon, imports) - for imp in imports: d.runnableExamples.add imp - d.runnableExamples.add newTree(nkBlockStmt, newNode(nkEmpty), copyTree savedLastSon) + for imp in imports: runnableExamples.add imp + runnableExamples.add newTree(nkBlockStmt, newNode(nkEmpty), copyTree savedLastSon) + testExample(d, runnableExamples) proc isRunnableExample(n: PNode): bool = # Templates and generics don't perform symbol lookups. @@ -873,7 +869,6 @@ proc commandDoc*(cache: IdentCache, conf: ConfigRef) = generateDoc(d, ast) writeOutput(d, conf.projectFull, HtmlExt) generateIndex(d) - testExamples(d) proc commandRstAux(cache: IdentCache, conf: ConfigRef; filename, outExt: string) = var filen = addFileExt(filename, "txt") @@ -908,7 +903,6 @@ proc commandRstAux(cache: IdentCache, conf: ConfigRef; filename, outExt: string) d.modDesc = rope(modDesc) writeOutput(d, filename, outExt) generateIndex(d) - testExamples(d) proc commandRst2Html*(cache: IdentCache, conf: ConfigRef) = commandRstAux(cache, conf, conf.projectFull, HtmlExt) @@ -932,7 +926,6 @@ proc commandJson*(cache: IdentCache, conf: ConfigRef) = let filename = getOutFile(conf, conf.projectFull, JsonExt) if not writeRope(content, filename): rawMessage(conf, errCannotOpenFile, filename) - testExamples(d) proc commandTags*(cache: IdentCache, conf: ConfigRef) = var ast = parseFile(conf.projectMainIdx, cache, conf) diff --git a/compiler/docgen2.nim b/compiler/docgen2.nim index aa61dbd27..22fef0d47 100644 --- a/compiler/docgen2.nim +++ b/compiler/docgen2.nim @@ -21,42 +21,46 @@ type module: PSym PGen = ref TGen +template shouldProcess(g): bool = + (g.module.owner.id == g.doc.conf.mainPackageId and optWholeProject in g.doc.conf.globalOptions) or + sfMainModule in g.module.flags + template closeImpl(body: untyped) {.dirty.} = var g = PGen(p) let useWarning = sfMainModule notin g.module.flags #echo g.module.name.s, " ", g.module.owner.id, " ", gMainPackageId - if (g.module.owner.id == g.doc.conf.mainPackageId and optWholeProject in g.doc.conf.globalOptions) or - sfMainModule in g.module.flags: + if shouldProcess(g): body try: generateIndex(g.doc) - testExamples(g.doc) except IOError: discard proc close(graph: ModuleGraph; p: PPassContext, n: PNode): PNode = closeImpl: - writeOutput(g.doc, toFilename(graph.config, FileIndex g.module.position), HtmlExt, useWarning) + writeOutput(g.doc, toFullPath(graph.config, FileIndex g.module.position), HtmlExt, useWarning) proc closeJson(graph: ModuleGraph; p: PPassContext, n: PNode): PNode = closeImpl: - writeOutputJson(g.doc, toFilename(graph.config, FileIndex g.module.position), ".json", useWarning) + writeOutputJson(g.doc, toFullPath(graph.config, FileIndex g.module.position), ".json", useWarning) proc processNode(c: PPassContext, n: PNode): PNode = result = n var g = PGen(c) - generateDoc(g.doc, n) + if shouldProcess(g): + generateDoc(g.doc, n) proc processNodeJson(c: PPassContext, n: PNode): PNode = result = n var g = PGen(c) - generateJson(g.doc, n) + if shouldProcess(g): + generateJson(g.doc, n) proc myOpen(graph: ModuleGraph; module: PSym): PPassContext = var g: PGen new(g) g.module = module - var d = newDocumentor(toFilename(graph.config, FileIndex module.position), graph.cache, graph.config) + var d = newDocumentor(toFullPath(graph.config, FileIndex module.position), graph.cache, graph.config) d.hasToc = true g.doc = d result = g |