mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
In Desktop Swift, @_implementationOnly imports allow one to hide the implementation so long as you're careful to only reference entities from the imported modules in code that gets compiled into the object file and *not* referenced by the corresponding Swift module file. Until very recently, there was no such affordance for Embedded Swift, because all functions would have their SIL serialized to the Swift module file. Using them from a client module would then attempt to deserialize the SIL, loading the @_implementationOnly-imported module and causing the compiler to abort. With the introduction of @_neverEmitIntoClient, we now have a way to say "only in the object file, never in the module file" for the definition of functions. Introduce a test that makes sure @_implementationOnly + @_neverEmitIntoClient has the desired effect of hiding the imported modules from clients. It's still brittle and hard to use, just like the existing @_implementationOnly, but this shows that it's at least possible to do this implementation hiding in Embedded Swift.