Fixes #16219, hasArgOfName ignoring argument sets. (#16233)

* Fixes #16219, `hasArgOfName` ignoring argument sets.

* Fix test and simplify ident traversal.

* Moved test into a block and removed some boilerplate.

* Fix some argument formatting.

* use ..<

* Change the preceding line too

Co-authored-by: Clyybber <darkmine956@gmail.com>
This commit is contained in:
Aditya Siram
2020-12-03 06:40:28 -06:00
committed by GitHub
parent 849bc36eda
commit 23447ffdce
2 changed files with 13 additions and 4 deletions

View File

@@ -1434,10 +1434,10 @@ proc expectIdent*(n: NimNode, name: string) {.compileTime, since: (1,1).} =
proc hasArgOfName*(params: NimNode; name: string): bool {.compileTime.}=
## Search ``nnkFormalParams`` for an argument.
expectKind(params, nnkFormalParams)
for i in 1 ..< params.len:
template node: untyped = params[i]
if name.eqIdent( $ node[0]):
return true
for i in 1..<params.len:
for j in 0..<params[i].len-2:
if name.eqIdent($params[i][j]):
return true
proc addIdentIfAbsent*(dest: NimNode, ident: string) {.compileTime.} =
## Add ``ident`` to ``dest`` if it is not present. This is intended for use

9
tests/stdlib/tmacros.nim Normal file
View File

@@ -0,0 +1,9 @@
import macros
block: # hasArgOfName
macro m(u: untyped): untyped =
for name in ["s","i","j","k","b","xs","ys"]:
doAssert hasArgOfName(params u,name)
doAssert not hasArgOfName(params u,"nonexistent")
proc p(s: string; i,j,k: int; b: bool; xs,ys: seq[int] = @[]) {.m.} = discard