mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-06 21:17:48 +00:00
* fixes #18235 - proc annotation type macro sym leak - also fixed a typo - proc annotations guard symbol exports with shadow scopes - symbol handling is shadow scope aware * test for exporting an existing unexported sym this one is for my homie alaviss. * Special handling not needed in semProcAnnotation * Testcasing * [skip ci] clean-up and add some more comments * [skip ci] rm trailing whitespace Co-authored-by: Clyybber <darkmine956@gmail.com>
42 lines
1.3 KiB
Nim
42 lines
1.3 KiB
Nim
import macros
|
|
|
|
# Necessary code to update the AST on a symbol across module boundaries when
|
|
# processed by a type macro. Used by a test of a corresponding name of this
|
|
# file.
|
|
|
|
macro eexport(n: typed): untyped =
|
|
result = copyNimTree(n)
|
|
# turn exported nnkSym -> nnkPostfix(*, nnkIdent), forcing re-sem
|
|
result[0] = nnkPostfix.newTree(ident"*").add:
|
|
n.name.strVal.ident
|
|
|
|
macro unexport(n: typed): untyped =
|
|
result = copyNimTree(n)
|
|
# turn nnkSym -> nnkIdent, forcing re-sem and dropping any exported-ness
|
|
# that might be present
|
|
result[0] = n.name.strVal.ident
|
|
|
|
proc foo*() {.unexport.} = discard
|
|
proc bar() {.eexport.} = discard
|
|
|
|
proc foooof*() {.unexport, eexport, unexport.} = discard
|
|
proc barrab() {.eexport, unexport, eexport.} = discard
|
|
|
|
macro eexportMulti(n: typed): untyped =
|
|
# use the call version of `eexport` macro for one or more decls
|
|
result = copyNimTree(n)
|
|
for i in 0..<result.len:
|
|
result[i] = newCall(ident"eexport", result[i])
|
|
|
|
macro unexportMulti(n: typed): untyped =
|
|
# use the call version of `unexport` macro for one or more decls
|
|
result = copyNimTree(n)
|
|
for i in 0..<result.len:
|
|
result[i] = newCall(ident"unexport", result[i])
|
|
|
|
unexportMulti:
|
|
proc oof*() = discard
|
|
|
|
eexportMulti:
|
|
proc rab() = discard
|
|
proc baz*() = discard |