add expectIdent to macros (#12778)
* add expectIdent to macros * apply feedback * Update lib/core/macros.nim Co-Authored-By: Clyybber <darkmine956@gmail.com> * Update texpectIdent2.nim * Update texpectIdent1.nim Co-authored-by: Clyybber <darkmine956@gmail.com> Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
parent
8e3a349561
commit
f95eef99a9
4 changed files with 50 additions and 1 deletions
|
|
@ -69,6 +69,7 @@
|
||||||
- Added `minIndex`, `maxIndex` and `unzip` to the `sequtils` module.
|
- Added `minIndex`, `maxIndex` and `unzip` to the `sequtils` module.
|
||||||
- Added `os.isRelativeTo` to tell whether a path is relative to another
|
- Added `os.isRelativeTo` to tell whether a path is relative to another
|
||||||
- Added `resetOutputFormatters` to `unittest`
|
- Added `resetOutputFormatters` to `unittest`
|
||||||
|
- Added `expectIdent` to the `macros` module.
|
||||||
- Added `os.isValidFilename` that returns `true` if `filename` argument is valid for crossplatform use.
|
- Added `os.isValidFilename` that returns `true` if `filename` argument is valid for crossplatform use.
|
||||||
|
|
||||||
- Added a `with` macro for easy function chaining that's available
|
- Added a `with` macro for easy function chaining that's available
|
||||||
|
|
@ -95,7 +96,6 @@ echo f
|
||||||
- Added a new module, `std / compilesettings` for querying the compiler about
|
- Added a new module, `std / compilesettings` for querying the compiler about
|
||||||
diverse configuration settings.
|
diverse configuration settings.
|
||||||
|
|
||||||
|
|
||||||
## Library changes
|
## Library changes
|
||||||
|
|
||||||
- `asyncdispatch.drain` now properly takes into account `selector.hasPendingOperations`
|
- `asyncdispatch.drain` now properly takes into account `selector.hasPendingOperations`
|
||||||
|
|
|
||||||
|
|
@ -1433,6 +1433,13 @@ else:
|
||||||
else:
|
else:
|
||||||
result = false
|
result = false
|
||||||
|
|
||||||
|
proc expectIdent*(n: NimNode, name: string) {.compileTime, since: (1,1).} =
|
||||||
|
## Check that ``eqIdent(n,name)`` holds true. If this is not the
|
||||||
|
## case, compilation aborts with an error message. This is useful
|
||||||
|
## for writing macros that check the AST that is passed to them.
|
||||||
|
if not eqIdent(n, name):
|
||||||
|
error("Expected identifier to be `" & name & "` here", n)
|
||||||
|
|
||||||
proc hasArgOfName*(params: NimNode; name: string): bool {.compileTime.}=
|
proc hasArgOfName*(params: NimNode; name: string): bool {.compileTime.}=
|
||||||
## Search ``nnkFormalParams`` for an argument.
|
## Search ``nnkFormalParams`` for an argument.
|
||||||
expectKind(params, nnkFormalParams)
|
expectKind(params, nnkFormalParams)
|
||||||
|
|
|
||||||
18
tests/macros/texpectIdent1.nim
Normal file
18
tests/macros/texpectIdent1.nim
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
discard """
|
||||||
|
errormsg: "Expected identifier to be `foo` here"
|
||||||
|
line: 18
|
||||||
|
"""
|
||||||
|
|
||||||
|
import macros
|
||||||
|
|
||||||
|
macro testUntyped(arg: untyped): void =
|
||||||
|
arg.expectKind nnkStmtList
|
||||||
|
arg.expectLen 2
|
||||||
|
arg[0].expectKind nnkCall
|
||||||
|
arg[0][0].expectIdent "foo" # must pass
|
||||||
|
arg[1].expectKind nnkCall
|
||||||
|
arg[1][0].expectIdent "foo" # must fail
|
||||||
|
|
||||||
|
testUntyped:
|
||||||
|
foo(123)
|
||||||
|
bar(321)
|
||||||
24
tests/macros/texpectIdent2.nim
Normal file
24
tests/macros/texpectIdent2.nim
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
discard """
|
||||||
|
errormsg: "Expected identifier to be `foo` here"
|
||||||
|
line: 24
|
||||||
|
"""
|
||||||
|
|
||||||
|
import macros
|
||||||
|
|
||||||
|
macro testTyped(arg: typed): void =
|
||||||
|
arg.expectKind nnkStmtList
|
||||||
|
arg.expectLen 2
|
||||||
|
arg[0].expectKind nnkCall
|
||||||
|
arg[0][0].expectIdent "foo" # must pass
|
||||||
|
arg[1].expectKind nnkCall
|
||||||
|
arg[1][0].expectIdent "foo" # must fail
|
||||||
|
|
||||||
|
proc foo(arg: int) =
|
||||||
|
discard
|
||||||
|
|
||||||
|
proc bar(arg: int) =
|
||||||
|
discard
|
||||||
|
|
||||||
|
testTyped:
|
||||||
|
foo(123)
|
||||||
|
bar(321)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue