Remove KotlinSirOrigin hierarchy in favour of direct AA usage #KT-65335 Fixed
Merge-request: KT-MR-14229 Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
@@ -12,7 +12,6 @@ dependencies {
|
||||
compileOnly(kotlinStdlib())
|
||||
|
||||
implementation(project(":native:swift:sir"))
|
||||
implementation(project(":native:swift:sir-analysis-api"))
|
||||
implementation(project(":native:swift:sir-compiler-bridge"))
|
||||
implementation(project(":native:swift:sir-passes"))
|
||||
implementation(project(":native:swift:sir-printer"))
|
||||
|
||||
+22
-13
@@ -5,7 +5,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.swiftexport.standalone.builders
|
||||
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
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
|
||||
@@ -13,12 +16,12 @@ 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
|
||||
import org.jetbrains.kotlin.sir.bridge.createFunctionBodyFromRequest
|
||||
import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid
|
||||
import org.jetbrains.sir.passes.SirPass
|
||||
import org.jetbrains.sir.passes.builder.KotlinSource
|
||||
import org.jetbrains.sir.passes.run
|
||||
|
||||
internal fun SirModule.buildFunctionBridges(): List<BridgeRequest> {
|
||||
@@ -39,7 +42,9 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
|
||||
}
|
||||
|
||||
override fun visitFunction(function: SirFunction) {
|
||||
val fqName = (function.origin as? SirKotlinOrigin.Function)?.path
|
||||
val fqName = ((function.origin as? KotlinSource)?.symbol as? KtFunctionLikeSymbol)
|
||||
?.callableIdIfNonLocal?.asSingleFqName()
|
||||
?.pathSegments()?.map { it.toString() }
|
||||
?: return
|
||||
val fqNameForBridge = fqName.forBridge
|
||||
|
||||
@@ -53,7 +58,9 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
|
||||
}
|
||||
|
||||
override fun visitVariable(variable: SirVariable) {
|
||||
val fqName = (variable.origin as? SirKotlinOrigin.Property)?.path?.forBridge
|
||||
val fqName = ((variable.origin as? KotlinSource)?.symbol as? KtVariableLikeSymbol)
|
||||
?.callableIdIfNonLocal?.asSingleFqName()
|
||||
?.pathSegments()?.map { it.toString() }
|
||||
?: return
|
||||
val fqNameForBridge = fqName.forBridge
|
||||
|
||||
@@ -71,13 +78,15 @@ private object BridgeGenerationPass : SirPass<SirElement, Nothing?, List<BridgeR
|
||||
}
|
||||
}
|
||||
|
||||
private val SirAccessor.bridgeSuffix: String get() = when(this) {
|
||||
is SirGetter -> "get"
|
||||
is SirSetter -> "set"
|
||||
}
|
||||
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
|
||||
}
|
||||
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
-12
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.swiftexport.standalone.builders
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
||||
import org.jetbrains.kotlin.analysis.api.analyze
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider
|
||||
import org.jetbrains.kotlin.analysis.api.standalone.KtAlwaysAccessibleLifetimeTokenProvider
|
||||
import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession
|
||||
@@ -13,10 +14,10 @@ import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtSourceModu
|
||||
import org.jetbrains.kotlin.platform.konan.NativePlatforms
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.sir.SirModule
|
||||
import org.jetbrains.kotlin.sir.analysisapi.SirGenerator
|
||||
import org.jetbrains.kotlin.sir.builder.buildImport
|
||||
import org.jetbrains.kotlin.sir.builder.buildModule
|
||||
import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportInput
|
||||
import org.jetbrains.sir.passes.builder.buildSirDeclarationList
|
||||
|
||||
@OptIn(KtAnalysisApiInternals::class)
|
||||
internal fun buildSwiftModule(
|
||||
@@ -48,17 +49,17 @@ internal fun buildSwiftModule(
|
||||
ktFiles = ktFiles.sortedBy { it.name }
|
||||
}
|
||||
|
||||
|
||||
return buildModule {
|
||||
name = sourceModule.moduleName
|
||||
val sirFactory = SirGenerator()
|
||||
declarations += buildImport {
|
||||
moduleName = bridgeModuleName
|
||||
return analyze(sourceModule) {
|
||||
buildModule {
|
||||
name = sourceModule.moduleName
|
||||
declarations += buildImport {
|
||||
moduleName = bridgeModuleName
|
||||
}
|
||||
ktFiles.forEach { file ->
|
||||
declarations += buildSirDeclarationList(file)
|
||||
}
|
||||
}.apply {
|
||||
declarations.forEach { it.parent = this }
|
||||
}
|
||||
ktFiles.forEach { file ->
|
||||
declarations += sirFactory.build(file)
|
||||
}
|
||||
}.apply {
|
||||
declarations.forEach { it.parent = this }
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -13,7 +13,6 @@ 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.ForeignTranslationPass
|
||||
|
||||
internal fun SirModule.transformToSwift(): SirModule {
|
||||
return SirPassesConfiguration.passes.fold(this) { module, pass ->
|
||||
@@ -24,9 +23,9 @@ internal fun SirModule.transformToSwift(): SirModule {
|
||||
private object SirPassesConfiguration {
|
||||
val passes: List<SirModulePass> = listOf(
|
||||
SirInflatePackagesPass(),
|
||||
WholeModuleTranslationByElementPass(ForeignTranslationPass()),
|
||||
)
|
||||
|
||||
@Suppress("Unused")
|
||||
class WholeModuleTranslationByElementPass(
|
||||
val pass: SirPass<SirElement, Nothing?, SirDeclaration>
|
||||
) : SirModulePass {
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
#include <stdint.h>
|
||||
|
||||
int16_t __root___foo__TypesOfArguments__int32_t_double__(int32_t p, double p2);
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import kotlin.native.internal.ExportedBridge
|
||||
|
||||
@ExportedBridge("__root___foo")
|
||||
public fun __root___foo(p: Int, p2: Double): Short {
|
||||
val result = foo(p, p2)
|
||||
return result
|
||||
}
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
import KotlinBridges
|
||||
|
||||
/**
|
||||
* Function foo description
|
||||
*
|
||||
* @param p first Integer to consume
|
||||
* @param p2 second Double to consume
|
||||
* @return Short, constant 1
|
||||
*/
|
||||
public func foo(
|
||||
p: Swift.Int32,
|
||||
p2: Swift.Double
|
||||
) -> Swift.Int16 {
|
||||
return __root___foo__TypesOfArguments__int32_t_double__(p, p2)
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Function foo description
|
||||
*
|
||||
* @param p first Integer to consume
|
||||
* @param p2 second Double to consume
|
||||
* @return Short, constant 1
|
||||
*/
|
||||
fun foo(p: Int, p2: Double): Short = 1
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
#include <stdint.h>
|
||||
|
||||
void namespace1_local_functions_foo();
|
||||
|
||||
int32_t namespace1_main_foobar__TypesOfArguments__int32_t__(int32_t param);
|
||||
|
||||
void namespace1_main_all_args__TypesOfArguments___Bool_int8_t_int16_t_int32_t_int64_t_float_double__(_Bool arg1, int8_t arg2, int16_t arg3, int32_t arg4, int64_t arg5, float arg10, double arg11);
|
||||
|
||||
int32_t namespace1_bar();
|
||||
|
||||
int32_t namespace2_foo__TypesOfArguments__int32_t__(int32_t arg1);
|
||||
|
||||
int32_t overload_foo__TypesOfArguments__int32_t__(int32_t arg1);
|
||||
|
||||
int32_t overload_foo__TypesOfArguments__double__(double arg1);
|
||||
|
||||
int32_t __root___foo();
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
import kotlin.native.internal.ExportedBridge
|
||||
|
||||
@ExportedBridge("namespace1_local_functions_foo")
|
||||
public fun namespace1_local_functions_foo(): Unit {
|
||||
val result = namespace1.local_functions.foo()
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace1_main_foobar")
|
||||
public fun namespace1_main_foobar(param: Int): Int {
|
||||
val result = namespace1.main.foobar(param)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace1_main_all_args")
|
||||
public fun namespace1_main_all_args(arg1: Boolean, arg2: Byte, arg3: Short, arg4: Int, arg5: Long, arg10: Float, arg11: Double): Unit {
|
||||
val result = namespace1.main.all_args(arg1, arg2, arg3, arg4, arg5, arg10, arg11)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace1_bar")
|
||||
public fun namespace1_bar(): Int {
|
||||
val result = namespace1.bar()
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace2_foo")
|
||||
public fun namespace2_foo(arg1: Int): Int {
|
||||
val result = namespace2.foo(arg1)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("overload_foo")
|
||||
public fun overload_foo(arg1: Int): Int {
|
||||
val result = overload.foo(arg1)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("overload_foo")
|
||||
public fun overload_foo(arg1: Double): Int {
|
||||
val result = overload.foo(arg1)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("__root___foo")
|
||||
public fun __root___foo(): Int {
|
||||
val result = foo()
|
||||
return result
|
||||
}
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
import KotlinBridges
|
||||
|
||||
enum namespace1 {
|
||||
enum local_functions {
|
||||
public static func foo() -> Swift.Void {
|
||||
namespace1_local_functions_foo()
|
||||
}
|
||||
}
|
||||
enum main {
|
||||
public static func foobar(
|
||||
param: Swift.Int32
|
||||
) -> Swift.Int32 {
|
||||
return namespace1_main_foobar__TypesOfArguments__int32_t__(param)
|
||||
}
|
||||
public static func all_args(
|
||||
arg1: Swift.Bool,
|
||||
arg2: Swift.Int8,
|
||||
arg3: Swift.Int16,
|
||||
arg4: Swift.Int32,
|
||||
arg5: Swift.Int64,
|
||||
arg10: Swift.Float,
|
||||
arg11: Swift.Double
|
||||
) -> Swift.Void {
|
||||
namespace1_main_all_args__TypesOfArguments___Bool_int8_t_int16_t_int32_t_int64_t_float_double__(arg1, arg2, arg3, arg4, arg5, arg10, arg11)
|
||||
}
|
||||
}
|
||||
public static func bar() -> Swift.Int32 {
|
||||
return namespace1_bar()
|
||||
}
|
||||
}
|
||||
|
||||
enum namespace2 {
|
||||
public static func foo(
|
||||
arg1: Swift.Int32
|
||||
) -> Swift.Int32 {
|
||||
return namespace2_foo__TypesOfArguments__int32_t__(arg1)
|
||||
}
|
||||
}
|
||||
|
||||
enum overload {
|
||||
public static func foo(
|
||||
arg1: Swift.Int32
|
||||
) -> Swift.Int32 {
|
||||
return overload_foo__TypesOfArguments__int32_t__(arg1)
|
||||
}
|
||||
public static func foo(
|
||||
arg1: Swift.Double
|
||||
) -> Swift.Int32 {
|
||||
return overload_foo__TypesOfArguments__double__(arg1)
|
||||
}
|
||||
}
|
||||
|
||||
public func foo() -> Swift.Int32 {
|
||||
return __root___foo()
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
package namespace2
|
||||
|
||||
fun foo(arg1: Int) = 123
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
|
||||
internal fun foo_internal() = 123
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package namespace1.local_functions
|
||||
|
||||
fun foo() {
|
||||
fun bar() {
|
||||
val baz = 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package namespace1.main
|
||||
|
||||
import namespace1.*
|
||||
import namespace2.*
|
||||
|
||||
fun foobar(param: Int): Int = foo() + bar() + param
|
||||
|
||||
fun all_args(
|
||||
arg1: Boolean,
|
||||
|
||||
arg2: Byte,
|
||||
arg3: Short,
|
||||
arg4: Int,
|
||||
arg5: Long,
|
||||
|
||||
// TODO: support kotlin Unsigned types - KT-65668
|
||||
// arg6: UByte,
|
||||
// arg7: UShort,
|
||||
// arg8: UInt,
|
||||
// arg9: ULong,
|
||||
|
||||
arg10: Float,
|
||||
arg11: Double,
|
||||
): Unit = Unit
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package overload
|
||||
|
||||
fun foo(arg1: Int) = 123
|
||||
|
||||
fun foo(arg1: Double) = 321
|
||||
@@ -1,9 +0,0 @@
|
||||
#include <stdint.h>
|
||||
|
||||
int32_t namespace1_main_foobar(int32_t param);
|
||||
|
||||
int32_t namespace1_bar();
|
||||
|
||||
int32_t namespace2_foo();
|
||||
|
||||
int32_t __root___foo();
|
||||
@@ -1,25 +0,0 @@
|
||||
import kotlin.native.internal.ExportedBridge
|
||||
|
||||
@ExportedBridge("namespace1_main_foobar")
|
||||
public fun namespace1_main_foobar(param: Int): Int {
|
||||
val result = namespace1.main.foobar(param)
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace1_bar")
|
||||
public fun namespace1_bar(): Int {
|
||||
val result = namespace1.bar()
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("namespace2_foo")
|
||||
public fun namespace2_foo(): Int {
|
||||
val result = namespace2.foo()
|
||||
return result
|
||||
}
|
||||
|
||||
@ExportedBridge("__root___foo")
|
||||
public fun __root___foo(): Int {
|
||||
val result = foo()
|
||||
return result
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
import KotlinBridges
|
||||
|
||||
enum namespace1 {
|
||||
enum main {
|
||||
public static func foobar(
|
||||
param: Swift.Int32
|
||||
) -> Swift.Int32 {
|
||||
return namespace1_main_foobar(param)
|
||||
}
|
||||
}
|
||||
public static func bar() -> Swift.Int32 {
|
||||
return namespace1_bar()
|
||||
}
|
||||
}
|
||||
|
||||
enum namespace2 {
|
||||
public static func foo() -> Swift.Int32 {
|
||||
return namespace2_foo()
|
||||
}
|
||||
}
|
||||
|
||||
public func foo() -> Swift.Int32 {
|
||||
return __root___foo()
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package namespace2
|
||||
|
||||
fun foo(): Int = 321
|
||||
@@ -1,5 +0,0 @@
|
||||
package namespace1.main
|
||||
|
||||
import namespace1.*
|
||||
import namespace2.*
|
||||
fun foobar(param: Int): Int = foo() + bar() + param
|
||||
+2
-2
@@ -4,9 +4,9 @@ int32_t namespace_main_foo_get();
|
||||
|
||||
int32_t namespace_main_bar_get();
|
||||
|
||||
void namespace_main_bar_set(int32_t newValue);
|
||||
void namespace_main_bar_set__TypesOfArguments__int32_t__(int32_t newValue);
|
||||
|
||||
int32_t namespace_main_foobar(int32_t param);
|
||||
int32_t namespace_main_foobar__TypesOfArguments__int32_t__(int32_t param);
|
||||
|
||||
int32_t __root___baz();
|
||||
|
||||
|
||||
+2
-2
@@ -12,13 +12,13 @@ enum namespace {
|
||||
return namespace_main_bar_get()
|
||||
}
|
||||
set {
|
||||
namespace_main_bar_set(newValue)
|
||||
namespace_main_bar_set__TypesOfArguments__int32_t__(newValue)
|
||||
}
|
||||
}
|
||||
public static func foobar(
|
||||
param: Swift.Int32
|
||||
) -> Swift.Int32 {
|
||||
return namespace_main_foobar(param)
|
||||
return namespace_main_foobar__TypesOfArguments__int32_t__(param)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-6
@@ -25,15 +25,21 @@ public class SwiftExportRunnerTest extends AbstractSwiftRunnerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("no_package")
|
||||
public void testNo_package() throws Exception {
|
||||
runTest("native/swift/swift-export-standalone/testData/no_package/");
|
||||
@TestMetadata("documentation")
|
||||
public void testDocumentation() throws Exception {
|
||||
runTest("native/swift/swift-export-standalone/testData/documentation/");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("simple")
|
||||
public void testSimple() throws Exception {
|
||||
runTest("native/swift/swift-export-standalone/testData/simple/");
|
||||
@TestMetadata("functions")
|
||||
public void testFunctions() throws Exception {
|
||||
runTest("native/swift/swift-export-standalone/testData/functions/");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("no_package")
|
||||
public void testNo_package() throws Exception {
|
||||
runTest("native/swift/swift-export-standalone/testData/no_package/");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user