Skip to content

Commit

Permalink
add expectIdent to macros (nim-lang#12778)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
3 people authored Mar 11, 2020
1 parent 8e3a349 commit f95eef9
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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`
Expand Down
7 changes: 7 additions & 0 deletions lib/core/macros.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
18 changes: 18 additions & 0 deletions tests/macros/texpectIdent1.nim
Original file line number Diff line number Diff line change
@@ -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 changes: 24 additions & 0 deletions tests/macros/texpectIdent2.nim
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit f95eef9

Please sign in to comment.