From a807233aebcd3759bc3e21b450ed89e1eb6ddace Mon Sep 17 00:00:00 2001
From: flywind
Date: Sat, 3 Apr 2021 09:26:30 +0800
Subject: [PATCH] fix #17615(runnableExamples silently ignored if placed after
some code) (#17619)
Co-authored-by: Timothee Cour
---
compiler/docgen.nim | 33 +++++++++++---------
lib/experimental/diff.nim | 8 ++---
lib/pure/coro.nim | 2 +-
lib/std/jsbigints.nim | 4 +--
lib/wrappers/openssl.nim | 3 +-
nimdoc/testproject/expected/testproject.html | 4 ++-
nimdoc/testproject/testproject.nim | 4 +--
tests/nimdoc/t17615.nim | 11 +++++++
8 files changed, 41 insertions(+), 28 deletions(-)
create mode 100644 tests/nimdoc/t17615.nim
diff --git a/compiler/docgen.nim b/compiler/docgen.nim
index 37d8955f62..2f7415241e 100644
--- a/compiler/docgen.nim
+++ b/compiler/docgen.nim
@@ -608,20 +608,23 @@ proc getAllRunnableExamplesImpl(d: PDoc; n: PNode, dest: var Rope, state: Runnab
return rsComment
of nkCallKinds:
if isRunnableExamples(n[0]) and
- n.len >= 2 and n.lastSon.kind == nkStmtList and state in {rsStart, rsComment, rsRunnable}:
- let (rdoccmd, code) = prepareExample(d, n, topLevel)
- var msg = "Example:"
- if rdoccmd.len > 0: msg.add " cmd: " & rdoccmd
- dispA(d.conf, dest, "\n$1
\n",
- "\n\\textbf{$1}\n", [msg.rope])
- inc d.listingCounter
- let id = $d.listingCounter
- dest.add(d.config.getOrDefault"doc.listing_start" % [id, "langNim", ""])
- var dest2 = ""
- renderNimCode(dest2, code, isLatex = d.conf.cmd == cmdRst2tex)
- dest.add dest2
- dest.add(d.config.getOrDefault"doc.listing_end" % id)
- return rsRunnable
+ n.len >= 2 and n.lastSon.kind == nkStmtList:
+ if state in {rsStart, rsComment, rsRunnable}:
+ let (rdoccmd, code) = prepareExample(d, n, topLevel)
+ var msg = "Example:"
+ if rdoccmd.len > 0: msg.add " cmd: " & rdoccmd
+ dispA(d.conf, dest, "\n$1
\n",
+ "\n\\textbf{$1}\n", [msg.rope])
+ inc d.listingCounter
+ let id = $d.listingCounter
+ dest.add(d.config.getOrDefault"doc.listing_start" % [id, "langNim", ""])
+ var dest2 = ""
+ renderNimCode(dest2, code, isLatex = d.conf.cmd == cmdRst2tex)
+ dest.add dest2
+ dest.add(d.config.getOrDefault"doc.listing_end" % id)
+ return rsRunnable
+ else:
+ localError(d.conf, n.info, errUser, "runnableExamples must appear before the first non-comment statement")
else: discard
return rsDone
# change this to `rsStart` if you want to keep generating doc comments
@@ -671,7 +674,7 @@ proc getAllRunnableExamples(d: PDoc, n: PNode, dest: var Rope) =
else:
for i in 0..Example:
discard 4
ok5 ok5b
Example:
-assert true
in or out?
+assert true
+Example:
+discard 1
in or out?
diff --git a/nimdoc/testproject/testproject.nim b/nimdoc/testproject/testproject.nim
index 69edb0d235..6b82acb9bd 100644
--- a/nimdoc/testproject/testproject.nim
+++ b/nimdoc/testproject/testproject.nim
@@ -330,13 +330,11 @@ when true: # (most) templates
## ok5
## ok5b
runnableExamples: assert true
+ runnableExamples: discard 1
## in or out?
- # this is an edge case; a newline separate last runnableExamples from
- # next doc comment but AST isnt' aware of it; this could change in future
discard 8
## out
- runnableExamples: discard 1
when true: # issue #14473
import std/[sequtils]
diff --git a/tests/nimdoc/t17615.nim b/tests/nimdoc/t17615.nim
new file mode 100644
index 0000000000..77ae35a159
--- /dev/null
+++ b/tests/nimdoc/t17615.nim
@@ -0,0 +1,11 @@
+discard """
+ cmd: "nim doc -r $file"
+ errormsg: "runnableExamples must appear before the first non-comment statement"
+ line: 10
+"""
+
+func fn*() =
+ ## foo
+ discard
+ runnableExamples:
+ assert true