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:
Arne Döring
2020-03-11 08:27:31 +01:00
committed by GitHub
parent 8e3a349561
commit f95eef99a9
4 changed files with 50 additions and 1 deletions

View File

@@ -69,6 +69,7 @@
- Added `minIndex`, `maxIndex` and `unzip` to the `sequtils` module.
- Added `os.isRelativeTo` to tell whether a path is relative to another
- 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 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
diverse configuration settings.
## Library changes
- `asyncdispatch.drain` now properly takes into account `selector.hasPendingOperations`

View File

@@ -1433,6 +1433,13 @@ else:
else:
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.}=
## Search ``nnkFormalParams`` for an argument.
expectKind(params, nnkFormalParams)

View 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)

View 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)