[Swift Export] Generate Kotlin<->Swift type mapping ^KT-70678
diff --git a/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.kt b/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.kt
new file mode 100644
index 0000000..3a32c69
--- /dev/null
+++ b/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.kt
@@ -0,0 +1,11 @@
+// KIND: STANDALONE
+// MODULE: base
+// FILE: base.kt
+package base
+
+class ClassInBase(val x: Int)
+
+// MODULE: dep
+// FILE: dep.kt
+
+class ClassInDep(val y: Int)
\ No newline at end of file
diff --git a/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.swift b/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.swift
new file mode 100644
index 0000000..aef01ab
--- /dev/null
+++ b/native/native.tests/testData/SwiftExport/binaryTypeName/binaryTypeName.swift
@@ -0,0 +1,25 @@
+import base
+import dep
+import ObjectiveC
+
+func testBinaryNames() throws {
+    try assertSame(
+        actual: objc_getClass("SEExportedKotlinPackages_base_ClassInBase") as! base.ClassInBase.Type,
+        expected: base.ClassInBase.self
+    )
+    try assertSame(
+        actual: objc_getClass("SEdep_ClassInDep") as! dep.ClassInDep.Type,
+        expected: dep.ClassInDep.self
+    )
+}
+
+class BinaryTypeNameTests : TestProvider {
+    var tests: [TestCase] = []
+
+    init() {
+        providers.append(self)
+        tests = [
+            TestCase(name: "testBinaryNames", method: withAutorelease(testBinaryNames)),
+        ]
+    }
+}
\ No newline at end of file
diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/SwiftExportExecutionTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/SwiftExportExecutionTestGenerated.java
index 8dcdade..93d67db 100644
--- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/SwiftExportExecutionTestGenerated.java
+++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/SwiftExportExecutionTestGenerated.java
@@ -30,6 +30,12 @@
   }
 
   @Test
