This commit is contained in:
parent
730ce53b71
commit
43f634db8d
3 changed files with 69 additions and 1 deletions
|
|
@ -198,3 +198,41 @@ macro dump*(x: typed): untyped =
|
|||
let r = quote do:
|
||||
debugEcho `s`, " = ", `x`
|
||||
return r
|
||||
|
||||
# TODO: consider exporting this in macros.nim
|
||||
proc freshIdentNodes(ast: NimNode): NimNode =
|
||||
# Replace NimIdent and NimSym by a fresh ident node
|
||||
# see also https://github.com/nim-lang/Nim/pull/8531#issuecomment-410436458
|
||||
proc inspect(node: NimNode): NimNode =
|
||||
case node.kind:
|
||||
of nnkIdent, nnkSym:
|
||||
result = ident($node)
|
||||
of nnkEmpty, nnkLiterals:
|
||||
result = node
|
||||
else:
|
||||
result = node.kind.newTree()
|
||||
for child in node:
|
||||
result.add inspect(child)
|
||||
result = inspect(ast)
|
||||
|
||||
macro distinctBase*(T: typedesc): untyped =
|
||||
## reverses ``type T = distinct A``; works recursively.
|
||||
runnableExamples:
|
||||
type T = distinct int
|
||||
doAssert distinctBase(T) is int
|
||||
doAssert: not compiles(distinctBase(int))
|
||||
type T2 = distinct T
|
||||
doAssert distinctBase(T2) is int
|
||||
|
||||
let typeNode = getTypeImpl(T)
|
||||
expectKind(typeNode, nnkBracketExpr)
|
||||
if typeNode[0].typeKind != ntyTypeDesc:
|
||||
error "expected typeDesc, got " & $typeNode[0]
|
||||
var typeSym = typeNode[1]
|
||||
typeSym = getTypeImpl(typeSym)
|
||||
if typeSym.typeKind != ntyDistinct:
|
||||
error "type is not distinct"
|
||||
typeSym = typeSym[0]
|
||||
while typeSym.typeKind == ntyDistinct:
|
||||
typeSym = getTypeImpl(typeSym)[0]
|
||||
typeSym.freshIdentNodes
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue