add export from kotlin into swift of class content #KT-65896 fixed

Merge-request: KT-MR-14624
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2024-02-29 18:37:38 +00:00
committed by Space Team
parent 078f0ff6e1
commit e16714fcf9
18 changed files with 299 additions and 54 deletions
@@ -7,19 +7,12 @@ package org.jetbrains.kotlin.swiftexport.standalone.builders
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.psiSafe
import org.jetbrains.kotlin.psi.KtNamedDeclaration
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.*
import org.jetbrains.kotlin.sir.util.*
import org.jetbrains.kotlin.sir.SirModule
import org.jetbrains.kotlin.sir.bridge.BridgeRequest
import org.jetbrains.kotlin.sir.bridge.createFunctionBodyFromRequest
import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.sir.passes.SirPass
import org.jetbrains.sir.passes.builder.KotlinSource
import org.jetbrains.sir.passes.run
@@ -46,15 +39,10 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
?.callableIdIfNonLocal?.asSingleFqName()
?.pathSegments()?.map { it.toString() }
?: return
val fqNameForBridge = fqName.forBridge
val bridgeRequest = BridgeRequest(
function,
fqNameForBridge.joinToString("_"),
fqName
requests.addIfNotNull(
function.patchCallableBodyAndGenerateRequest(fqName)
)
requests += bridgeRequest
function.body = createFunctionBodyFromRequest(bridgeRequest)
}
override fun visitVariable(variable: SirVariable) {
@@ -62,22 +50,45 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
?.callableIdIfNonLocal?.asSingleFqName()
?.pathSegments()?.map { it.toString() }
?: return
val fqNameForBridge = fqName.forBridge
variable.accessors.forEach {
val suffix = it.bridgeSuffix
val request = BridgeRequest(
it,
fqNameForBridge.joinToString("_") + "_$suffix",
fqName
requests.addIfNotNull(
it.patchCallableBodyAndGenerateRequest(fqName)
)
requests += request
it.body = createFunctionBodyFromRequest(request)
}
}
}
}
private fun SirCallable.patchCallableBodyAndGenerateRequest(
fqName: List<String>,
): BridgeRequest? = when (kind) {
SirCallableKind.FUNCTION,
SirCallableKind.STATIC_METHOD,
-> {
val suffix = bridgeSuffix
val request = BridgeRequest(
this,
fqName.forBridge.joinToString("_") + suffix,
fqName
)
body = createFunctionBodyFromRequest(request)
request
}
SirCallableKind.INSTANCE_METHOD,
SirCallableKind.CLASS_METHOD,
-> {
body = SirFunctionBody(listOf("fatalError()"))
null
}
}
private val SirCallable.bridgeSuffix: String
get() = when (this) {
is SirAccessor -> "_$bridgeSuffix"
else -> ""
}
private val SirAccessor.bridgeSuffix: String
get() = when (this) {
is SirGetter -> "get"
@@ -38,11 +38,12 @@ private fun generateBridgeSources(requests: List<BridgeRequest>): BridgeSources
val kotlinBridgePrinter = createKotlinBridgePrinter()
val cBridgePrinter = createCBridgePrinter()
requests.forEach { request ->
val bridge = generator.generate(request)
kotlinBridgePrinter.add(bridge)
cBridgePrinter.add(bridge)
}
requests
.map(generator::generate)
.forEach {
kotlinBridgePrinter.add(it)
cBridgePrinter.add(it)
}
val actualKotlinSrc = kotlinBridgePrinter.print()
val actualCHeader = cBridgePrinter.print()
@@ -6,13 +6,61 @@ public enum namespace {
public class NAMESPACED_CLASS {
}
public class Foo {
public func foo() -> Swift.Bool {
fatalError()
}
public var my_value: Swift.UInt32 {
get {
fatalError()
}
}
public var my_variable: Swift.Int64 {
get {
fatalError()
}
set {
fatalError()
}
}
}
}
public class NAMESPACED_CLASS {
}
public class Foo {
public func foo() -> Swift.Bool {
fatalError()
}
public var my_value: Swift.UInt32 {
get {
fatalError()
}
}
public var my_variable: Swift.Int64 {
get {
fatalError()
}
set {
fatalError()
}
}
}
}
public class Foo {
public func foo() -> Swift.Bool {
fatalError()
}
public var my_value: Swift.UInt32 {
get {
fatalError()
}
}
public var my_variable: Swift.Int64 {
get {
fatalError()
}
set {
fatalError()
}
}
}
@@ -4,4 +4,11 @@ class NAMESPACED_CLASS
class Foo {
class INSIDE_CLASS // this should be ignored currently
fun foo(): Boolean = TODO()
val my_value: UInt = 5u
var my_variable: Long = 5
}
@@ -4,4 +4,11 @@ class NAMESPACED_CLASS
class Foo {
class INSIDE_CLASS // this should be ignored currently
fun foo(): Boolean = TODO()
val my_value: UInt = 5u
var my_variable: Long = 5
}
@@ -1,4 +1,11 @@
class Foo {
class INSIDE_CLASS // this should be ignored currently
fun foo(): Boolean = TODO()
val my_value: UInt = 5u
var my_variable: Long = 5
}