mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
fix #17615(runnableExamples silently ignored if placed after some code) (#17619)
Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
This commit is contained in:
@@ -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<p><strong class=\"examples_text\">$1</strong></p>\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<p><strong class=\"examples_text\">$1</strong></p>\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..<n.safeLen:
|
||||
fn(n[i], topLevel = false)
|
||||
if state == rsDone: return
|
||||
if state == rsDone: discard # check all sons
|
||||
else: fn(n, topLevel = true)
|
||||
|
||||
proc isVisible(d: PDoc; n: PNode): bool =
|
||||
|
||||
@@ -288,9 +288,9 @@ proc diffInt*(arrayA, arrayB: openArray[int]): seq[Item] =
|
||||
var dataB = newDiffData(@arrayB, arrayB.len)
|
||||
|
||||
let max = dataA.len + dataB.len + 1
|
||||
## vector for the (0,0) to (x,y) search
|
||||
# vector for the (0,0) to (x,y) search
|
||||
var downVector = newSeq[int](2 * max + 2)
|
||||
## vector for the (u,v) to (N,M) search
|
||||
# vector for the (u,v) to (N,M) search
|
||||
var upVector = newSeq[int](2 * max + 2)
|
||||
|
||||
lcs(dataA, 0, dataA.len, dataB, 0, dataB.len, downVector, upVector)
|
||||
@@ -321,9 +321,9 @@ proc diffText*(textA, textB: string): seq[Item] =
|
||||
h.clear # free up hashtable memory (maybe)
|
||||
|
||||
let max = dataA.len + dataB.len + 1
|
||||
## vector for the (0,0) to (x,y) search
|
||||
# vector for the (0,0) to (x,y) search
|
||||
var downVector = newSeq[int](2 * max + 2)
|
||||
## vector for the (u,v) to (N,M) search
|
||||
# vector for the (u,v) to (N,M) search
|
||||
var upVector = newSeq[int](2 * max + 2)
|
||||
|
||||
lcs(dataA, 0, dataA.len, dataB, 0, dataB.len, downVector, upVector)
|
||||
|
||||
@@ -293,9 +293,9 @@ proc start*(c: proc(), stacksize: int = defaultStackSize): CoroutineRef {.discar
|
||||
return coro.reference
|
||||
|
||||
proc run*() =
|
||||
initialize()
|
||||
## Starts main coroutine scheduler loop which exits when all coroutines exit.
|
||||
## Calling this proc starts execution of first coroutine.
|
||||
initialize()
|
||||
ctx.current = ctx.coroutines.head
|
||||
var minDelay: float = 0
|
||||
while ctx.current != nil:
|
||||
|
||||
@@ -8,14 +8,13 @@ type JsBigInt* = distinct JsBigIntImpl ## Arbitrary precision integer fo
|
||||
|
||||
func big*(integer: SomeInteger): JsBigInt {.importjs: "BigInt(#)".} =
|
||||
## Constructor for `JsBigInt`.
|
||||
when nimvm: doAssert false, "JsBigInt can not be used at compile-time nor static context" else: discard
|
||||
runnableExamples:
|
||||
doAssert big(1234567890) == big"1234567890"
|
||||
doAssert 0b1111100111.big == 0o1747.big and 0o1747.big == 999.big
|
||||
when nimvm: doAssert false, "JsBigInt can not be used at compile-time nor static context" else: discard
|
||||
|
||||
func big*(integer: cstring): JsBigInt {.importjs: "BigInt(#)".} =
|
||||
## Constructor for `JsBigInt`.
|
||||
when nimvm: doAssert false, "JsBigInt can not be used at compile-time nor static context" else: discard
|
||||
runnableExamples:
|
||||
doAssert big"-1" == big"1" - big"2"
|
||||
# supports decimal, binary, octal, hex:
|
||||
@@ -24,6 +23,7 @@ func big*(integer: cstring): JsBigInt {.importjs: "BigInt(#)".} =
|
||||
doAssert big"0o701" == 0o701.big
|
||||
doAssert big"0xdeadbeaf" == 0xdeadbeaf.big
|
||||
doAssert big"0xffffffffffffffff" == (1.big shl 64.big) - 1.big
|
||||
when nimvm: doAssert false, "JsBigInt can not be used at compile-time nor static context" else: discard
|
||||
|
||||
func toCstring*(this: JsBigInt; radix: 2..36): cstring {.importjs: "#.toString(#)".} =
|
||||
## Converts from `JsBigInt` to `cstring` representation.
|
||||
|
||||
@@ -565,10 +565,9 @@ proc SSL_ctrl*(ssl: SslPtr, cmd: cint, larg: int, parg: pointer): int{.
|
||||
cdecl, dynlib: DLLSSLName, importc.}
|
||||
|
||||
proc SSL_set_tlsext_host_name*(ssl: SslPtr, name: cstring): int =
|
||||
result = SSL_ctrl(ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, name)
|
||||
## Set the SNI server name extension to be used in a client hello.
|
||||
## Returns 1 if SNI was set, 0 if current SSL configuration doesn't support SNI.
|
||||
|
||||
result = SSL_ctrl(ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, name)
|
||||
|
||||
proc SSL_get_servername*(ssl: SslPtr, typ: cint = TLSEXT_NAMETYPE_host_name): cstring {.cdecl, dynlib: DLLSSLName, importc.}
|
||||
## Retrieve the server name requested in the client hello. This can be used
|
||||
|
||||
@@ -1016,7 +1016,9 @@ cz15
|
||||
<p><strong class="examples_text">Example:</strong></p>
|
||||
<pre class="listing"><span class="Keyword">discard</span><span class="Whitespace"> </span><span class="DecNumber">4</span></pre>ok5 ok5b
|
||||
<p><strong class="examples_text">Example:</strong></p>
|
||||
<pre class="listing"><span class="Identifier">assert</span><span class="Whitespace"> </span><span class="Identifier">true</span></pre>in or out?
|
||||
<pre class="listing"><span class="Identifier">assert</span><span class="Whitespace"> </span><span class="Identifier">true</span></pre>
|
||||
<p><strong class="examples_text">Example:</strong></p>
|
||||
<pre class="listing"><span class="Keyword">discard</span><span class="Whitespace"> </span><span class="DecNumber">1</span></pre>in or out?
|
||||
|
||||
</dd>
|
||||
<a id="testNimDocTrailingExample.t"></a>
|
||||
|
||||
@@ -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]
|
||||
|
||||
11
tests/nimdoc/t17615.nim
Normal file
11
tests/nimdoc/t17615.nim
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user