KT-72450: fix crash on additional trampouline creation during BridgeGenerationRequest generation ^KT-72450 fixed
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/SirSession.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/SirSession.kt
index f27b733..1142d45 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/SirSession.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/SirSession.kt
@@ -84,6 +84,8 @@
override fun KaScope.extractDeclarations(ktAnalysisSession: KaSession): Sequence<SirDeclaration> =
with(childrenProvider) { this@extractDeclarations.extractDeclarations(ktAnalysisSession) }
+
+ override fun forbidFurtherTrampolineGenerations(): Unit = trampolineDeclarationsProvider.forbidFurtherTrampolineGenerations()
}
/**
@@ -125,6 +127,7 @@
*/
public interface SirTrampolineDeclarationsProvider {
public fun SirDeclaration.trampolineDeclarations(): List<SirDeclaration>
+ public fun forbidFurtherTrampolineGenerations()
}
/**
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/PackageFlatteningSirDeclarationProvider.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/PackageFlatteningSirDeclarationProvider.kt
index 7eab1a1..52a7a30 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/PackageFlatteningSirDeclarationProvider.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/PackageFlatteningSirDeclarationProvider.kt
@@ -17,14 +17,18 @@
private val sirSession: SirSession,
private val targetPackageFqName: FqName?,
) : SirTrampolineDeclarationsProvider {
+ private var isNewGenerationsAllowed = true
private val generatedDeclarations: MutableMap<SirDeclaration, List<SirDeclaration>> = mutableMapOf()
override fun SirDeclaration.trampolineDeclarations(): List<SirDeclaration> = generateDeclarations(this)
- private fun generateDeclarations(declaration: SirDeclaration): List<SirDeclaration> = generatedDeclarations.getOrPut(declaration) {
- if (targetPackageFqName == null)
- return emptyList()
+ override fun forbidFurtherTrampolineGenerations() {
+ isNewGenerationsAllowed = false
+ }
+ private fun generateDeclarations(declaration: SirDeclaration): List<SirDeclaration> = generatedDeclarations.getOrPut(declaration) {
+ if (targetPackageFqName == null || !isNewGenerationsAllowed)
+ return emptyList()
with(sirSession) {
val targetEnum = if (declaration is SirEnum && declaration.isNamespace(targetPackageFqName)) {
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 7e8199a..e498f04 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
@@ -17,7 +17,6 @@
import org.jetbrains.kotlin.sir.providers.SirTypeProvider
import org.jetbrains.kotlin.sir.providers.impl.SirEnumGeneratorImpl
import org.jetbrains.kotlin.sir.providers.impl.SirOneToOneModuleProvider
-import org.jetbrains.kotlin.sir.providers.impl.SirSingleModuleProvider
import org.jetbrains.kotlin.sir.providers.source.KotlinSource
import org.jetbrains.kotlin.sir.providers.utils.*
import org.jetbrains.kotlin.sir.util.SirSwiftModule
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt
index 6ed3a4d..5cbe192 100644
--- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt
@@ -76,6 +76,7 @@
}
}
}
+ sirSession.forbidFurtherTrampolineGenerations()
}
/**
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
new file mode 100644
index 0000000..6d2efb3
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
@@ -0,0 +1,6 @@
+public enum namespace {
+ public enum demo {
+ }
+ public enum modulea {
+ }
+}
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.h b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.h
new file mode 100644
index 0000000..d7ef3b4
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.h
@@ -0,0 +1,5 @@
+#include <Foundation/Foundation.h>
+#include <stdint.h>
+
+uintptr_t namespace_demo_useClassFromA();
+
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.kt b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.kt
new file mode 100644
index 0000000..7164287
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.kt
@@ -0,0 +1,11 @@
+@file:kotlin.Suppress("DEPRECATION_ERROR")
+
+import kotlin.native.internal.ExportedBridge
+import kotlinx.cinterop.*
+
+@ExportedBridge("namespace_demo_useClassFromA")
+public fun namespace_demo_useClassFromA(): kotlin.native.internal.NativePtr {
+ val _result = namespace.demo.useClassFromA()
+ return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.swift b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.swift
new file mode 100644
index 0000000..4496321
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/common/common.swift
@@ -0,0 +1,10 @@
+@_exported import ExportedKotlinPackages
+@_implementationOnly import KotlinBridges_common
+import modulea
+
+public typealias demo = ExportedKotlinPackages.namespace.demo
+public extension ExportedKotlinPackages.namespace.demo {
+ public static func useClassFromA() -> ExportedKotlinPackages.namespace.modulea.ClassFromA {
+ return ExportedKotlinPackages.namespace.modulea.ClassFromA(__externalRCRef: namespace_demo_useClassFromA())
+ }
+}
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.h b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.h
new file mode 100644
index 0000000..e09df3a
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.h
@@ -0,0 +1,7 @@
+#include <Foundation/Foundation.h>
+#include <stdint.h>
+
+uintptr_t namespace_modulea_ClassFromA_init_allocate();
+
+void namespace_modulea_ClassFromA_init_initialize__TypesOfArguments__Swift_UInt__(uintptr_t __kt);
+
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.kt b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.kt
new file mode 100644
index 0000000..69a693a
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.kt
@@ -0,0 +1,18 @@
+@file:kotlin.Suppress("DEPRECATION_ERROR")
+@file:kotlin.native.internal.objc.BindClassToObjCName(namespace.modulea.ClassFromA::class, "22ExportedKotlinPackages9namespaceO7moduleaO7moduleaE10ClassFromAC")
+
+import kotlin.native.internal.ExportedBridge
+import kotlinx.cinterop.*
+
+@ExportedBridge("namespace_modulea_ClassFromA_init_allocate")
+public fun namespace_modulea_ClassFromA_init_allocate(): kotlin.native.internal.NativePtr {
+ val _result = kotlin.native.internal.createUninitializedInstance<namespace.modulea.ClassFromA>()
+ return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("namespace_modulea_ClassFromA_init_initialize__TypesOfArguments__Swift_UInt__")
+public fun namespace_modulea_ClassFromA_init_initialize__TypesOfArguments__Swift_UInt__(__kt: kotlin.native.internal.NativePtr): Unit {
+ val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)
+ kotlin.native.internal.initInstance(____kt, namespace.modulea.ClassFromA())
+}
+
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.swift b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.swift
new file mode 100644
index 0000000..c3116d2
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/golden_result/modulea/modulea.swift
@@ -0,0 +1,19 @@
+@_exported import ExportedKotlinPackages
+@_implementationOnly import KotlinBridges_modulea
+import KotlinRuntime
+
+public typealias ClassFromA = ExportedKotlinPackages.namespace.modulea.ClassFromA
+public extension ExportedKotlinPackages.namespace.modulea {
+ public final class ClassFromA: KotlinRuntime.KotlinBase {
+ public override init() {
+ let __kt = namespace_modulea_ClassFromA_init_allocate()
+ super.init(__externalRCRef: __kt)
+ namespace_modulea_ClassFromA_init_initialize__TypesOfArguments__Swift_UInt__(__kt)
+ }
+ package override init(
+ __externalRCRef: Swift.UInt
+ ) {
+ super.init(__externalRCRef: __externalRCRef)
+ }
+ }
+}
diff --git a/native/swift/swift-export-standalone/testData/generation/kt-72450/kt-72450.kt b/native/swift/swift-export-standalone/testData/generation/kt-72450/kt-72450.kt
new file mode 100644
index 0000000..f09eb0b
--- /dev/null
+++ b/native/swift/swift-export-standalone/testData/generation/kt-72450/kt-72450.kt
@@ -0,0 +1,17 @@
+// KIND: STANDALONE
+// MODULE: common(modulea)
+// SWIFT_EXPORT_CONFIG: packageRoot=namespace
+// FILE: main.kt
+package namespace.demo
+
+import namespace.modulea.ClassFromA
+
+fun useClassFromA(): ClassFromA = TODO()
+
+
+// MODULE: modulea()
+// SWIFT_EXPORT_CONFIG: packageRoot=namespace.modulea
+// FILE: moduleA.kt
+package namespace.modulea
+
+class ClassFromA
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/KlibBasedSwiftExportRunnerTest.java b/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/KlibBasedSwiftExportRunnerTest.java
index 119c6fe..1c2bf3e 100644
--- a/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/KlibBasedSwiftExportRunnerTest.java
+++ b/native/swift/swift-export-standalone/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/KlibBasedSwiftExportRunnerTest.java
@@ -100,6 +100,12 @@
}
@Test
+ @TestMetadata("kt-72450")
+ public void testKt_72450() {
+ runTest("native/swift/swift-export-standalone/testData/generation/kt-72450/");
+ }
+
+ @Test
@TestMetadata("list")
public void testList() {
runTest("native/swift/swift-export-standalone/testData/generation/list/");