[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:
committed by
Space Team
parent
ad5ee28d58
commit
f262247b2b
+36
-5
@@ -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
|
||||
}
|
||||
+2
-2
@@ -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(
|
||||
|
||||
+12
@@ -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();
|
||||
|
||||
+32
@@ -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
|
||||
}
|
||||
|
||||
+26
@@ -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
|
||||
+1
@@ -0,0 +1 @@
|
||||
fun baz: Int = 30
|
||||
+6
@@ -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/");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user