mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 14:25:23 +00:00
@@ -1076,20 +1076,24 @@ proc expectKind*(n: NimNode; k: set[NimNodeKind]) {.compileTime.} =
|
||||
## macros that check the AST that is passed to them.
|
||||
if n.kind notin k: error("Expected one of " & $k & ", got " & $n.kind, n)
|
||||
|
||||
proc newProc*(name = newEmptyNode(); params: openArray[NimNode] = [newEmptyNode()];
|
||||
body: NimNode = newStmtList(), procType = nnkProcDef): NimNode {.compileTime.} =
|
||||
proc newProc*(name = newEmptyNode();
|
||||
params: openArray[NimNode] = [newEmptyNode()];
|
||||
body: NimNode = newStmtList();
|
||||
procType = nnkProcDef;
|
||||
pragmas: NimNode = newEmptyNode()): NimNode {.compileTime.} =
|
||||
## shortcut for creating a new proc
|
||||
##
|
||||
## The ``params`` array must start with the return type of the proc,
|
||||
## followed by a list of IdentDefs which specify the params.
|
||||
if procType notin RoutineNodes:
|
||||
error("Expected one of " & $RoutineNodes & ", got " & $procType)
|
||||
pragmas.expectKind({nnkEmpty, nnkPragma})
|
||||
result = newNimNode(procType).add(
|
||||
name,
|
||||
newEmptyNode(),
|
||||
newEmptyNode(),
|
||||
newNimNode(nnkFormalParams).add(params),
|
||||
newEmptyNode(), # pragmas
|
||||
pragmas,
|
||||
newEmptyNode(),
|
||||
body)
|
||||
|
||||
|
||||
51
tests/macros/tnewproc.nim
Normal file
51
tests/macros/tnewproc.nim
Normal file
@@ -0,0 +1,51 @@
|
||||
import macros
|
||||
|
||||
macro test(a: untyped): untyped =
|
||||
# proc hello*(x: int = 3, y: float32): int {.inline.} = discard
|
||||
let
|
||||
nameNode = nnkPostfix.newTree(
|
||||
newIdentNode("*"),
|
||||
newIdentNode("hello")
|
||||
)
|
||||
params = @[
|
||||
newIdentNode("int"),
|
||||
nnkIdentDefs.newTree(
|
||||
newIdentNode("x"),
|
||||
newIdentNode("int"),
|
||||
newLit(3)
|
||||
),
|
||||
nnkIdentDefs.newTree(
|
||||
newIdentNode("y"),
|
||||
newIdentNode("float32"),
|
||||
newEmptyNode()
|
||||
)
|
||||
]
|
||||
paramsNode = nnkFormalParams.newTree(params)
|
||||
pragmasNode = nnkPragma.newTree(
|
||||
newIdentNode("inline")
|
||||
)
|
||||
bodyNode = nnkStmtList.newTree(
|
||||
nnkDiscardStmt.newTree(
|
||||
newEmptyNode()
|
||||
)
|
||||
)
|
||||
|
||||
var
|
||||
expected = nnkProcDef.newTree(
|
||||
nameNode,
|
||||
newEmptyNode(),
|
||||
newEmptyNode(),
|
||||
paramsNode,
|
||||
pragmasNode,
|
||||
newEmptyNode(),
|
||||
bodyNode
|
||||
)
|
||||
|
||||
doAssert expected == newProc(name=nameNode, params=params,
|
||||
body = bodyNode, pragmas=pragmasNode)
|
||||
expected.pragma = newEmptyNode()
|
||||
doAssert expected == newProc(name=nameNode, params=params,
|
||||
body = bodyNode)
|
||||
|
||||
test:
|
||||
42
|
||||
Reference in New Issue
Block a user