Macros: Introduce getType(t: typedesc): NimNode

Since typedesc are exception in macros and they are not implicitly converted to
NimNode on macro call, we need some means to perform such conversion on demand.

Fortunately it is as simple as declaring new magic "NGetType" proc with
typedesc parameter.

NOTE: Keeping actual macro exceptional behavior for typedesc is important,
since it allows passing typedesc macro parameter to other procs or macros
expecting type parameter. If typedesc parameter was implicitly converted, then
we would lost this ability.
This commit is contained in:
Adam Strzelecki
2015-05-13 22:32:10 +02:00
parent 63f1e03278
commit 1d47617d1b
2 changed files with 26 additions and 0 deletions

View File

@@ -177,6 +177,12 @@ proc getType*(n: NimNode): NimNode {.magic: "NGetType", noSideEffect.}
## resolve recursive types, you have to call 'getType' again. To see what
## kind of type it is, call `typeKind` on getType's result.
proc getType*(n: typedesc): NimNode {.magic: "NGetType", noSideEffect.}
## Returns the Nim type node for given type. This can be used to turn macro
## typedesc parameter into proper NimNode representing type, since typedesc
## are an exception in macro calls - they are not mapped implicitly to
## NimNode like any other arguments.
proc typeKind*(n: NimNode): NimTypeKind {.magic: "NGetType", noSideEffect.}
## Returns the type kind of the node 'n' that should represent a type, that
## means the node should have been obtained via `getType`.

20
tests/macros/tgettype.nim Normal file
View File

@@ -0,0 +1,20 @@
discard """
msg: '''ObjectTy(Sym(Model), RecList(Sym(name), Sym(password)))
BracketExpr(Sym(typeDesc), Sym(User))'''
"""
import strutils, macros
type
Model = object of RootObj
User = object of Model
name : string
password : string
macro testUser: expr =
return newLit(User.getType.lispRepr)
macro testGeneric(T: typedesc[Model]): expr =
return newLit(T.getType.lispRepr)
echo testUser
echo User.testGeneric