mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-21 20:10:44 +00:00
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:
@@ -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`
|
||||
|
||||
@@ -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)
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user