[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/");