+  @TestMetadata("binaryTypeName")
+  public void testBinaryTypeName() {
+    runTest("native/native.tests/testData/SwiftExport/binaryTypeName/");
+  }
+
+  @Test
   @TestMetadata("char")
   public void testChar() {
     runTest("native/native.tests/testData/SwiftExport/char/");
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
index 0281ca1..15f0619 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
@@ -20,6 +20,7 @@
 import org.jetbrains.kotlin.sir.providers.utils.computeIsOverrideForDesignatedInit
 import org.jetbrains.kotlin.sir.providers.utils.updateImport
 import org.jetbrains.kotlin.sir.util.SirSwiftModule
+import org.jetbrains.kotlin.sir.util.swiftFqName
 import org.jetbrains.sir.lightclasses.SirFromKtSymbol
 import org.jetbrains.sir.lightclasses.extensions.documentation
 import org.jetbrains.sir.lightclasses.extensions.lazyWithSessions
@@ -51,6 +52,10 @@
     override val name: String by lazy {
         ktSymbol.name.asString()
     }
+    override val binaryName: String? by lazy {
+        // Alternatively, implement Swift mangling https://github.com/swiftlang/swift/blob/main/docs/ABI/Mangling.rst
+        "SE${swiftFqName.replace(".", "_")}"
+    }
 
     override var parent: SirDeclarationParent
         get() = withSessions {
diff --git a/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
index 81e74a9..282bb51 100644
--- a/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
+++ b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
@@ -82,6 +82,7 @@
         if (this is SirDeclaration) {
             printDocumentation()
             if (this is SirClass) {
+                printObjCName()
                 printModifiers()
             } else {
                 printVisibility()
@@ -324,6 +325,10 @@
             SirCallableKind.STATIC_METHOD -> "static "
         }
     )
+
+    private fun SirClass.printObjCName() = binaryName?.let {
+        print("@objc($it) ")
+    }
 }
 
 private val SirVisibility.swift
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
index 0b348dc..32b5c5e 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
@@ -30,6 +30,7 @@
     public val kotlinBase: SirClass by lazy {
         buildClass {
             name = "KotlinBase"
+            binaryName = "KotlinBase"
             origin = KotlinRuntimeElement()
             declarations += buildInit {
                 origin = KotlinRuntimeElement()
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
index 5fd0f3a..4c27618 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
@@ -20,4 +20,5 @@
     abstract override val declarations: List<SirDeclaration>
     abstract val superClass: SirType?
     abstract val modality: SirClassModality
+    abstract val binaryName: String?
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
index 6455cbb..3194036 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
@@ -23,6 +23,7 @@
     val declarations: MutableList<SirDeclaration> = mutableListOf()
     var superClass: SirType? = null
     var modality: SirClassModality = SirClassModality.UNSPECIFIED
+    var binaryName: String? = null
 
     fun build(): SirClass {
         return SirClassImpl(
@@ -33,6 +34,7 @@
             declarations,
             superClass,
             modality,
+            binaryName,
         )
     }
 
@@ -59,5 +61,6 @@
     copyBuilder.declarations.addAll(original.declarations)
     copyBuilder.superClass = original.superClass
     copyBuilder.modality = original.modality
+    copyBuilder.binaryName = original.binaryName
     return copyBuilder.apply(init).build()
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
index d08ddda..6b87c39d 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
@@ -20,6 +20,7 @@
     override val declarations: MutableList<SirDeclaration>,
     override val superClass: SirType?,
     override val modality: SirClassModality,
+    override val binaryName: String?,
 ) : SirClass() {
     override lateinit var parent: SirDeclarationParent
 }
diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
index 0e89fc7..8fa4d01 100644
--- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
+++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
@@ -95,6 +95,7 @@
 
         +field("superClass", typeType, nullable = true)
         +field("modality", modalityKind)
+        +field("binaryName", string, nullable = true)
     }
 
     val `typealias`: Element by element {
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt
index c16a902..22429ec 100644
--- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt
@@ -23,8 +23,11 @@
 import org.jetbrains.kotlin.sir.util.SirSwiftModule
 import org.jetbrains.kotlin.sir.util.isValidSwiftIdentifier
 import org.jetbrains.kotlin.sir.util.swiftName
+import org.jetbrains.kotlin.swiftexport.standalone.builders.TypeMapping
 import org.jetbrains.kotlin.swiftexport.standalone.builders.buildBridgeRequests
+import org.jetbrains.kotlin.swiftexport.standalone.builders.buildTypeMappings
 import org.jetbrains.kotlin.swiftexport.standalone.builders.createModuleWithScopeProviderFromBinary
+import org.jetbrains.kotlin.swiftexport.standalone.builders.buildRuntimeTypeMappings
 import org.jetbrains.kotlin.swiftexport.standalone.builders.initializeSirModule
 import org.jetbrains.kotlin.swiftexport.standalone.writer.*
 import org.jetbrains.kotlin.swiftexport.standalone.writer.generateBridgeSources
@@ -153,6 +156,7 @@
     val swiftApi: Path,
     val kotlinBridges: Path,
     val cHeaderBridges: Path,
+    val typeMappings: Path,
 ) : Serializable
 
 /**
@@ -227,12 +231,15 @@
 
     val bridges = generateBridgeSources(module.config.bridgeGenerator, bridgeRequests, true)
 
+    val typeMappings = (buildRuntimeTypeMappings() + buildTypeMappings(buildResult.module)).toList()
+
     return TranslationResult(
         packages = buildResult.packages,
         sirModule = buildResult.module,
         bridgeSources = bridges,
         config = module.config,
         bridgesModuleName = module.bridgesModuleName,
+        typeMappings = typeMappings,
     )
 }
 
@@ -245,6 +252,7 @@
     val bridgeSources: BridgeSources,
     val config: SwiftExportConfig,
     val bridgesModuleName: String,
+    val typeMappings: List<TypeMapping>,
 )
 
 private fun Collection<TranslationResult>.createModuleForPackages(): SirModule = buildModule {
@@ -287,12 +295,14 @@
     val outputFiles = SwiftExportFiles(
         swiftApi = (config.outputPath / sirModule.name / "${sirModule.name}.swift"),
         kotlinBridges = (config.outputPath / sirModule.name / "${sirModule.name}.kt"),
-        cHeaderBridges = (config.outputPath / sirModule.name / "${sirModule.name}.h")
+        cHeaderBridges = (config.outputPath / sirModule.name / "${sirModule.name}.h"),
+        typeMappings = (config.outputPath / sirModule.name / "${sirModule.name}.type-mappings.txt"),
     )
 
     dumpTextAtPath(
         swiftSources,
         bridgeSources,
+        typeMappings,
         outputFiles
     )
 
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeMappings.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeMappings.kt
new file mode 100644
index 0000000..bb4c3bb
--- /dev/null
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeMappings.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.swiftexport.standalone.builders
+
+import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.sir.SirClass
+import org.jetbrains.kotlin.sir.SirDeclarationContainer
+import org.jetbrains.kotlin.sir.allClasses
+import org.jetbrains.kotlin.sir.allContainers
+import org.jetbrains.kotlin.sir.providers.source.KotlinSource
+import org.jetbrains.kotlin.sir.providers.utils.KotlinRuntimeModule
+
+// Cannot be present in Kotlin identifier name: https://kotlinlang.org/spec/syntax-and-grammar.html#identifiers
+private const val KOTLIN_SWIFT_NAME_SEPARATOR = "`"
+
+internal data class TypeMapping(
+    val kotlinFqName: FqName,
+    val swiftBinaryName: String,
+) {
+    override fun toString() = "$kotlinFqName$KOTLIN_SWIFT_NAME_SEPARATOR$swiftBinaryName"
+}
+
+internal fun buildRuntimeTypeMappings(): Sequence<TypeMapping> = sequenceOf(
+    TypeMapping(FqName("kotlin.Any"), KotlinRuntimeModule.kotlinBase.binaryName!!)
+)
+
+private val SirClass.typeMapping: TypeMapping?
+    get() = (origin as? KotlinSource)?.let {
+        val kotlinFqName = (it.symbol as KaNamedClassSymbol).classId!!.asSingleFqName() // Only named classes can be exported
+        val swiftBinaryName = binaryName!! // Every exported class must have binary name
+        TypeMapping(kotlinFqName, swiftBinaryName)
+    }
+
+internal fun buildTypeMappings(container: SirDeclarationContainer): Sequence<TypeMapping> =
+    container.allClasses().mapNotNull { it.typeMapping } + container.allContainers().flatMap { buildTypeMappings(it) }
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/writer/dumpResultToFiles.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/writer/dumpResultToFiles.kt
index 601d7c7..a570170 100644
--- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/writer/dumpResultToFiles.kt
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/writer/dumpResultToFiles.kt
@@ -7,16 +7,19 @@
 
 import org.jetbrains.kotlin.sir.bridge.*
 import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportFiles
+import org.jetbrains.kotlin.swiftexport.standalone.builders.TypeMapping
 import java.io.File
 
 internal fun dumpTextAtPath(
     swift: Sequence<String>,
     bridges: BridgeSources,
+    typeMapping: List<TypeMapping>,
     output: SwiftExportFiles
 ) {
     dumpTextAtFile(bridges.ktSrc, output.kotlinBridges.toFile())
     dumpTextAtFile(bridges.cSrc, output.cHeaderBridges.toFile())
     dumpTextAtFile(swift, output.swiftApi.toFile())
+    dumpTextAtFile(typeMapping.asSequence().map { it.toString() }, output.typeMappings.toFile())
 }
 
 internal fun generateBridgeSources(
diff --git a/native/swift/swift-export-standalone/testData/any/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/any/golden_result/main/main.swift
index e2fc2e0..3fa9bfb 100644
--- a/native/swift/swift-export-standalone/testData/any/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/any/golden_result/main/main.swift
@@ -1,7 +1,7 @@
 import KotlinRuntime
 @_implementationOnly import KotlinBridges_main
 
-public final class MyObject : KotlinRuntime.KotlinBase {
+@objc(SEmain_MyObject) public final class MyObject : KotlinRuntime.KotlinBase {
     public static var shared: main.MyObject {
         get {
             return main.MyObject(__externalRCRef: __root___MyObject_get())
diff --git a/native/swift/swift-export-standalone/testData/any/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/any/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..a35fc81
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/any/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+MyObject`SEmain_MyObject
diff --git a/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.swift
index d5e0ec5..43a3a85 100644
--- a/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.swift
@@ -2,7 +2,7 @@
 import KotlinRuntime
 @_implementationOnly import KotlinBridges_main
 
-public final class CLASS_WITH_SAME_NAME : KotlinRuntime.KotlinBase {
+@objc(SEmain_CLASS_WITH_SAME_NAME) public final class CLASS_WITH_SAME_NAME : KotlinRuntime.KotlinBase {
     public override init() {
         let __kt = __root___CLASS_WITH_SAME_NAME_init_allocate()
         super.init(__externalRCRef: __kt)
@@ -17,7 +17,7 @@
         return CLASS_WITH_SAME_NAME_foo(self.__externalRCRef())
     }
 }
-public final class ClassWithNonPublicConstructor : KotlinRuntime.KotlinBase {
+@objc(SEmain_ClassWithNonPublicConstructor) public final class ClassWithNonPublicConstructor : KotlinRuntime.KotlinBase {
     public var a: Swift.Int32 {
         get {
             return ClassWithNonPublicConstructor_a_get(self.__externalRCRef())
@@ -29,8 +29,8 @@
         super.init(__externalRCRef: __externalRCRef)
     }
 }
-public final class Foo : KotlinRuntime.KotlinBase {
-    public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_Foo) public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Foo_INSIDE_CLASS) public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
         public var my_value_inner: Swift.UInt32 {
             get {
                 return Foo_INSIDE_CLASS_my_value_inner_get(self.__externalRCRef())
@@ -94,9 +94,9 @@
         return Foo_foo(self.__externalRCRef())
     }
 }
-public final class OBJECT_NO_PACKAGE : KotlinRuntime.KotlinBase {
-    public final class Bar : KotlinRuntime.KotlinBase {
-        public final class CLASS_INSIDE_CLASS_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
+@objc(SEmain_OBJECT_NO_PACKAGE) public final class OBJECT_NO_PACKAGE : KotlinRuntime.KotlinBase {
+    @objc(SEmain_OBJECT_NO_PACKAGE_Bar) public final class Bar : KotlinRuntime.KotlinBase {
+        @objc(SEmain_OBJECT_NO_PACKAGE_Bar_CLASS_INSIDE_CLASS_INSIDE_OBJECT) public final class CLASS_INSIDE_CLASS_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
             public override init() {
                 let __kt = OBJECT_NO_PACKAGE_Bar_CLASS_INSIDE_CLASS_INSIDE_OBJECT_init_allocate()
                 super.init(__externalRCRef: __kt)
@@ -129,7 +129,7 @@
             return OBJECT_NO_PACKAGE_Bar_bar(self.__externalRCRef())
         }
     }
-    public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEmain_OBJECT_NO_PACKAGE_Foo) public final class Foo : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = OBJECT_NO_PACKAGE_Foo_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -141,7 +141,7 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class OBJECT_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
+    @objc(SEmain_OBJECT_NO_PACKAGE_OBJECT_INSIDE_OBJECT) public final class OBJECT_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
         public static var shared: main.OBJECT_NO_PACKAGE.OBJECT_INSIDE_OBJECT {
             get {
                 return main.OBJECT_NO_PACKAGE.OBJECT_INSIDE_OBJECT(__externalRCRef: OBJECT_NO_PACKAGE_OBJECT_INSIDE_OBJECT_get())
@@ -186,7 +186,7 @@
         return OBJECT_NO_PACKAGE_foo(self.__externalRCRef())
     }
 }
-open class OPEN_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_OPEN_CLASS) open class OPEN_CLASS : KotlinRuntime.KotlinBase {
     public override init() {
         let __kt = __root___OPEN_CLASS_init_allocate()
         super.init(__externalRCRef: __kt)
@@ -199,7 +199,7 @@
     }
 }
 public extension ExportedKotlinPackages.namespace.deeper {
-    public final class DATA_OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_DATA_OBJECT_WITH_PACKAGE) public final class DATA_OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
         public static var shared: ExportedKotlinPackages.namespace.deeper.DATA_OBJECT_WITH_PACKAGE {
             get {
                 return ExportedKotlinPackages.namespace.deeper.DATA_OBJECT_WITH_PACKAGE(__externalRCRef: namespace_deeper_DATA_OBJECT_WITH_PACKAGE_get())
@@ -236,9 +236,9 @@
             return namespace_deeper_DATA_OBJECT_WITH_PACKAGE_toString(self.__externalRCRef())
         }
     }
-    public final class Foo : KotlinRuntime.KotlinBase {
-        public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
-            public final class DEEPER_INSIDE_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_Foo) public final class Foo : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_Foo_INSIDE_CLASS) public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
+            @objc(SEExportedKotlinPackages_namespace_deeper_Foo_INSIDE_CLASS_DEEPER_INSIDE_CLASS) public final class DEEPER_INSIDE_CLASS : KotlinRuntime.KotlinBase {
                 public var my_value: Swift.UInt32 {
                     get {
                         return namespace_deeper_Foo_INSIDE_CLASS_DEEPER_INSIDE_CLASS_my_value_get(self.__externalRCRef())
@@ -320,7 +320,7 @@
             return namespace_deeper_Foo_foo(self.__externalRCRef())
         }
     }
-    public final class NAMESPACED_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_NAMESPACED_CLASS) public final class NAMESPACED_CLASS : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = namespace_deeper_NAMESPACED_CLASS_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -332,9 +332,9 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
-        public final class Bar : KotlinRuntime.KotlinBase {
-            public final class OBJECT_INSIDE_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE) public final class OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Bar) public final class Bar : KotlinRuntime.KotlinBase {
+            @objc(SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Bar_OBJECT_INSIDE_CLASS) public final class OBJECT_INSIDE_CLASS : KotlinRuntime.KotlinBase {
                 public static var shared: ExportedKotlinPackages.namespace.deeper.OBJECT_WITH_PACKAGE.Bar.OBJECT_INSIDE_CLASS {
                     get {
                         return ExportedKotlinPackages.namespace.deeper.OBJECT_WITH_PACKAGE.Bar.OBJECT_INSIDE_CLASS(__externalRCRef: namespace_deeper_OBJECT_WITH_PACKAGE_Bar_OBJECT_INSIDE_CLASS_get())
@@ -370,7 +370,7 @@
                 return namespace_deeper_OBJECT_WITH_PACKAGE_Bar_bar(self.__externalRCRef())
             }
         }
-        public final class Foo : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Foo) public final class Foo : KotlinRuntime.KotlinBase {
             public override init() {
                 let __kt = namespace_deeper_OBJECT_WITH_PACKAGE_Foo_init_allocate()
                 super.init(__externalRCRef: __kt)
@@ -382,7 +382,7 @@
                 super.init(__externalRCRef: __externalRCRef)
             }
         }
-        public final class OBJECT_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_OBJECT_INSIDE_OBJECT) public final class OBJECT_INSIDE_OBJECT : KotlinRuntime.KotlinBase {
             public static var shared: ExportedKotlinPackages.namespace.deeper.OBJECT_WITH_PACKAGE.OBJECT_INSIDE_OBJECT {
                 get {
                     return ExportedKotlinPackages.namespace.deeper.OBJECT_WITH_PACKAGE.OBJECT_INSIDE_OBJECT(__externalRCRef: namespace_deeper_OBJECT_WITH_PACKAGE_OBJECT_INSIDE_OBJECT_get())
@@ -429,8 +429,8 @@
     }
 }
 public extension ExportedKotlinPackages.namespace {
-    public final class Foo : KotlinRuntime.KotlinBase {
-        public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_Foo) public final class Foo : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_Foo_INSIDE_CLASS) public final class INSIDE_CLASS : KotlinRuntime.KotlinBase {
             public override init() {
                 let __kt = namespace_Foo_INSIDE_CLASS_init_allocate()
                 super.init(__externalRCRef: __kt)
@@ -469,7 +469,7 @@
             return namespace_Foo_foo(self.__externalRCRef())
         }
     }
-    public final class NAMESPACED_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_NAMESPACED_CLASS) public final class NAMESPACED_CLASS : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = namespace_NAMESPACED_CLASS_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -483,7 +483,7 @@
     }
 }
 public extension ExportedKotlinPackages.why_we_need_module_names {
-    public final class CLASS_WITH_SAME_NAME : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_why_we_need_module_names_CLASS_WITH_SAME_NAME) public final class CLASS_WITH_SAME_NAME : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = why_we_need_module_names_CLASS_WITH_SAME_NAME_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..4c16c43
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/classes/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,25 @@
+kotlin.Any`KotlinBase
+ClassWithNonPublicConstructor`SEmain_ClassWithNonPublicConstructor
+Foo`SEmain_Foo
+CLASS_WITH_SAME_NAME`SEmain_CLASS_WITH_SAME_NAME
+OPEN_CLASS`SEmain_OPEN_CLASS
+OBJECT_NO_PACKAGE`SEmain_OBJECT_NO_PACKAGE
+why_we_need_module_names.CLASS_WITH_SAME_NAME`SEExportedKotlinPackages_why_we_need_module_names_CLASS_WITH_SAME_NAME
+Foo.INSIDE_CLASS`SEmain_Foo_INSIDE_CLASS
+OBJECT_NO_PACKAGE.Foo`SEmain_OBJECT_NO_PACKAGE_Foo
+OBJECT_NO_PACKAGE.Bar`SEmain_OBJECT_NO_PACKAGE_Bar
+OBJECT_NO_PACKAGE.OBJECT_INSIDE_OBJECT`SEmain_OBJECT_NO_PACKAGE_OBJECT_INSIDE_OBJECT
+OBJECT_NO_PACKAGE.Bar.CLASS_INSIDE_CLASS_INSIDE_OBJECT`SEmain_OBJECT_NO_PACKAGE_Bar_CLASS_INSIDE_CLASS_INSIDE_OBJECT
+namespace.NAMESPACED_CLASS`SEExportedKotlinPackages_namespace_NAMESPACED_CLASS
+namespace.Foo`SEExportedKotlinPackages_namespace_Foo
+namespace.Foo.INSIDE_CLASS`SEExportedKotlinPackages_namespace_Foo_INSIDE_CLASS
+namespace.deeper.NAMESPACED_CLASS`SEExportedKotlinPackages_namespace_deeper_NAMESPACED_CLASS
+namespace.deeper.Foo`SEExportedKotlinPackages_namespace_deeper_Foo
+namespace.deeper.OBJECT_WITH_PACKAGE`SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE
+namespace.deeper.DATA_OBJECT_WITH_PACKAGE`SEExportedKotlinPackages_namespace_deeper_DATA_OBJECT_WITH_PACKAGE
+namespace.deeper.Foo.INSIDE_CLASS`SEExportedKotlinPackages_namespace_deeper_Foo_INSIDE_CLASS
+namespace.deeper.Foo.INSIDE_CLASS.DEEPER_INSIDE_CLASS`SEExportedKotlinPackages_namespace_deeper_Foo_INSIDE_CLASS_DEEPER_INSIDE_CLASS
+namespace.deeper.OBJECT_WITH_PACKAGE.Foo`SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Foo
+namespace.deeper.OBJECT_WITH_PACKAGE.Bar`SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Bar
+namespace.deeper.OBJECT_WITH_PACKAGE.OBJECT_INSIDE_OBJECT`SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_OBJECT_INSIDE_OBJECT
+namespace.deeper.OBJECT_WITH_PACKAGE.Bar.OBJECT_INSIDE_CLASS`SEExportedKotlinPackages_namespace_deeper_OBJECT_WITH_PACKAGE_Bar_OBJECT_INSIDE_CLASS
diff --git a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.swift b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.swift
index 3774cc0..3045ade 100644
--- a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.swift
+++ b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.swift
@@ -3,7 +3,7 @@
 import KotlinRuntime
 
 public extension ExportedKotlinPackages.dependency.four {
-    public final class AnotherBar : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_dependency_four_AnotherBar) public final class AnotherBar : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = dependency_four_AnotherBar_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.type-mappings.txt b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.type-mappings.txt
new file mode 100644
index 0000000..aa2811f
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+dependency.four.AnotherBar`SEExportedKotlinPackages_dependency_four_AnotherBar
diff --git a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_one/main_one.type-mappings.txt b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_one/main_one.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_one/main_one.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_three/main_three.type-mappings.txt b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_three/main_three.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_three/main_three.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_two/main_two.type-mappings.txt b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_two/main_two.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/consuming_dependencies/golden_result/main_two/main_two.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/functions/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/functions/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/functions/golden_result/main/main.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.swift
index 9f502f1..43c5ad6 100644
--- a/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.swift
@@ -1,7 +1,7 @@
 @_implementationOnly import KotlinBridges_main
 import KotlinRuntime
 
-open class Foo : KotlinRuntime.KotlinBase {
+@objc(SEmain_Foo) open class Foo : KotlinRuntime.KotlinBase {
     public override init() {
         let __kt = __root___Foo_init_allocate()
         super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..1af432e
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/inheritance/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+Foo`SEmain_Foo
diff --git a/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.swift
index 29bc87e..97f76ee 100644
--- a/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.swift
@@ -1,7 +1,7 @@
 @_implementationOnly import KotlinBridges_main
 import KotlinRuntime
 
-public final class Outer : KotlinRuntime.KotlinBase {
+@objc(SEmain_Outer) public final class Outer : KotlinRuntime.KotlinBase {
     public override init() {
         let __kt = __root___Outer_init_allocate()
         super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..e3ec2df
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/inner_classes/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+Outer`SEmain_Outer
diff --git a/native/swift/swift-export-standalone/testData/no_package/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/no_package/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/no_package/golden_result/main/main.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.swift
index 53fb758..ceb801b 100644
--- a/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.swift
@@ -2,7 +2,7 @@
 import KotlinRuntime
 
 public typealias Foo = Swift.Never
-public final class Bar : KotlinRuntime.KotlinBase {
+@objc(SEmain_Bar) public final class Bar : KotlinRuntime.KotlinBase {
     public var p: Swift.Never {
         get {
             return Bar_p_get(self.__externalRCRef())
diff --git a/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..cb6f062
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/nothing_type/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+Bar`SEmain_Bar
diff --git a/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.swift
index d82bdd8..d0f1078 100644
--- a/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.swift
@@ -31,7 +31,7 @@
 }
 public extension ExportedKotlinPackages.org.kotlin.foo {
     public typealias Typealias = Swift.Int32
-    public final class Clazz : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_org_kotlin_foo_Clazz) public final class Clazz : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = org_kotlin_foo_Clazz_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..aa9f942
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/package_flattening/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+org.kotlin.foo.Clazz`SEExportedKotlinPackages_org_kotlin_foo_Clazz
diff --git a/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.swift
index 21c239b..a97ad09 100644
--- a/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.swift
@@ -3,7 +3,7 @@
 import KotlinRuntime
 
 public extension ExportedKotlinPackages.org.kotlin {
-    public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_org_kotlin_Foo) public final class Foo : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = org_kotlin_Foo_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..abf9e6d
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/package_flattening_invalid_target/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+org.kotlin.Foo`SEExportedKotlinPackages_org_kotlin_Foo
diff --git a/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.swift
index 21c239b..a97ad09 100644
--- a/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.swift
@@ -3,7 +3,7 @@
 import KotlinRuntime
 
 public extension ExportedKotlinPackages.org.kotlin {
-    public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_org_kotlin_Foo) public final class Foo : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = org_kotlin_Foo_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..abf9e6d
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/package_flattening_missing_target/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+org.kotlin.Foo`SEExportedKotlinPackages_org_kotlin_Foo
diff --git a/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.swift
index 7b08fe9..5308b9d 100644
--- a/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.swift
@@ -30,7 +30,7 @@
 }
 public extension main.org.kotlin.foo {
     public typealias Typealias = Swift.Int32
-    public final class Clazz : KotlinRuntime.KotlinBase {
+    @objc(SEmain_org_kotlin_foo_Clazz) public final class Clazz : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = org_kotlin_foo_Clazz_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..4e75ea0
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,2 @@
+kotlin.Any`KotlinBase
+org.kotlin.foo.Clazz`SEmain_org_kotlin_foo_Clazz
diff --git a/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main2/main2.type-mappings.txt b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main2/main2.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/single_module_production/golden_result/main2/main2.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/strings/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/strings/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/strings/golden_result/main/main.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.swift
index 0828511..1f6afc3 100644
--- a/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.swift
@@ -2,8 +2,8 @@
 import KotlinRuntime
 @_implementationOnly import KotlinBridges_main
 
-public final class Class_without_package : KotlinRuntime.KotlinBase {
-    public final class INNER_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_Class_without_package) public final class Class_without_package : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Class_without_package_INNER_CLASS) public final class INNER_CLASS : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = Class_without_package_INNER_CLASS_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -15,7 +15,7 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Class_without_package_INNER_OBJECT) public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
         public static var shared: main.Class_without_package.INNER_OBJECT {
             get {
                 return main.Class_without_package.INNER_OBJECT(__externalRCRef: Class_without_package_INNER_OBJECT_get())
@@ -41,8 +41,8 @@
         super.init(__externalRCRef: __externalRCRef)
     }
 }
-public final class Demo : KotlinRuntime.KotlinBase {
-    public final class INNER_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_Demo) public final class Demo : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Demo_INNER_CLASS) public final class INNER_CLASS : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = Demo_INNER_CLASS_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -54,7 +54,7 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Demo_INNER_OBJECT) public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
         public static var shared: main.Demo.INNER_OBJECT {
             get {
                 return main.Demo.INNER_OBJECT(__externalRCRef: Demo_INNER_OBJECT_get())
@@ -161,7 +161,7 @@
         return main.Demo.INNER_OBJECT(__externalRCRef: Demo_combine_inner_objects__TypesOfArguments__uintptr_t_uintptr_t_uintptr_t_uintptr_t__(self.__externalRCRef(), arg1.__externalRCRef(), arg2.__externalRCRef(), arg3.__externalRCRef(), arg4.__externalRCRef()))
     }
 }
-open class OPEN_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_OPEN_CLASS) open class OPEN_CLASS : KotlinRuntime.KotlinBase {
     public override init() {
         let __kt = __root___OPEN_CLASS_init_allocate()
         super.init(__externalRCRef: __kt)
@@ -173,8 +173,8 @@
         super.init(__externalRCRef: __externalRCRef)
     }
 }
-public final class Object_without_package : KotlinRuntime.KotlinBase {
-    public final class INNER_CLASS : KotlinRuntime.KotlinBase {
+@objc(SEmain_Object_without_package) public final class Object_without_package : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Object_without_package_INNER_CLASS) public final class INNER_CLASS : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = Object_without_package_INNER_CLASS_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -186,7 +186,7 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Object_without_package_INNER_OBJECT) public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
         public static var shared: main.Object_without_package.INNER_OBJECT {
             get {
                 return main.Object_without_package.INNER_OBJECT(__externalRCRef: Object_without_package_INNER_OBJECT_get())
@@ -324,8 +324,8 @@
     return __root___recieve_object_wp__TypesOfArguments__uintptr_t__(arg.__externalRCRef())
 }
 public extension ExportedKotlinPackages.namespace.deeper {
-    public final class Class_with_package : KotlinRuntime.KotlinBase {
-        public final class INNER_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_Class_with_package) public final class Class_with_package : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_Class_with_package_INNER_CLASS) public final class INNER_CLASS : KotlinRuntime.KotlinBase {
             public override init() {
                 let __kt = namespace_deeper_Class_with_package_INNER_CLASS_init_allocate()
                 super.init(__externalRCRef: __kt)
@@ -337,7 +337,7 @@
                 super.init(__externalRCRef: __externalRCRef)
             }
         }
-        public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_Class_with_package_INNER_OBJECT) public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
             public static var shared: ExportedKotlinPackages.namespace.deeper.Class_with_package.INNER_OBJECT {
                 get {
                     return ExportedKotlinPackages.namespace.deeper.Class_with_package.INNER_OBJECT(__externalRCRef: namespace_deeper_Class_with_package_INNER_OBJECT_get())
@@ -363,7 +363,7 @@
             super.init(__externalRCRef: __externalRCRef)
         }
     }
-    public final class DATA_OBJECT : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_DATA_OBJECT) public final class DATA_OBJECT : KotlinRuntime.KotlinBase {
         public var a: Swift.Int32 {
             get {
                 return namespace_deeper_DATA_OBJECT_a_get(self.__externalRCRef())
@@ -389,8 +389,8 @@
             return namespace_deeper_DATA_OBJECT_toString(self.__externalRCRef())
         }
     }
-    public final class Object_with_package : KotlinRuntime.KotlinBase {
-        public final class INNER_CLASS : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_namespace_deeper_Object_with_package) public final class Object_with_package : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_Object_with_package_INNER_CLASS) public final class INNER_CLASS : KotlinRuntime.KotlinBase {
             public override init() {
                 let __kt = namespace_deeper_Object_with_package_INNER_CLASS_init_allocate()
                 super.init(__externalRCRef: __kt)
@@ -402,7 +402,7 @@
                 super.init(__externalRCRef: __externalRCRef)
             }
         }
-        public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
+        @objc(SEExportedKotlinPackages_namespace_deeper_Object_with_package_INNER_OBJECT) public final class INNER_OBJECT : KotlinRuntime.KotlinBase {
             public static var shared: ExportedKotlinPackages.namespace.deeper.Object_with_package.INNER_OBJECT {
                 get {
                     return ExportedKotlinPackages.namespace.deeper.Object_with_package.INNER_OBJECT(__externalRCRef: namespace_deeper_Object_with_package_INNER_OBJECT_get())
diff --git a/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..de80b26
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/type_reference/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,18 @@
+kotlin.Any`KotlinBase
+OPEN_CLASS`SEmain_OPEN_CLASS
+Demo`SEmain_Demo
+Class_without_package`SEmain_Class_without_package
+Object_without_package`SEmain_Object_without_package
+Demo.INNER_CLASS`SEmain_Demo_INNER_CLASS
+Demo.INNER_OBJECT`SEmain_Demo_INNER_OBJECT
+Class_without_package.INNER_CLASS`SEmain_Class_without_package_INNER_CLASS
+Class_without_package.INNER_OBJECT`SEmain_Class_without_package_INNER_OBJECT
+Object_without_package.INNER_CLASS`SEmain_Object_without_package_INNER_CLASS
+Object_without_package.INNER_OBJECT`SEmain_Object_without_package_INNER_OBJECT
+namespace.deeper.Class_with_package`SEExportedKotlinPackages_namespace_deeper_Class_with_package
+namespace.deeper.Object_with_package`SEExportedKotlinPackages_namespace_deeper_Object_with_package
+namespace.deeper.DATA_OBJECT`SEExportedKotlinPackages_namespace_deeper_DATA_OBJECT
+namespace.deeper.Class_with_package.INNER_CLASS`SEExportedKotlinPackages_namespace_deeper_Class_with_package_INNER_CLASS
+namespace.deeper.Class_with_package.INNER_OBJECT`SEExportedKotlinPackages_namespace_deeper_Class_with_package_INNER_OBJECT
+namespace.deeper.Object_with_package.INNER_CLASS`SEExportedKotlinPackages_namespace_deeper_Object_with_package_INNER_CLASS
+namespace.deeper.Object_with_package.INNER_OBJECT`SEExportedKotlinPackages_namespace_deeper_Object_with_package_INNER_OBJECT
diff --git a/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.swift
index 79d1c4f..ea89a3f 100644
--- a/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.swift
@@ -7,7 +7,7 @@
 public typealias ShouldHaveNoAnnotation = Swift.Int32
 public typealias dataObjectWithPackage = main.DATA_OBJECT_WITH_PACKAGE
 public typealias never = Swift.Never
-public final class DATA_OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
+@objc(SEmain_DATA_OBJECT_WITH_PACKAGE) public final class DATA_OBJECT_WITH_PACKAGE : KotlinRuntime.KotlinBase {
     public static var shared: main.DATA_OBJECT_WITH_PACKAGE {
         get {
             return main.DATA_OBJECT_WITH_PACKAGE(__externalRCRef: __root___DATA_OBJECT_WITH_PACKAGE_get())
@@ -52,7 +52,7 @@
 public extension ExportedKotlinPackages.typealiases.inner {
     public typealias Foo = ExportedKotlinPackages.typealiases.Foo
     public typealias LargeInteger = Swift.Int64
-    public final class Bar : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_typealiases_inner_Bar) public final class Bar : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = typealiases_inner_Bar_init_allocate()
             super.init(__externalRCRef: __kt)
@@ -68,7 +68,7 @@
 public extension ExportedKotlinPackages.typealiases {
     public typealias Bar = ExportedKotlinPackages.typealiases.inner.Bar
     public typealias SmallInteger = Swift.Int16
-    public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEExportedKotlinPackages_typealiases_Foo) public final class Foo : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = typealiases_Foo_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..6a971cb
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/typealiases/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,4 @@
+kotlin.Any`KotlinBase
+DATA_OBJECT_WITH_PACKAGE`SEmain_DATA_OBJECT_WITH_PACKAGE
+typealiases.Foo`SEExportedKotlinPackages_typealiases_Foo
+typealiases.inner.Bar`SEExportedKotlinPackages_typealiases_inner_Bar
diff --git a/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.swift b/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.swift
index 63976ac..0c4c20d 100644
--- a/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.swift
@@ -1,8 +1,8 @@
 @_implementationOnly import KotlinBridges_main
 import KotlinRuntime
 
-public final class Foo : KotlinRuntime.KotlinBase {
-    public final class Nested : KotlinRuntime.KotlinBase {
+@objc(SEmain_Foo) public final class Foo : KotlinRuntime.KotlinBase {
+    @objc(SEmain_Foo_Nested) public final class Nested : KotlinRuntime.KotlinBase {
         public override init() {
             let __kt = Foo_Nested_init_allocate()
             super.init(__externalRCRef: __kt)
diff --git a/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..097adb0
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/unsupportedDeclarationsReporting/golden_result/main/main.type-mappings.txt
@@ -0,0 +1,3 @@
+kotlin.Any`KotlinBase
+Foo`SEmain_Foo
+Foo.Nested`SEmain_Foo_Nested
diff --git a/native/swift/swift-export-standalone/testData/variables/golden_result/main/main.type-mappings.txt b/native/swift/swift-export-standalone/testData/variables/golden_result/main/main.type-mappings.txt
new file mode 100644
index 0000000..b310d17
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/variables/golden_result/main/main.type-mappings.txt
@@ -0,0 +1 @@
+kotlin.Any`KotlinBase
diff --git a/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractSwiftRunnerTest.kt b/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractSwiftRunnerTest.kt
index abccc63..c68e547 100644
--- a/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractSwiftRunnerTest.kt
+++ b/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractSwiftRunnerTest.kt
@@ -39,10 +39,12 @@
                     val expectedSwift = expectedFiles / it.name / "${it.name}.swift"
                     val expectedCHeader = expectedFiles / it.name / "${it.name}.h"
                     val expectedKotlinBridge = expectedFiles / it.name / "${it.name}.kt"
+                    val expectedTypeMappings = expectedFiles / it.name / "${it.name}.type-mappings.txt"
 
                     KotlinTestUtils.assertEqualsToFile(expectedSwift, files.swiftApi.readText())
                     KotlinTestUtils.assertEqualsToFile(expectedCHeader, files.cHeaderBridges.readText())
                     KotlinTestUtils.assertEqualsToFile(expectedKotlinBridge, files.kotlinBridges.readText())
+                    KotlinTestUtils.assertEqualsToFile(expectedTypeMappings, files.typeMappings.readText())
                 }
                 is SwiftExportModule.SwiftOnly -> {
                     val expectedFiles = testPathFull.toPath() / "golden_result/"