mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
45 lines
1.3 KiB
Nim
45 lines
1.3 KiB
Nim
##[
|
|
Utilities related to import and symbol resolution.
|
|
|
|
Experimental API, subject to change.
|
|
]##
|
|
|
|
#[
|
|
Possible future APIs:
|
|
* module symbols (https://github.com/nim-lang/Nim/pull/9560)
|
|
* whichModule (subsumes canImport / moduleExists) (https://github.com/timotheecour/Nim/issues/376)
|
|
* getCurrentPkgDir (https://github.com/nim-lang/Nim/pull/10530)
|
|
* import from a computed string + related APIs (https://github.com/nim-lang/Nim/pull/10527)
|
|
]#
|
|
|
|
when defined(nimImportutilsExample):
|
|
type
|
|
Foo = object
|
|
f0: int # private
|
|
Goo*[T] = object
|
|
g0: int # private
|
|
proc initFoo*(): auto = Foo()
|
|
|
|
proc privateAccess*(t: typedesc) {.magic: "PrivateAccess".} =
|
|
## Enables access to private fields of `t` in current scope.
|
|
runnableExamples("-d:nimImportutilsExample"):
|
|
# here we're importing a module containing:
|
|
# type
|
|
# Foo = object
|
|
# f0: int # private
|
|
# Goo*[T] = object
|
|
# g0: int # private
|
|
# proc initFoo*(): auto = Foo()
|
|
var f = initFoo()
|
|
block:
|
|
assert not compiles(f.f0)
|
|
privateAccess(f.type)
|
|
f.f0 = 1 # accessible in this scope
|
|
block:
|
|
assert f.f0 == 1 # still in scope
|
|
assert not compiles(f.f0)
|
|
|
|
# this also works with generics
|
|
privateAccess(Goo)
|
|
assert Goo[float](g0: 1).g0 == 1
|