diff --git a/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/transformers/NamedFunction.kt b/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/transformers/NamedFunction.kt index b8e34014bed..e5fab381af7 100644 --- a/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/transformers/NamedFunction.kt +++ b/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/transformers/NamedFunction.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.sir.analysisapi.transformers import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol -import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.sir.* import org.jetbrains.kotlin.sir.builder.buildForeignFunction @@ -24,8 +24,8 @@ private fun KtValueParameterSymbol.toSirParam(): SirKotlinOrigin.Parameter = AAP private class AAFunction( private val originalFunction: KtNamedFunction ) : SirKotlinOrigin.Function { - override val fqName: List - get() = originalFunction.fqName?.pathSegments()?.toListString() ?: emptyList() + override val fqName: FqName + get() = originalFunction.fqName ?: FqName.fromSegments(emptyList()) override val parameters: List get() = analyze(originalFunction) { @@ -48,5 +48,3 @@ private data class AAParameter( private data class AAKotlinType( override val name: String ) : SirKotlinOrigin.Type - -private fun List.toListString() = map { it.asString() } diff --git a/native/swift/sir-analysis-api/tests/org/jetbrains/kotlin/sir/analysisapi/AbstractKotlinSirContextTest.kt b/native/swift/sir-analysis-api/tests/org/jetbrains/kotlin/sir/analysisapi/AbstractKotlinSirContextTest.kt index b49b3ec54b3..0957e7912aa 100644 --- a/native/swift/sir-analysis-api/tests/org/jetbrains/kotlin/sir/analysisapi/AbstractKotlinSirContextTest.kt +++ b/native/swift/sir-analysis-api/tests/org/jetbrains/kotlin/sir/analysisapi/AbstractKotlinSirContextTest.kt @@ -45,7 +45,7 @@ abstract class AbstractKotlinSirContextTestBase : AbstractAnalysisApiBasedTest() .filterIsInstance() .forEach { val function = it.origin as SirKotlinOrigin.Function - appendLine("${function.fqName}") + appendLine("${function.path}") } } diff --git a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt index 8b97df9b8f1..150402679af 100644 --- a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt +++ b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt @@ -90,6 +90,7 @@ private fun readRequestFromFile(file: File): BridgeRequest { this.name = fqName.last() this.returnType = returnType this.parameters += parameters + this.isStatic = false } return BridgeRequest(function, bridgeName, fqName) } \ No newline at end of file diff --git a/native/swift/sir-passes/src/org/jetbrains/sir/passes/translation/ForeignIntoSwiftFunctionTranslationPass.kt b/native/swift/sir-passes/src/org/jetbrains/sir/passes/translation/ForeignIntoSwiftFunctionTranslationPass.kt index 95f59527eef..d965e95236a 100644 --- a/native/swift/sir-passes/src/org/jetbrains/sir/passes/translation/ForeignIntoSwiftFunctionTranslationPass.kt +++ b/native/swift/sir-passes/src/org/jetbrains/sir/passes/translation/ForeignIntoSwiftFunctionTranslationPass.kt @@ -35,7 +35,9 @@ public class ForeignIntoSwiftFunctionTranslationPass : SirPass Swift.Bool { + return foo_wrapped(arg1) +} \ No newline at end of file diff --git a/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt b/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt index a53c3d7e06e..01e901e5cd1 100644 --- a/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt +++ b/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt @@ -37,6 +37,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo" returnType = SirNominalType(SirSwiftModule.bool) @@ -57,6 +58,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo1" returnType = SirNominalType(SirSwiftModule.bool) @@ -65,6 +67,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo2" returnType = SirNominalType(SirSwiftModule.bool) @@ -85,6 +88,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo" parameters.add( @@ -112,6 +116,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo" parameters.add( @@ -146,6 +151,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo" parameters.addAll( @@ -199,6 +205,7 @@ class SirAsSwiftSourcesPrinterTests { declarations.add( buildFunction { origin = SirOrigin.Unknown + isStatic = false visibility = SirVisibility.PUBLIC name = "foo" parameters.add( @@ -219,6 +226,35 @@ class SirAsSwiftSourcesPrinterTests { ) } + @Test + fun `should print static`() { + + val module = buildModule { + name = "Test" + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + isStatic = true + visibility = SirVisibility.PUBLIC + name = "foo" + parameters.add( + SirParameter( + argumentName = "arg1", + type = SirNominalType(SirSwiftModule.int32) + ) + ) + returnType = SirNominalType(SirSwiftModule.bool) + body = SirFunctionBody(listOf("return foo_wrapped(arg1)")) + } + ) + } + + runTest( + module, + "testData/static_function" + ) + } + private fun runTest(module: SirModule, goldenDataFile: String) { val expectedSwiftSrc = File(KtTestUtil.getHomeDirectory()).resolve("$goldenDataFile.golden.swift") diff --git a/native/swift/sir/build.gradle.kts b/native/swift/sir/build.gradle.kts index 7630721a044..6e883aa8a00 100644 --- a/native/swift/sir/build.gradle.kts +++ b/native/swift/sir/build.gradle.kts @@ -9,6 +9,8 @@ description = "Swift Intermediate Representation" dependencies { compileOnly(kotlinStdlib()) + api(project(":core:compiler.common")) + if (kotlinBuildProperties.isInIdeaSync) { compileOnly(project("tree-generator")) // Provided, so that IDEA can recognize references to this module in KDoc. } diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt index ea48fee1c56..00bf37ee08a 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt @@ -18,6 +18,7 @@ abstract class SirFunction : SirElementBase(), SirCallable { abstract override val origin: SirOrigin abstract override val visibility: SirVisibility abstract override var parent: SirDeclarationParent + abstract val isStatic: Boolean abstract val name: String abstract val parameters: List abstract val returnType: SirType diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt index 206120ee81b..722e2487337 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.sir.impl.SirFunctionImpl class SirFunctionBuilder { var origin: SirOrigin = SirOrigin.Unknown var visibility: SirVisibility = SirVisibility.PUBLIC + var isStatic: Boolean by kotlin.properties.Delegates.notNull() lateinit var name: String val parameters: MutableList = mutableListOf() lateinit var returnType: SirType @@ -27,6 +28,7 @@ class SirFunctionBuilder { return SirFunctionImpl( origin, visibility, + isStatic, name, parameters, returnType, @@ -52,6 +54,7 @@ inline fun buildFunctionCopy(original: SirFunction, init: SirFunctionBuilder.() val copyBuilder = SirFunctionBuilder() copyBuilder.origin = original.origin copyBuilder.visibility = original.visibility + copyBuilder.isStatic = original.isStatic copyBuilder.name = original.name copyBuilder.parameters.addAll(original.parameters) copyBuilder.returnType = original.returnType diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt index bccb7516fa3..01564f8ab75 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor internal class SirFunctionImpl( override val origin: SirOrigin, override val visibility: SirVisibility, + override val isStatic: Boolean, override val name: String, override val parameters: MutableList, override val returnType: SirType, diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirKotlinOrigin.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirKotlinOrigin.kt index 97041271792..062b1cf1066 100644 --- a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirKotlinOrigin.kt +++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirKotlinOrigin.kt @@ -5,11 +5,13 @@ package org.jetbrains.kotlin.sir +import org.jetbrains.kotlin.name.FqName + sealed interface SirKotlinOrigin : SirOrigin.Foreign { - val fqName: List + val fqName: FqName override val path: List - get() = fqName + get() = fqName.pathSegments().map { it.asString() } interface Function : SirKotlinOrigin { val parameters: List @@ -24,4 +26,4 @@ sealed interface SirKotlinOrigin : SirOrigin.Foreign { interface Type { val name: String } -} \ No newline at end of file +} diff --git a/native/swift/sir/tests/org/jetbrains/kotlin/sir/mock/KotlinEntity.kt b/native/swift/sir/tests/org/jetbrains/kotlin/sir/mock/KotlinEntity.kt index 4d357d83c70..b36578c2ef4 100644 --- a/native/swift/sir/tests/org/jetbrains/kotlin/sir/mock/KotlinEntity.kt +++ b/native/swift/sir/tests/org/jetbrains/kotlin/sir/mock/KotlinEntity.kt @@ -5,10 +5,11 @@ package org.jetbrains.kotlin.sir.mock +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.sir.SirKotlinOrigin data class MockFunction( - override val fqName: List, + override val fqName: FqName, override val parameters: List, override val returnType: SirKotlinOrigin.Type, ) : SirKotlinOrigin.Function diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt index f2416cd59d4..4d1a3c5db98 100644 --- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt +++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.sir.tree.generator +import org.jetbrains.kotlin.generators.tree.StandardTypes.boolean import org.jetbrains.kotlin.generators.tree.StandardTypes.string import org.jetbrains.kotlin.sir.tree.generator.config.AbstractSwiftIrTreeBuilder import org.jetbrains.kotlin.sir.tree.generator.model.Element @@ -81,6 +82,7 @@ object SwiftIrTree : AbstractSwiftIrTreeBuilder() { customParentInVisitor = callable parent(callable) + +field("isStatic", boolean) // todo: KT-65046 Method|function distinction in SIR +field("name", string) +listField("parameters", parameterType) +field("returnType", typeType) diff --git a/plugins/swift-export/swift-export.backend/src/org/jetbrains/kotlin/swiftexport/SwiftExportExtension.kt b/plugins/swift-export/swift-export.backend/src/org/jetbrains/kotlin/swiftexport/SwiftExportExtension.kt index 63e682e0123..6cddd072ba1 100644 --- a/plugins/swift-export/swift-export.backend/src/org/jetbrains/kotlin/swiftexport/SwiftExportExtension.kt +++ b/plugins/swift-export/swift-export.backend/src/org/jetbrains/kotlin/swiftexport/SwiftExportExtension.kt @@ -164,7 +164,7 @@ class SwiftExportExtension( } override fun visitFunction(function: SirFunction) { - val fqName = (function.origin as? SirKotlinOrigin.Function)?.fqName + 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 diff --git a/plugins/swift-export/testData/simple.golden.h b/plugins/swift-export/testData/simple.golden.h index 78b6c22b4f4..f12e411b3c9 100644 --- a/plugins/swift-export/testData/simple.golden.h +++ b/plugins/swift-export/testData/simple.golden.h @@ -5,3 +5,5 @@ int32_t namespace1_main_foobar(int32_t param); int32_t namespace1_foo(); int32_t namespace2_bar(); + +int32_t __root___foo(); diff --git a/plugins/swift-export/testData/simple.golden.kt b/plugins/swift-export/testData/simple.golden.kt index ed6403176d1..e9ddce90e10 100644 --- a/plugins/swift-export/testData/simple.golden.kt +++ b/plugins/swift-export/testData/simple.golden.kt @@ -17,3 +17,9 @@ public fun namespace2_bar(): Int { val result = namespace2.bar() return result } + +@ExportedBridge("__root___foo") +public fun __root___foo(): Int { + val result = foo() + return result +} diff --git a/plugins/swift-export/testData/simple.golden.swift b/plugins/swift-export/testData/simple.golden.swift index dba9120f6eb..7be67b98545 100644 --- a/plugins/swift-export/testData/simple.golden.swift +++ b/plugins/swift-export/testData/simple.golden.swift @@ -1,18 +1,22 @@ enum namespace1 { enum main { - public func foobar( + public static func foobar( param: Swift.Int32 ) -> Swift.Int32 { return namespace1_main_foobar(param) } } - public func foo() -> Swift.Int32 { + public static func foo() -> Swift.Int32 { return namespace1_foo() } } enum namespace2 { - public func bar() -> Swift.Int32 { + public static func bar() -> Swift.Int32 { return namespace2_bar() } } + +public func foo() -> Swift.Int32 { + return __root___foo() +} diff --git a/plugins/swift-export/testData/simple.kt b/plugins/swift-export/testData/simple.kt index e8896b112b6..31c2dd157c0 100644 --- a/plugins/swift-export/testData/simple.kt +++ b/plugins/swift-export/testData/simple.kt @@ -1,5 +1,8 @@ // WITH_STDLIB +// FILE: no_package.kt +fun foo(): Int = 123 + // FILE: foo.kt package namespace1 fun foo(): Int = 123