mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
Implement isExported for symbols in macros (#11963)
* Implement isExported for macros * Reimplement isExported using VM callback mechanism * VM does not support exceptions, use stacktrace() instead.
This commit is contained in:
@@ -146,5 +146,14 @@ proc registerAdditionalOps*(c: PCtx) =
|
||||
|
||||
registerCallback c, "stdlib.macros.symBodyHash", proc (a: VmArgs) {.nimcall.} =
|
||||
let n = getNode(a, 0)
|
||||
if n.kind != nkSym: raise newException(ValueError, "node is not a symbol")
|
||||
if n.kind != nkSym:
|
||||
stackTrace(c, PStackFrame(prc: c.prc.sym, comesFrom: 0, next: nil), c.exceptionInstr,
|
||||
"symBodyHash() requires a symbol. '" & $n & "' is of kind '" & $n.kind & "'", n.info)
|
||||
setResult(a, $symBodyDigest(c.graph, n.sym))
|
||||
|
||||
registerCallback c, "stdlib.macros.isExported", proc(a: VmArgs) {.nimcall.} =
|
||||
let n = getNode(a, 0)
|
||||
if n.kind != nkSym:
|
||||
stackTrace(c, PStackFrame(prc: c.prc.sym, comesFrom: 0, next: nil), c.exceptionInstr,
|
||||
"isExported() requires a symbol. '" & $n & "' is of kind '" & $n.kind & "'", n.info)
|
||||
setResult(a, sfExported in n.sym.flags)
|
||||
|
||||
@@ -1611,3 +1611,6 @@ when defined(nimMacrosSizealignof):
|
||||
## from a field of a type. Therefore it only requires one argument
|
||||
## instead of two. Returns a negative value if the Nim compiler
|
||||
## does not know the offset.
|
||||
|
||||
proc isExported*(n: NimNode): bool {.noSideEffect.} =
|
||||
## Returns whether the symbol is exported or not.
|
||||
|
||||
10
tests/macros/tisexported.nim
Normal file
10
tests/macros/tisexported.nim
Normal file
@@ -0,0 +1,10 @@
|
||||
import macros
|
||||
|
||||
proc t1* = discard
|
||||
proc t2 = discard
|
||||
|
||||
macro check(p1: typed, p2: typed) =
|
||||
doAssert isExported(p1) == true
|
||||
doAssert isExported(p2) == false
|
||||
|
||||
check t1, t2
|
||||
Reference in New Issue
Block a user