[Swift Export] Add TypeBindingBridge with Kotlin<->Swift type mapping.

^KT-70678
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
index b8a606c..a5cfd30 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
@@ -69,6 +69,25 @@
 )
 
 /**
+ * A mapping from Kotlin class to a corresponding [Swift class][sirClass].
+ */
+public class TypeBindingBridgeRequest(
+    public val sirClass: SirClass,
+) : BridgeRequest
+
+/**
+ * Bridge that implements mapping from Kotlin type name to Swift type name.
+ *
+ * @see TypeBindingBridgeRequest
+ */
+public class TypeBindingBridge(
+    /**
+     * File-level annotation to be placed on the generated Kotlin bridge.
+     */
+    public val kotlinFileAnnotation: String,
+) : GeneratedBridge
+
+/**
  * Generates various [GeneratedBridge]s given various [BridgeRequest]s
  */
 public interface BridgeGenerator {
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/StableBridgeRequestComparator.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/StableBridgeRequestComparator.kt
index 1a34c2e..b19df84 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/StableBridgeRequestComparator.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/StableBridgeRequestComparator.kt
@@ -5,6 +5,8 @@
 
 package org.jetbrains.kotlin.sir.bridge
 
+import org.jetbrains.kotlin.sir.util.swiftFqName
+
 public object StableBridgeRequestComparator : Comparator<BridgeRequest> {
     override fun compare(
         lhs: BridgeRequest,
@@ -13,6 +15,13 @@
         is FunctionBridgeRequest -> {
             when (rhs) {
                 is FunctionBridgeRequest -> lhs.bridgeName.compareTo(rhs.bridgeName)
+                is TypeBindingBridgeRequest -> 1
+            }
+        }
+        is TypeBindingBridgeRequest -> {
+            when (rhs) {
+                is FunctionBridgeRequest -> -1
+                is TypeBindingBridgeRequest -> lhs.sirClass.swiftFqName.compareTo(rhs.sirClass.swiftFqName)
             }
         }
     }
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
index 2d7e50e6..b40815a 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
@@ -7,6 +7,7 @@
 
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.bridge.*
+import org.jetbrains.kotlin.sir.mangler.mangledNameOrNull
 import org.jetbrains.kotlin.sir.util.*
 
 private const val exportAnnotationFqName = "kotlin.native.internal.ExportedBridge"
@@ -17,6 +18,7 @@
 internal class BridgeGeneratorImpl(private val typeNamer: SirTypeNamer) : BridgeGenerator {
     override fun generateBridges(request: BridgeRequest): List<GeneratedBridge> = when (request) {
         is FunctionBridgeRequest -> generateFunctionBridges(request)
+        is TypeBindingBridgeRequest -> listOf(generateTypeBindingBridge(request))
     }
 
     private fun generateFunctionBridges(request: FunctionBridgeRequest) = buildList {
@@ -71,6 +73,18 @@
             }
         }
     })
