Files
Nim/nimdoc/testproject/testproject.nim
Jake Leahy 17915d93bf Fix non-toplevel fields in objects not getting rendered (#22266)
* Add example object into testproject

The proc is there to check the case of an identDef being inside an identDef (We do want to render those even if they are not exported)

* Add `inside` set to `TSrcGen` which allows us to see what context we are in

This is done instead of adding another inXyz bool parameter

We then use this to know if we are inside an object when rendering an nkIdentDefs (To know if we need to skip rendering it)

* Update test files
2023-07-16 19:46:18 +02:00

411 lines
8.6 KiB
Nim

import subdir / subdir_b / utils
## This is the top level module.
runnableExamples:
import subdir / subdir_b / utils
doAssert bar(3, 4) == 7
foo(enumValueA, enumValueB)
# bug #11078
for x in "xx": discard
var someVariable*: bool ## This should be visible.
when true:
## top2
runnableExamples:
discard "in top2"
## top2 after
runnableExamples:
discard "in top3"
## top3 after
const
C_A* = 0x7FF0000000000000'f64
C_B* = 0o377'i8
C_C* = 0o277'i8
C_D* = 0o177777'i16
proc bar*[T](a, b: T): T =
result = a + b
proc baz*[T](a, b: T): T {.deprecated.} =
## This is deprecated without message.
result = a + b
proc buzz*[T](a, b: T): T {.deprecated: "since v0.20".} =
## This is deprecated with a message.
result = a + b
type
FooBuzz* {.deprecated: "FooBuzz msg".} = int
using f: FooBuzz
proc bar*(f) = # `f` should be expanded to `f: FooBuzz`
discard
import std/macros
var aVariable*: array[1, int]
# bug #9432
aEnum()
bEnum()
fromUtilsGen()
proc isValid*[T](x: T): bool = x.len > 0
when true:
# these cases appear redundant but they're actually (almost) all different at
# AST level and needed to ensure docgen keeps working, e.g. because of issues
# like D20200526T163511
type
Foo* = enum
enumValueA2
proc z1*(): Foo =
## cz1
Foo.default
proc z2*() =
## cz2
runnableExamples:
discard "in cz2"
proc z3*() =
## cz3
proc z4*() =
## cz4
discard
when true:
# tests for D20200526T163511
proc z5*(): int =
## cz5
return 1
proc z6*(): int =
## cz6
1
template z6t*(): int =
## cz6t
1
proc z7*(): int =
## cz7
result = 1
proc z8*(): int =
## cz8
block:
discard
1+1
when true:
# interleaving 0 or more runnableExamples and doc comments, issue #9227
proc z9*() =
runnableExamples: doAssert 1 + 1 == 2
proc z10*() =
runnableExamples "-d:foobar":
discard 1
## cz10
proc z11*() =
runnableExamples:
discard 1
discard
proc z12*(): int =
runnableExamples:
discard 1
12
proc z13*() =
## cz13
runnableExamples:
discard
proc baz*() = discard
proc bazNonExported() =
## out (not exported)
runnableExamples:
# BUG: this currently this won't be run since not exported
# but probably should
doAssert false
if false: bazNonExported() # silence XDeclaredButNotUsed
proc z17*() =
# BUG: a comment before 1st doc comment currently doesn't prevent
# doc comment from being docgen'd; probably should be fixed
## cz17
## rest
runnableExamples:
discard 1
## rest
# this comment separates docgen'd doc comments
## out
when true: # capture non-doc comments correctly even before 1st token
proc p1*() =
## cp1
runnableExamples: doAssert 1 == 1 # regular comments work here
## c4
runnableExamples:
# c5 regular comments before 1st token work
# regular comment
#[
nested regular comment
]#
doAssert 2 == 2 # c8
## this is a non-nested doc comment
##[
this is a nested doc comment
]##
discard "c9"
# also work after
# this should be out
when true: # issue #14485
proc addfBug14485*() =
## Some proc
runnableExamples:
discard "foo() = " & $[1]
#[
0: let's also add some broken html to make sure this won't break in future
1: </span>
2: </span>
3: </span
4: </script>
5: </script
6: </script
7: end of broken html
]#
when true: # procs without `=` (using comment field)
proc c_printf*(frmt: cstring): cint {.importc: "printf", header: "<stdio.h>", varargs, discardable.}
## the c printf.
## etc.
proc c_nonexistent*(frmt: cstring): cint {.importc: "nonexistent", header: "<stdio.h>", varargs, discardable.}
when true: # tests RST inside comments
proc low*[T: Ordinal|enum|range](x: T): T {.magic: "Low", noSideEffect.}
## Returns the lowest possible value of an ordinal value `x`. As a special
## semantic rule, `x` may also be a type identifier.
##
## See also:
## * `low2(T) <#low2,T>`_
##
## .. code-block:: Nim
## low(2) # => -9223372036854775808
proc low2*[T: Ordinal|enum|range](x: T): T {.magic: "Low", noSideEffect.} =
## Returns the lowest possible value of an ordinal value `x`. As a special
## semantic rule, `x` may also be a type identifier.
##
## See also:
## * `low(T) <#low,T>`_
##
## .. code-block:: Nim
## low2(2) # => -9223372036854775808
runnableExamples:
discard "in low2"
when true: # multiline string litterals
proc tripleStrLitTest*() =
runnableExamples("--hint:XDeclaredButNotUsed:off"):
## mullitline string litterals are tricky as their indentation can span
## below that of the runnableExamples
let s1a = """
should appear at indent 0
at indent 2
at indent 0
"""
# make sure this works too
let s1b = """start at same line
at indent 2
at indent 0
""" # comment after
let s2 = """sandwich """
let s3 = """"""
when false:
let s5 = """
in s5 """
let s3b = ["""
%!? #[...] # inside a multiline ...
""", "foo"]
## make sure handles trailing spaces
let s4 = """
"""
let s5 = """ x
"""
let s6 = """ ""
"""
let s7 = """"""""""
let s8 = ["""""""""", """
""" ]
discard
# should be in
# should be out
when true: # methods; issue #14691
type Moo = object
method method1*(self: Moo) {.base.} =
## foo1
method method2*(self: Moo): int {.base.} =
## foo2
result = 1
method method3*(self: Moo): int {.base.} =
## foo3
1
when true: # iterators
iterator iter1*(n: int): int =
## foo1
for i in 0..<n:
yield i
iterator iter2*(n: int): int =
## foo2
runnableExamples:
discard # bar
yield 0
when true: # (most) macros
macro bar*(): untyped =
result = newStmtList()
macro z16*() =
runnableExamples: discard 1
## cz16
## after
runnableExamples:
doAssert 2 == 1 + 1
# BUG: we should probably render `cz16\nafter` by keeping newline instead or
# what it currently renders as: `cz16 after`
macro z18*(): int =
## cz18
newLit 0
when true: # (most) templates
template foo*(a, b: SomeType) =
## This does nothing
##
discard
template myfn*() =
runnableExamples:
import std/strutils
## issue #8871 preserve formatting
## line doc comment
# bar
doAssert "'foo" == "'foo"
##[
foo
bar
]##
doAssert: not "foo".startsWith "ba"
block:
discard 0xff # elu par cette crapule
# should be in
## should be still in
# out
## out
template z14*() =
## cz14
runnableExamples:
discard
template z15*() =
## cz15
runnableExamples:
discard
runnableExamples: discard 3
runnableExamples: discard 4
## ok5
## ok5b
runnableExamples: assert true
runnableExamples: discard 1
## in or out?
discard 8
## out
when true: # issue #14473
import std/[sequtils]
template doit(): untyped =
## doit
## return output only
toSeq(["D20210427T172228"]) # make it searcheable at least until we figure out a way to avoid echo
echo doit() # using doAssert or similar to avoid echo would "hide" the original bug
when true: # issue #14846
import asyncdispatch
proc asyncFun1*(): Future[int] {.async.} =
## ok1
result = 1
proc asyncFun2*() {.async.} = discard
proc asyncFun3*() {.async.} =
runnableExamples:
discard
## ok1
discard
## should be out
discard
when true:
template testNimDocTrailingExample*() =
# this must be last entry in this file, it checks against a bug (that got fixed)
# where runnableExamples would not show if there was not at least 2 "\n" after
# the last character of runnableExamples
runnableExamples:
discard 2
when true: # issue #15702
type
Shapes* = enum
## Some shapes.
Circle, ## A circle
Triangle, ## A three-sided shape
Rectangle ## A four-sided shape
when true: # issue #15184
proc anything* =
##
## There is no block quote after blank lines at the beginning.
discard
type T19396* = object # bug #19396
a*: int
b: float
template somePragma*() {.pragma.}
## Just some annotation
type # bug #21483
MyObject* = object
someString*: string ## This is a string
annotated* {.somePragma.}: string ## This is an annotated string
type
AnotherObject* = object
case x*: bool
of true:
y*: proc (x: string)
of false:
hidden: string