[Swift Export] KT-65008: support simple top-level properties

Merge-request: KT-MR-14131
Merged-by: Gleb Lukianets <Gleb.Lukianets@jetbrains.com>
This commit is contained in:
Gleb Lukianets
2024-02-05 16:29:37 +00:00
committed by Space Team
parent ad5ee28d58
commit f262247b2b
49 changed files with 1172 additions and 72 deletions
@@ -5,8 +5,14 @@
package org.jetbrains.kotlin.swiftexport.standalone.builders
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.sir.SirElement
import org.jetbrains.kotlin.sir.SirFunction
import org.jetbrains.kotlin.sir.SirVariable
import org.jetbrains.kotlin.sir.SirAccessor
import org.jetbrains.kotlin.sir.SirSetter
import org.jetbrains.kotlin.sir.SirGetter
import org.jetbrains.kotlin.sir.util.*
import org.jetbrains.kotlin.sir.SirKotlinOrigin
import org.jetbrains.kotlin.sir.SirModule
import org.jetbrains.kotlin.sir.bridge.BridgeRequest
@@ -35,11 +41,8 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
override fun visitFunction(function: SirFunction) {
val fqName = (function.origin as? SirKotlinOrigin.Function)?.path
?: return
val fqNameForBridge = if (fqName.count() == 1) {
listOf("__root__", fqName.first()) // todo: should be changed with correct mangling KT-64970
} else {
fqName
}
val fqNameForBridge = fqName.forBridge
val bridgeRequest = BridgeRequest(
function,
fqNameForBridge.joinToString("_"),
@@ -48,5 +51,33 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
requests += bridgeRequest
function.body = createFunctionBodyFromRequest(bridgeRequest)
}
override fun visitVariable(variable: SirVariable) {
val fqName = (variable.origin as? SirKotlinOrigin.Property)?.path?.forBridge
?: return
val fqNameForBridge = fqName.forBridge
variable.accessors.forEach {
val suffix = it.bridgeSuffix
val request = BridgeRequest(
it,
fqNameForBridge.joinToString("_") + "_$suffix",
fqName
)
requests += request
it.body = createFunctionBodyFromRequest(request)
}
}
}
}
private val SirAccessor.bridgeSuffix: String get() = when(this) {
is SirGetter -> "get"
is SirSetter -> "set"
}
private val List<String>.forBridge: List<String> get() = if (this.count() == 1) {
listOf("__root__", this.first()) // todo: should be changed with correct mangling KT-64970
} else {
this
}
@@ -13,7 +13,7 @@ import org.jetbrains.sir.passes.SirInflatePackagesPass
import org.jetbrains.sir.passes.SirModulePass
import org.jetbrains.sir.passes.SirPass
import org.jetbrains.sir.passes.run
import org.jetbrains.sir.passes.translation.ForeignIntoSwiftFunctionTranslationPass
import org.jetbrains.sir.passes.translation.ForeignTranslationPass
internal fun SirModule.transformToSwift(): SirModule {
return SirPassesConfiguration.passes.fold(this) { module, pass ->
@@ -24,7 +24,7 @@ internal fun SirModule.transformToSwift(): SirModule {
private object SirPassesConfiguration {
val passes: List<SirModulePass> = listOf(
SirInflatePackagesPass(),
WholeModuleTranslationByElementPass(ForeignIntoSwiftFunctionTranslationPass()),
WholeModuleTranslationByElementPass(ForeignTranslationPass()),
)
class WholeModuleTranslationByElementPass(
@@ -0,0 +1,12 @@
#include <stdint.h>
int32_t namespace_main_foo_get();
int32_t namespace_main_bar_get();
void namespace_main_bar_set(int32_t newValue);
int32_t namespace_main_foobar(int32_t param);
int32_t __root___baz();
@@ -0,0 +1,32 @@
import kotlin.native.internal.ExportedBridge
@ExportedBridge("namespace_main_foo_get")
public fun namespace_main_foo_get(): Int {
val result = namespace.main.foo()
return result
}
@ExportedBridge("namespace_main_bar_get")
public fun namespace_main_bar_get(): Int {
val result = namespace.main.bar()
return result
}
@ExportedBridge("namespace_main_bar_set")
public fun namespace_main_bar_set(newValue: Int): Unit {
val result = namespace.main.bar(newValue)
return result
}
@ExportedBridge("namespace_main_foobar")
public fun namespace_main_foobar(param: Int): Int {
val result = namespace.main.foobar(param)
return result
}
@ExportedBridge("__root___baz")
public fun __root___baz(): Int {
val result = baz()
return result
}
@@ -0,0 +1,26 @@
enum namespace {
enum main {
public static var foo: Swift.Int32 {
get {
return namespace_main_foo_get()
}
}
public static var bar: Swift.Int32 {
get {
return namespace_main_bar_get()
}
set {
namespace_main_bar_set(newValue)
}
}
public static func foobar(
param: Swift.Int32
) -> Swift.Int32 {
return namespace_main_foobar(param)
}
}
}
public func baz() -> Swift.Int32 {
return __root___baz()
}
@@ -0,0 +1,9 @@
package namespace.main
import namespace.*
val foo: Int get() = 10
var bar: Int = 20
fun foobar(param: Int): Int = foo + bar + param + baz
@@ -0,0 +1 @@
fun baz: Int = 30
@@ -35,4 +35,10 @@ public class SwiftExportRunnerTest extends AbstractSwiftRunnerTest {
public void testSimple() throws Exception {
runTest("native/swift/swift-export-standalone/testData/simple/");
}
@Test
@TestMetadata("variables")
public void testVariables() throws Exception {
runTest("native/swift/swift-export-standalone/testData/variables/");
}
}