+
+    private fun generateTypeBindingBridge(request: TypeBindingBridgeRequest): TypeBindingBridge {
+        val annotationName = "kotlin.native.internal.objc.BindClassToObjCName"
+        val kotlinType = typeNamer.kotlinFqName(SirNominalType(request.sirClass))
+        val swiftName = request.sirClass.mangledNameOrNull
+        requireNotNull(swiftName) {
+            "Cannot mangle name for Swift class exported from `$kotlinType`"
+        }
+        return TypeBindingBridge(
+            kotlinFileAnnotation = "$annotationName($kotlinType::class, \"$swiftName\")"
+        )
+    }
 }
 
 private class BridgeFunctionDescriptor(
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/CHeaderGenerator.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/CHeaderGenerator.kt
index b21bfa3..0b5928fb 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/CHeaderGenerator.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/CHeaderGenerator.kt
@@ -8,6 +8,7 @@
 import org.jetbrains.kotlin.sir.bridge.BridgePrinter
 import org.jetbrains.kotlin.sir.bridge.FunctionBridge
 import org.jetbrains.kotlin.sir.bridge.GeneratedBridge
+import org.jetbrains.kotlin.sir.bridge.TypeBindingBridge
 
 internal class CBridgePrinter : BridgePrinter {
 
@@ -18,6 +19,7 @@
     override fun add(bridge: GeneratedBridge) {
         when (bridge) {
             is FunctionBridge -> add(bridge)
+            is TypeBindingBridge -> Unit
         }
     }
 
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/KotlinFileGenerator.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/KotlinFileGenerator.kt
index 1cab91c..3f1ba21 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/KotlinFileGenerator.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/KotlinFileGenerator.kt
@@ -8,15 +8,18 @@
 import org.jetbrains.kotlin.sir.bridge.BridgePrinter
 import org.jetbrains.kotlin.sir.bridge.FunctionBridge
 import org.jetbrains.kotlin.sir.bridge.GeneratedBridge
+import org.jetbrains.kotlin.sir.bridge.TypeBindingBridge
 
 internal class KotlinBridgePrinter : BridgePrinter {
 
     private val imports = mutableSetOf<String>()
     private val functions = mutableSetOf<List<String>>()
+    private val fileLevelAnnotations = mutableSetOf<String>()
 
     override fun add(bridge: GeneratedBridge) {
         when (bridge) {
             is FunctionBridge -> add(bridge)
+            is TypeBindingBridge -> add(bridge)
         }
     }
 
@@ -25,7 +28,17 @@
         imports += bridge.kotlinFunctionBridge.packageDependencies
     }
 
+    private fun add(bridge: TypeBindingBridge) {
+        fileLevelAnnotations += bridge.kotlinFileAnnotation
+    }
+
     override fun print(): Sequence<String> = sequence {
+        if (fileLevelAnnotations.isNotEmpty()) {
+            fileLevelAnnotations.forEach {
+                yield("@file:$it")
+            }
+            yield("")
+        }
         if (imports.isNotEmpty()) {
             imports.forEach {
                 yield("import $it")
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildBridgeRequests.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildBridgeRequests.kt
index 48f4fe1..b514f0c 100644
--- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildBridgeRequests.kt
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildBridgeRequests.kt
@@ -29,6 +29,11 @@
     )
     addAll(
         container
+            .allClasses()
+            .flatMap { it.constructTypeBindingBridgeRequests(generator) }
+    )
+    addAll(
+        container
             .allContainers()
             .flatMap { buildBridgeRequests(generator, it) }
     )
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeBindingBridges.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeBindingBridges.kt
new file mode 100644
index 0000000..c630168
--- /dev/null
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildTypeBindingBridges.kt
@@ -0,0 +1,19 @@
+/*
+ * 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.sir.SirClass
+import org.jetbrains.kotlin.sir.bridge.BridgeGenerator
+import org.jetbrains.kotlin.sir.bridge.TypeBindingBridgeRequest
+import org.jetbrains.kotlin.sir.providers.source.KotlinSource
+
+internal fun SirClass.constructTypeBindingBridgeRequests(generator: BridgeGenerator): List<TypeBindingBridgeRequest> {
+    // `SirClass` must be generated from Kotlin sources, and be a named class.
+    (origin as? KotlinSource)?.symbol as? KaNamedClassSymbol ?: return emptyList()
+
+    return listOf(TypeBindingBridgeRequest(this))
+}
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.kt b/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.kt
new file mode 100644
index 0000000..567664c
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.kt
@@ -0,0 +1,26 @@
+// KIND: STANDALONE
+// FREE_COMPILER_ARGS: -opt-in=kotlin.native.internal.InternalForKotlinNative
+// MODULE: ClassMappings
+// FILE: classes.kt
+import kotlin.native.internal.reflect.objCNameOrNull
+
+class FinalClass {
+    class NestedFinalClass
+}
+open class OpenClass
+private class PrivateClass : OpenClass()
+
+fun getAnyClassName(): String? = Any::class.objCNameOrNull
+fun getFinalClassName(): String? = FinalClass::class.objCNameOrNull
+fun getNestedFinalClassName(): String? = FinalClass.NestedFinalClass::class.objCNameOrNull
+fun getOpenClassName(): String? = OpenClass::class.objCNameOrNull
+fun getPrivateClassName(): String? = PrivateClass::class.objCNameOrNull
+
+// FILE: classes_in_namespace.kt
+package namespace
+
+import kotlin.native.internal.reflect.objCNameOrNull
+
+class NamespacedFinalClass
+
+fun getNamespacedFinalClassName(): String? = NamespacedFinalClass::class.objCNameOrNull
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.swift b/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.swift
new file mode 100644
index 0000000..c9f69c3
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/execution/classMappings/classMappings.swift
@@ -0,0 +1,56 @@
+import ClassMappings
+import KotlinRuntime
+import ObjectiveC
+
+enum TestTypeError: Error {
+    case classNotBound(Any.Type)
+    case classNotFound(String)
+    case classWrongType(actual: Any, expected: Any.Type)
+}
+
+func testType<T: KotlinBase>(_ optionalName: String?, _ type: T.Type) throws {
+    guard let name = optionalName else { throw TestTypeError.classNotBound(type) }
+    guard let objcClass = objc_getClass(name) else { throw TestTypeError.classNotFound(name) }
+    guard let swiftClass = objcClass as? T.Type else { throw TestTypeError.classWrongType(actual: objcClass, expected: type) }
+    try assertSame(actual: swiftClass, expected: type)
+}
+
+func testAnyClass() throws {
+    try testType(getAnyClassName(), KotlinBase.self)
+}
+
+func testFinalClass() throws {
+    try testType(getFinalClassName(), FinalClass.self)
+}
+
+func testNestedFinalClass() throws {
+    try testType(getNestedFinalClassName(), FinalClass.NestedFinalClass.self)
+}
+
+func testNamespacedFinalClass() throws {
+    try testType(namespace.getNamespacedFinalClassName(), namespace.NamespacedFinalClass.self)
+}
+
+func testOpenClass() throws {
+    try testType(getOpenClassName(), OpenClass.self)
+}
+
+func testPrivateClass() throws {
+    try assertNil(getPrivateClassName())
+}
+
+class ClassMappingsTests : TestProvider {
+    var tests: [TestCase] = []
+
+    init() {
+        providers.append(self)
+        tests = [
+            TestCase(name: "testAnyClass", method: withAutorelease(testAnyClass)),
+            TestCase(name: "testFinalClass", method: withAutorelease(testFinalClass)),
+            TestCase(name: "testNestedFinalClass", method: withAutorelease(testNestedFinalClass)),
+            TestCase(name: "testNamespacedFinalClass", method: withAutorelease(testNamespacedFinalClass)),
+            TestCase(name: "testOpenClass", method: withAutorelease(testOpenClass)),
+            TestCase(name: "testPrivateClass", method: withAutorelease(testPrivateClass)),
+        ]
+    }
+}
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone/testData/generation/any/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/any/golden_result/main/main.kt
index 64c4816..34f8516 100644
--- a/native/swift/swift-export-standalone/testData/generation/any/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/any/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(MyObject::class, "4main8MyObjectC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/cross_module_inheritance/cross_module_inheritance.kt b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/cross_module_inheritance/cross_module_inheritance.kt
index afc147a..6f3b958 100644
--- a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/cross_module_inheritance/cross_module_inheritance.kt
+++ b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/cross_module_inheritance/cross_module_inheritance.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(CLASS_ACROSS_MODULES::class, "24cross_module_inheritance20CLASS_ACROSS_MODULESC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/inheritance/inheritance.kt b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/inheritance/inheritance.kt
index a59cd78..a3749c2 100644
--- a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/inheritance/inheritance.kt
+++ b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/inheritance/inheritance.kt
@@ -1,3 +1,7 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(INHERITANCE_SINGLE_CLASS::class, "11inheritance24INHERITANCE_SINGLE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_WITH_CLASS_INHERITANCE::class, "11inheritance29OBJECT_WITH_CLASS_INHERITANCEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OPEN_CLASS::class, "11inheritance10OPEN_CLASSC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/main/main.kt
index 46b1843..1941a69 100644
--- a/native/swift/swift-export-standalone/testData/generation/classes/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/classes/golden_result/main/main.kt
@@ -1,3 +1,29 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.Foo::class, "22ExportedKotlinPackages9namespaceO4mainE3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.Foo.INSIDE_CLASS::class, "22ExportedKotlinPackages9namespaceO4mainE3FooC12INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.NAMESPACED_CLASS::class, "22ExportedKotlinPackages9namespaceO4mainE16NAMESPACED_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.DATA_OBJECT_WITH_PACKAGE::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE24DATA_OBJECT_WITH_PACKAGEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Foo::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Foo.INSIDE_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE3FooC12INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Foo.INSIDE_CLASS.DEEPER_INSIDE_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE3FooC12INSIDE_CLASSC19DEEPER_INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.NAMESPACED_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE16NAMESPACED_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.OBJECT_WITH_PACKAGE::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19OBJECT_WITH_PACKAGEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.OBJECT_WITH_PACKAGE.Bar::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19OBJECT_WITH_PACKAGEC3BarC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.OBJECT_WITH_PACKAGE.Bar.OBJECT_INSIDE_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19OBJECT_WITH_PACKAGEC3BarC19OBJECT_INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.OBJECT_WITH_PACKAGE.Foo::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19OBJECT_WITH_PACKAGEC3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.OBJECT_WITH_PACKAGE.OBJECT_INSIDE_OBJECT::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19OBJECT_WITH_PACKAGEC20OBJECT_INSIDE_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(why_we_need_module_names.CLASS_WITH_SAME_NAME::class, "22ExportedKotlinPackages24why_we_need_module_namesO4mainE20CLASS_WITH_SAME_NAMEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(CLASS_WITH_SAME_NAME::class, "4main20CLASS_WITH_SAME_NAMEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(ClassWithNonPublicConstructor::class, "4main29ClassWithNonPublicConstructorC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo::class, "4main3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo.Companion::class, "4main3FooC9CompanionC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo.INSIDE_CLASS::class, "4main3FooC12INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE::class, "4main17OBJECT_NO_PACKAGEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE.Bar::class, "4main17OBJECT_NO_PACKAGEC3BarC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE.Bar.CLASS_INSIDE_CLASS_INSIDE_OBJECT::class, "4main17OBJECT_NO_PACKAGEC3BarC32CLASS_INSIDE_CLASS_INSIDE_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE.Bar.NamedCompanion::class, "4main17OBJECT_NO_PACKAGEC3BarC14NamedCompanionC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE.Foo::class, "4main17OBJECT_NO_PACKAGEC3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE.OBJECT_INSIDE_OBJECT::class, "4main17OBJECT_NO_PACKAGEC20OBJECT_INSIDE_OBJECTC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.kt b/native/swift/swift-export-standalone/testData/generation/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.kt
index 0d2f875..1f105fb 100644
--- a/native/swift/swift-export-standalone/testData/generation/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.kt
+++ b/native/swift/swift-export-standalone/testData/generation/consuming_dependencies/golden_result/dependency_deeper_neighbor_exported/dependency_deeper_neighbor_exported.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(dependency.four.AnotherBar::class, "22ExportedKotlinPackages10dependencyO4fourO35dependency_deeper_neighbor_exportedE10AnotherBarC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/dep/dep.kt b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/dep/dep.kt
index 9923cb5..8eb9c21 100644
--- a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/dep/dep.kt
+++ b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/dep/dep.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(test.factory.modules.ClassFromDependency::class, "22ExportedKotlinPackages4testO7factoryO7modulesO3depE19ClassFromDependencyC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/flattened/flattened.kt b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/flattened/flattened.kt
index 435bc61..108721c 100644
--- a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/flattened/flattened.kt
+++ b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/flattened/flattened.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(flattenedPackage.FlattenedPackageClass::class, "22ExportedKotlinPackages16flattenedPackageO9flattenedE21FlattenedPackageClassC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/main/main.kt
index b2e394a..fc4ee0d 100644
--- a/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/functionAndClassWithSameName/golden_result/main/main.kt
@@ -1,3 +1,10 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(test.factory.ClassWithFactoryInAPackage::class, "22ExportedKotlinPackages4testO7factoryO4mainE26ClassWithFactoryInAPackageC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(test.factory.Outer::class, "22ExportedKotlinPackages4testO7factoryO4mainE5OuterC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(test.factory.Outer.Nested::class, "22ExportedKotlinPackages4testO7factoryO4mainE5OuterC6NestedC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(ClassWithFactoryWithoutParameters::class, "4main33ClassWithFactoryWithoutParametersC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(ObjectWithFactory::class, "4main17ObjectWithFactoryC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(UtcOffset::class, "4main9UtcOffsetC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/functions/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/functions/golden_result/main/main.kt
index a11a6ee..1521985 100644
--- a/native/swift/swift-export-standalone/testData/generation/functions/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/functions/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(overload.Foo::class, "22ExportedKotlinPackages8overloadO4mainE3FooC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/inheritance/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/inheritance/golden_result/main/main.kt
index 3fb30bb..80323bb 100644
--- a/native/swift/swift-export-standalone/testData/generation/inheritance/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/inheritance/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo::class, "4main3FooC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/inner_classes/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/inner_classes/golden_result/main/main.kt
index 6496824..5230940 100644
--- a/native/swift/swift-export-standalone/testData/generation/inner_classes/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/inner_classes/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(Outer::class, "4main5OuterC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/nothing_type/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/nothing_type/golden_result/main/main.kt
index efbb1cf..593de3b 100644
--- a/native/swift/swift-export-standalone/testData/generation/nothing_type/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/nothing_type/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(Bar::class, "4main3BarC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/nullable_type/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/nullable_type/golden_result/main/main.kt
index a98cb1b..25f1bf6 100644
--- a/native/swift/swift-export-standalone/testData/generation/nullable_type/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/nullable_type/golden_result/main/main.kt
@@ -1,3 +1,6 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(Bar::class, "4main3BarC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo::class, "4main3FooC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/package_flattening/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/package_flattening/golden_result/main/main.kt
index 5037843..e54302b 100644
--- a/native/swift/swift-export-standalone/testData/generation/package_flattening/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/package_flattening/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(org.kotlin.foo.Clazz::class, "22ExportedKotlinPackages3orgO6kotlinO3fooO4mainE5ClazzC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/package_flattening_invalid_target/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/package_flattening_invalid_target/golden_result/main/main.kt
index 6736d69..92f8f79 100644
--- a/native/swift/swift-export-standalone/testData/generation/package_flattening_invalid_target/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/package_flattening_invalid_target/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(org.kotlin.Foo::class, "22ExportedKotlinPackages3orgO6kotlinO4mainE3FooC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/package_flattening_missing_target/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/package_flattening_missing_target/golden_result/main/main.kt
index 6736d69..92f8f79 100644
--- a/native/swift/swift-export-standalone/testData/generation/package_flattening_missing_target/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/package_flattening_missing_target/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(org.kotlin.Foo::class, "22ExportedKotlinPackages3orgO6kotlinO4mainE3FooC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/single_module_production/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/single_module_production/golden_result/main/main.kt
index 5037843..2cb89ec 100644
--- a/native/swift/swift-export-standalone/testData/generation/single_module_production/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/single_module_production/golden_result/main/main.kt
@@ -1,3 +1,5 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(org.kotlin.foo.Clazz::class, "4main3orgO6kotlinO3fooO4mainE5ClazzC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/type_reference/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/type_reference/golden_result/main/main.kt
index 7fca47d..c117353 100644
--- a/native/swift/swift-export-standalone/testData/generation/type_reference/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/type_reference/golden_result/main/main.kt
@@ -1,3 +1,21 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Class_with_package::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE18Class_with_packageC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Class_with_package.INNER_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE18Class_with_packageC11INNER_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Class_with_package.INNER_OBJECT::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE18Class_with_packageC12INNER_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.DATA_OBJECT::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE11DATA_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Object_with_package::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19Object_with_packageC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Object_with_package.INNER_CLASS::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19Object_with_packageC11INNER_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.deeper.Object_with_package.INNER_OBJECT::class, "22ExportedKotlinPackages9namespaceO6deeperO4mainE19Object_with_packageC12INNER_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Class_without_package::class, "4main21Class_without_packageC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Class_without_package.INNER_CLASS::class, "4main21Class_without_packageC11INNER_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Class_without_package.INNER_OBJECT::class, "4main21Class_without_packageC12INNER_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Demo::class, "4main4DemoC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Demo.INNER_CLASS::class, "4main4DemoC11INNER_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Demo.INNER_OBJECT::class, "4main4DemoC12INNER_OBJECTC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OPEN_CLASS::class, "4main10OPEN_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Object_without_package::class, "4main22Object_without_packageC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Object_without_package.INNER_CLASS::class, "4main22Object_without_packageC11INNER_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Object_without_package.INNER_OBJECT::class, "4main22Object_without_packageC12INNER_OBJECTC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/typealiases/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/typealiases/golden_result/main/main.kt
index 69a3b2c..8376acf 100644
--- a/native/swift/swift-export-standalone/testData/generation/typealiases/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/typealiases/golden_result/main/main.kt
@@ -1,3 +1,10 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(typealiases.Foo::class, "22ExportedKotlinPackages11typealiasesO4mainE3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(typealiases.inner.Bar::class, "22ExportedKotlinPackages11typealiasesO5innerO4mainE3BarC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(DATA_OBJECT_WITH_PACKAGE::class, "4main24DATA_OBJECT_WITH_PACKAGEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(INHERITANCE_SINGLE_CLASS::class, "4main24INHERITANCE_SINGLE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_WITH_CLASS_INHERITANCE::class, "4main29OBJECT_WITH_CLASS_INHERITANCEC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(OPEN_CLASS::class, "4main10OPEN_CLASSC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/testData/generation/unsupportedDeclarationsReporting/golden_result/main/main.kt b/native/swift/swift-export-standalone/testData/generation/unsupportedDeclarationsReporting/golden_result/main/main.kt
index 7f24015..9c9532f 100644
--- a/native/swift/swift-export-standalone/testData/generation/unsupportedDeclarationsReporting/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone/testData/generation/unsupportedDeclarationsReporting/golden_result/main/main.kt
@@ -1,3 +1,6 @@
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo::class, "4main3FooC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Foo.Nested::class, "4main3FooC6NestedC")
+
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 
diff --git a/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportExecutionTestGenerated.java b/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportExecutionTestGenerated.java
index 271355f..e6a386e 100644
--- a/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportExecutionTestGenerated.java
+++ b/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportExecutionTestGenerated.java
@@ -42,6 +42,12 @@
   }
 
   @Test
+  @TestMetadata("classMappings")
+  public void testClassMappings() {
+    runTest("native/swift/swift-export-standalone/testData/execution/classMappings/");
+  }
+
+  @Test
   @TestMetadata("never_type")
   public void testNever_type() {
     runTest("native/swift/swift-export-standalone/testData/execution/never_type/");