blob: c3936ef79a46ffcaa9623a95209196fe9d04debe [file] [view]
# Swift Export USR Stability
Swift symbol USRs (Unified Symbol Resolution) are compiler-generated identifiers emitted by
`swift symbolgraph-extract`. The Swift export integration tests assert on demangled USRs
(`SwiftSymbol.demangledId`) for readability, while the raw USR is used only during extraction.
## How it works
1. `extractModuleSymbols` reads the symbolgraph JSON and extracts raw USRs and `pathComponents`.
2. Each raw USR is demangled via `xcrun swift-demangle --compact` and stored in
`SwiftSymbol.demangledId`.
3. Equality and hashing are based on demangled ID only.
4. `toString()` returns `demangledId`, so assertion failure diffs are human-readable.
Compound USRs containing `::SYNTHESIZED::` (used for protocol extension members that Swift
synthesizes automatically, such as `localizedDescription` from `Foundation.Error`) are split,
each part demangled separately, and reassembled as
`"<demangled lhs> [SYNTHESIZED for <demangled rhs>]"`.
## What the tests assume
The tests assume that, for the same Kotlin sources and export configuration, the resulting USR
strings remain stable across runs. This is generally true within a fixed toolchain, but USRs can
change when:
- The Swift compiler version changes its mangling scheme
- Kotlin/Native Swift export changes how it maps or mangles symbols
- The exported API surface changes (new/removed/renamed declarations)
A change in USRs is not automatically a regression. It can be either:
- An intentional API surface change
- A toolchain change that requires updating expected USRs
## Updating expected symbols
1. Run the relevant Swift export integration tests.
2. Inspect the assertion failure output to find the actual values.
3. Update the expected `SwiftSymbol` entries in the test (`demangledId` and
`pathComponents`).
4. To demangle a raw USR manually, use `--compact` (matches the tests) and either:
```
xcrun swift-demangle --compact '$s6Shared3fooyyF'
```
or (stdin form requires the `$s` prefix explicitly):
```
echo '$s6Shared3fooyyF' | xcrun swift-demangle --compact
```
5. Re-run tests to confirm the API surface is as expected.
## Where to look
- `SwiftExportIT.kt` test expectations with hardcoded symbols
- `SwiftExportUtils.kt` `SwiftSymbol`, parsing, demangling, and assertion helpers