diff --git a/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/SirGenerator.kt b/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/SirGenerator.kt index 58d79724cf3..cd92794797d 100644 --- a/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/SirGenerator.kt +++ b/native/swift/sir-analysis-api/src/org/jetbrains/kotlin/sir/analysisapi/SirGenerator.kt @@ -41,7 +41,7 @@ class SirGenerator : SirFactory { ?.pathSegments() ?.toListString() ?.let { names -> buildForeignFunction { - origin = SirOrigin(path = names) + origin = SirOrigin.KotlinEntity(names) visibility = SirVisibility.PUBLIC } } 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 8dae71a94c7..4c8f47e1e5e 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.sir.SirDeclaration import org.jetbrains.kotlin.sir.SirForeignFunction import org.jetbrains.kotlin.sir.SirModule +import org.jetbrains.kotlin.sir.SirOrigin import org.jetbrains.kotlin.sir.builder.SirModuleBuilder import org.jetbrains.kotlin.sir.builder.buildModule import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -52,6 +53,7 @@ abstract class AbstractKotlinSirContextTestBase : AbstractAnalysisApiBasedTest() val module = buildModule { val sirFactory = SirGenerator() ktFiles.forEach { file -> + name = "Test" declarations += sirFactory.build(file) } } @@ -60,7 +62,7 @@ abstract class AbstractKotlinSirContextTestBase : AbstractAnalysisApiBasedTest() module.declarations .filterIsInstance() .forEach { - appendLine("${it.origin.path}") + appendLine("${(it.origin as SirOrigin.KotlinEntity).path}") } } diff --git a/native/swift/sir-printer/build.gradle.kts b/native/swift/sir-printer/build.gradle.kts new file mode 100644 index 00000000000..de58612661b --- /dev/null +++ b/native/swift/sir-printer/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("jvm") +} + +description = "Printer for SIR" + +dependencies { + compileOnly(kotlinStdlib()) + + api(project(":native:swift:sir")) + + implementation(project(":core:util.runtime")) + + testApi(platform(libs.junit.bom)) + testRuntimeOnly(libs.junit.jupiter.engine) + testImplementation(libs.junit.jupiter.api) + + testImplementation(projectTests(":compiler:tests-common")) + testImplementation(projectTests(":compiler:tests-common-new")) +} + +sourceSets { + "main" { projectDefault() } + "test" { projectDefault() } +} \ No newline at end of file diff --git a/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt new file mode 100644 index 00000000000..eee4ec5e3c9 --- /dev/null +++ b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.sir.printer + +import org.jetbrains.kotlin.sir.* +import org.jetbrains.kotlin.sir.visitors.SirVisitor +import org.jetbrains.kotlin.utils.SmartPrinter + +private const val DEFAULT_INDENT: String = " " + +class SirAsSwiftSourcesPrinter : SirVisitor() { + fun print(element: SirElement): String = buildString { + element.accept(this@SirAsSwiftSourcesPrinter, SmartPrinter(this)) + }.trim() + + override fun visitModule(module: SirModule, data: SmartPrinter) = with(data) { + module.declarations.forEach { + it.accept(this@SirAsSwiftSourcesPrinter, this) + if (module.declarations.last() != it) { + println() + } + } + } + + override fun visitFunction(function: SirFunction, data: SmartPrinter): Unit = with(data) { + println(listOfNotNull( + function.visibility.takeIf { it != SirVisibility.INTERNAL }?.let { "${it.swift} " }, + "func ", + function.name.swiftIdentifier, + function.parameters.takeIf { it.isNotEmpty() } + ?.joinToString(prefix = "(\n", postfix = "\n)", separator = ",\n") { + it.swift.prependIndent(DEFAULT_INDENT) + } ?: "()", + " -> ", + function.returnType.swift, + " { fatalError() }" + ).joinToString(separator = "")) + } + + override fun visitForeignFunction(function: SirForeignFunction, data: SmartPrinter) {} // we do not write Foreign nodes + + override fun visitElement(element: SirElement, data: SmartPrinter): Unit = with(data) { + println("/* ERROR: unsupported element type: " + element.javaClass.simpleName + " */") + } +} + +private val SirVisibility.swift + get(): String = when (this) { + SirVisibility.PRIVATE -> "private" + SirVisibility.FILEPRIVATE -> "fileprivate" + SirVisibility.INTERNAL -> "internal" + SirVisibility.PUBLIC -> "public" + SirVisibility.PACKAGE -> "package" + } + +private val SirParameter.swift get(): String = (argumentName ?: "_") + (parameterName?.let { " $it" } ?: "") + ": " + type.swift + +private val SirType.swift + get(): String = when (this) { + is SirExistentialType -> "Any" + is SirNominalType -> type.swiftFqName + } + +private val SirNamedDeclaration.swiftFqName: String + get() { + val parentName = (parent as? SirNamedDeclaration)?.swiftFqName ?: ((parent as? SirNamed)?.name) + return parentName?.let { "$it.$name" } ?: name + } + +private val simpleIdentifierRegex = Regex("[_a-zA-Z][_a-zA-Z0-9]*") + +private val String.swiftIdentifier get() = if (simpleIdentifierRegex.matches(this)) this else "`$this`" \ No newline at end of file diff --git a/native/swift/sir-printer/testData/all_types_argument.golden.swift b/native/swift/sir-printer/testData/all_types_argument.golden.swift new file mode 100644 index 00000000000..8ebd76d9fbf --- /dev/null +++ b/native/swift/sir-printer/testData/all_types_argument.golden.swift @@ -0,0 +1,9 @@ +public func foo( + arg1: Swift.Bool, + arg2: Swift.Int8, + arg3: Swift.Int16, + arg4: Swift.Int32, + arg5: Swift.Int64, + arg6: Swift.Double, + arg7: Swift.Float +) -> Swift.Bool { fatalError() } \ No newline at end of file diff --git a/native/swift/sir-printer/testData/empty.golden.swift b/native/swift/sir-printer/testData/empty.golden.swift new file mode 100644 index 00000000000..e69de29bb2d diff --git a/native/swift/sir-printer/testData/simple_function.golden.swift b/native/swift/sir-printer/testData/simple_function.golden.swift new file mode 100644 index 00000000000..07b1be23fb8 --- /dev/null +++ b/native/swift/sir-printer/testData/simple_function.golden.swift @@ -0,0 +1 @@ +public func foo() -> Swift.Bool { fatalError() } \ No newline at end of file diff --git a/native/swift/sir-printer/testData/simple_multiple_function.golden.swift b/native/swift/sir-printer/testData/simple_multiple_function.golden.swift new file mode 100644 index 00000000000..a73cafd7ec3 --- /dev/null +++ b/native/swift/sir-printer/testData/simple_multiple_function.golden.swift @@ -0,0 +1,3 @@ +public func foo1() -> Swift.Bool { fatalError() } + +public func foo2() -> Swift.Bool { fatalError() } diff --git a/native/swift/sir-printer/testData/single_argument.golden.swift b/native/swift/sir-printer/testData/single_argument.golden.swift new file mode 100644 index 00000000000..2d6569674a5 --- /dev/null +++ b/native/swift/sir-printer/testData/single_argument.golden.swift @@ -0,0 +1,3 @@ +public func foo( + arg1: Swift.Int32 +) -> Swift.Bool { fatalError() } \ No newline at end of file diff --git a/native/swift/sir-printer/testData/two_arguments.golden.swift b/native/swift/sir-printer/testData/two_arguments.golden.swift new file mode 100644 index 00000000000..3639cb89135 --- /dev/null +++ b/native/swift/sir-printer/testData/two_arguments.golden.swift @@ -0,0 +1,4 @@ +public func foo( + arg1: Swift.Int32, + arg2: Swift.Double +) -> Swift.Bool { fatalError() } \ 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 new file mode 100644 index 00000000000..d5bf5f24000 --- /dev/null +++ b/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt @@ -0,0 +1,207 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.sir.printer + +import org.jetbrains.kotlin.sir.* +import org.jetbrains.kotlin.sir.builder.buildForeignFunction +import org.jetbrains.kotlin.sir.builder.buildFunction +import org.jetbrains.kotlin.sir.builder.buildModule +import org.jetbrains.kotlin.sir.util.SirSwiftModule +import org.jetbrains.kotlin.test.services.JUnit5Assertions +import org.jetbrains.kotlin.test.util.KtTestUtil +import org.jetbrains.sir.printer.SirAsSwiftSourcesPrinter +import org.junit.Test +import java.io.File + +fun basicModule(): SirModule = buildModule { name = "Test" } + +class SirAsSwiftSourcesPrinterTests { + @Test + fun `should ignore foreign elements`() { + val module = buildModule { + name = "Test" + declarations.add(foreignFunction()) + } + + runTest( + module, + "testData/empty" + ) + } + + @Test + fun `should print simple function`() { + val module = buildModule { + name = "Test" + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo" + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + } + + runTest( + module, + "testData/simple_function" + ) + } + + @Test + fun `should print multiple functions`() { + val module = buildModule { + name = "Test" + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo1" + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo2" + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + } + + runTest( + module, + "testData/simple_multiple_function" + ) + } + + @Test + fun `should print single argument`() { + val module = buildModule { + name = "Test" + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo" + parameters.add( + SirParameter( + argumentName = "arg1", + type = SirNominalType(SirSwiftModule.int32) + ) + ) + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + } + + runTest( + module, + "testData/single_argument" + ) + } + + @Test + fun `should print two argument`() { + val module = buildModule { + name = "Test" + + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo" + parameters.add( + SirParameter( + argumentName = "arg1", + type = SirNominalType(SirSwiftModule.int32) + ) + ) + parameters.add( + SirParameter( + argumentName = "arg2", + type = SirNominalType(SirSwiftModule.double) + ) + ) + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + } + + runTest( + module, + "testData/two_arguments" + ) + } + + @Test + fun `should all types as parameter be handled`() { + val module = buildModule { + name = "Test" + declarations.add(foreignFunction()) + + declarations.add( + buildFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + name = "foo" + parameters.addAll( + listOf( + SirParameter( + argumentName = "arg1", + type = SirNominalType(SirSwiftModule.bool) + ), + SirParameter( + argumentName = "arg2", + type = SirNominalType(SirSwiftModule.int8) + ), + SirParameter( + argumentName = "arg3", + type = SirNominalType(SirSwiftModule.int16) + ), + SirParameter( + argumentName = "arg4", + type = SirNominalType(SirSwiftModule.int32) + ), + SirParameter( + argumentName = "arg5", + type = SirNominalType(SirSwiftModule.int64) + ), + SirParameter( + argumentName = "arg6", + type = SirNominalType(SirSwiftModule.double) + ), + SirParameter( + argumentName = "arg7", + type = SirNominalType(SirSwiftModule.float) + ), + ) + ) + returnType = SirNominalType(SirSwiftModule.bool) + } + ) + } + + runTest( + module, + "testData/all_types_argument" + ) + } + + private fun runTest(module: SirModule, goldenDataFile: String) { + val expectedSwiftSrc = File(KtTestUtil.getHomeDirectory()).resolve("$goldenDataFile.golden.swift") + + val actualSwiftSrc = SirAsSwiftSourcesPrinter().print(module) + JUnit5Assertions.assertEqualsToFile(expectedSwiftSrc, actualSwiftSrc) + } + + private fun foreignFunction(): SirForeignFunction = buildForeignFunction { + origin = SirOrigin.Unknown + visibility = SirVisibility.PUBLIC + } +} \ No newline at end of file diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirEnum.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirEnum.kt index a49aeb5d606..24772d6aec8 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirEnum.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirEnum.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor /** * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.enum] */ -abstract class SirEnum : SirDeclarationContainer(), SirNamedTypeDeclaration { +abstract class SirEnum : SirDeclarationContainer(), SirNamedDeclaration { abstract override val origin: SirOrigin abstract override val visibility: SirVisibility abstract override var parent: SirDeclarationParent diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirModule.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirModule.kt index 142c0b692a3..ba65684f40f 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirModule.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirModule.kt @@ -14,8 +14,9 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor /** * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.module] */ -abstract class SirModule : SirDeclarationContainer() { +abstract class SirModule : SirDeclarationContainer(), SirNamed { abstract override val declarations: List + abstract override val name: String override fun accept(visitor: SirVisitor, data: D): R = visitor.visitModule(this, data) diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamed.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamed.kt new file mode 100644 index 00000000000..23671743def --- /dev/null +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamed.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// This file was generated automatically. See native/swift/sir/tree-generator/Readme.md. +// DO NOT MODIFY IT MANUALLY. + +package org.jetbrains.kotlin.sir + +/** + * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.named] + */ +sealed interface SirNamed : SirElement { + val name: String +} diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedTypeDeclaration.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedDeclaration.kt similarity index 80% rename from native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedTypeDeclaration.kt rename to native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedDeclaration.kt index c061b12e1d0..3d457272215 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedTypeDeclaration.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirNamedDeclaration.kt @@ -12,18 +12,18 @@ import org.jetbrains.kotlin.sir.visitors.SirTransformer import org.jetbrains.kotlin.sir.visitors.SirVisitor /** - * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.namedTypeDeclaration] + * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.namedDeclaration] */ -sealed interface SirNamedTypeDeclaration : SirDeclarationWithName { +sealed interface SirNamedDeclaration : SirDeclaration, SirNamed { override val origin: SirOrigin override val visibility: SirVisibility override var parent: SirDeclarationParent override val name: String override fun accept(visitor: SirVisitor, data: D): R = - visitor.visitNamedTypeDeclaration(this, data) + visitor.visitNamedDeclaration(this, data) @Suppress("UNCHECKED_CAST") override fun transform(transformer: SirTransformer, data: D): E = - transformer.transformNamedTypeDeclaration(this, data) as E + transformer.transformNamedDeclaration(this, data) as E } diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirDeclarationWithName.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirStruct.kt similarity index 63% rename from native/swift/sir/gen/org/jetbrains/kotlin/sir/SirDeclarationWithName.kt rename to native/swift/sir/gen/org/jetbrains/kotlin/sir/SirStruct.kt index 4b014a02faa..d85c2152262 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirDeclarationWithName.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirStruct.kt @@ -12,18 +12,19 @@ import org.jetbrains.kotlin.sir.visitors.SirTransformer import org.jetbrains.kotlin.sir.visitors.SirVisitor /** - * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.declarationWithName] + * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.struct] */ -sealed interface SirDeclarationWithName : SirDeclaration { - override val origin: SirOrigin - override val visibility: SirVisibility - override var parent: SirDeclarationParent - val name: String +abstract class SirStruct : SirDeclarationContainer(), SirNamedDeclaration { + abstract override val origin: SirOrigin + abstract override val visibility: SirVisibility + abstract override var parent: SirDeclarationParent + abstract override val name: String + abstract override val declarations: List override fun accept(visitor: SirVisitor, data: D): R = - visitor.visitDeclarationWithName(this, data) + visitor.visitStruct(this, data) @Suppress("UNCHECKED_CAST") override fun transform(transformer: SirTransformer, data: D): E = - transformer.transformDeclarationWithName(this, data) as E + transformer.transformStruct(this, data) as E } diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirEnumBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirEnumBuilder.kt index e53b195fddb..7c98149cb1a 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirEnumBuilder.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirEnumBuilder.kt @@ -16,8 +16,8 @@ import org.jetbrains.kotlin.sir.impl.SirEnumImpl @SirBuilderDsl class SirEnumBuilder { - lateinit var origin: SirOrigin - lateinit var visibility: SirVisibility + var origin: SirOrigin = SirOrigin.Unknown + var visibility: SirVisibility = SirVisibility.PUBLIC lateinit var name: String val declarations: MutableList = mutableListOf() val cases: MutableList = mutableListOf() diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirForeignFunctionBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirForeignFunctionBuilder.kt index abf5da70a1e..9b1cf087555 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirForeignFunctionBuilder.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirForeignFunctionBuilder.kt @@ -11,16 +11,16 @@ package org.jetbrains.kotlin.sir.builder import kotlin.contracts.* -import org.jetbrains.kotlin.sir.SirOrigin import org.jetbrains.kotlin.sir.SirBuilderDsl import org.jetbrains.kotlin.sir.SirForeignFunction +import org.jetbrains.kotlin.sir.SirOrigin import org.jetbrains.kotlin.sir.SirVisibility import org.jetbrains.kotlin.sir.impl.SirForeignFunctionImpl @SirBuilderDsl class SirForeignFunctionBuilder { - lateinit var origin: SirOrigin - lateinit var visibility: SirVisibility + var origin: SirOrigin = SirOrigin.Unknown + var visibility: SirVisibility = SirVisibility.PUBLIC fun build(): SirForeignFunction { return SirForeignFunctionImpl( @@ -31,7 +31,7 @@ class SirForeignFunctionBuilder { } @OptIn(ExperimentalContracts::class) -inline fun buildForeignFunction(init: SirForeignFunctionBuilder.() -> Unit): SirForeignFunction { +inline fun buildForeignFunction(init: SirForeignFunctionBuilder.() -> Unit = {}): SirForeignFunction { contract { callsInPlace(init, InvocationKind.EXACTLY_ONCE) } 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 ac7278de99f..18ce1981189 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 @@ -16,8 +16,8 @@ import org.jetbrains.kotlin.sir.impl.SirFunctionImpl @SirBuilderDsl class SirFunctionBuilder { - lateinit var origin: SirOrigin - lateinit var visibility: SirVisibility + var origin: SirOrigin = SirOrigin.Unknown + var visibility: SirVisibility = SirVisibility.PUBLIC lateinit var name: String val parameters: MutableList = mutableListOf() lateinit var returnType: SirType diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirModuleBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirModuleBuilder.kt index ebabc25af8e..382d22e1249 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirModuleBuilder.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirModuleBuilder.kt @@ -19,16 +19,18 @@ import org.jetbrains.kotlin.sir.impl.SirModuleImpl @SirBuilderDsl class SirModuleBuilder { val declarations: MutableList = mutableListOf() + lateinit var name: String fun build(): SirModule { return SirModuleImpl( declarations, + name, ) } } @OptIn(ExperimentalContracts::class) -inline fun buildModule(init: SirModuleBuilder.() -> Unit = {}): SirModule { +inline fun buildModule(init: SirModuleBuilder.() -> Unit): SirModule { contract { callsInPlace(init, InvocationKind.EXACTLY_ONCE) } diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirStructBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirStructBuilder.kt new file mode 100644 index 00000000000..cc06c4aa611 --- /dev/null +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirStructBuilder.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// This file was generated automatically. See native/swift/sir/tree-generator/Readme.md. +// DO NOT MODIFY IT MANUALLY. + +@file:Suppress("DuplicatedCode", "unused") + +package org.jetbrains.kotlin.sir.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.sir.* +import org.jetbrains.kotlin.sir.impl.SirStructImpl + +@SirBuilderDsl +class SirStructBuilder { + var origin: SirOrigin = SirOrigin.Unknown + var visibility: SirVisibility = SirVisibility.PUBLIC + lateinit var name: String + val declarations: MutableList = mutableListOf() + + fun build(): SirStruct { + return SirStructImpl( + origin, + visibility, + name, + declarations, + ) + } +} + +@OptIn(ExperimentalContracts::class) +inline fun buildStruct(init: SirStructBuilder.() -> Unit): SirStruct { + contract { + callsInPlace(init, InvocationKind.EXACTLY_ONCE) + } + return SirStructBuilder().apply(init).build() +} diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirForeignFunctionImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirForeignFunctionImpl.kt index 4d155a9e1cd..c94482f9726 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirForeignFunctionImpl.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirForeignFunctionImpl.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.sir.impl -import org.jetbrains.kotlin.sir.SirOrigin import org.jetbrains.kotlin.sir.SirDeclarationParent import org.jetbrains.kotlin.sir.SirForeignFunction +import org.jetbrains.kotlin.sir.SirOrigin import org.jetbrains.kotlin.sir.SirVisibility import org.jetbrains.kotlin.sir.visitors.SirTransformer import org.jetbrains.kotlin.sir.visitors.SirVisitor diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirModuleImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirModuleImpl.kt index fd7262d49ea..4376a9dee58 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirModuleImpl.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirModuleImpl.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor internal class SirModuleImpl( override val declarations: MutableList, + override val name: String, ) : SirModule() { override fun acceptChildren(visitor: SirVisitor, data: D) { diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirStructImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirStructImpl.kt new file mode 100644 index 00000000000..e0c641b48c3 --- /dev/null +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirStructImpl.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// This file was generated automatically. See native/swift/sir/tree-generator/Readme.md. +// DO NOT MODIFY IT MANUALLY. + +package org.jetbrains.kotlin.sir.impl + +import org.jetbrains.kotlin.sir.* +import org.jetbrains.kotlin.sir.util.transformInPlace +import org.jetbrains.kotlin.sir.visitors.SirTransformer +import org.jetbrains.kotlin.sir.visitors.SirVisitor + +internal class SirStructImpl( + override val origin: SirOrigin, + override val visibility: SirVisibility, + override val name: String, + override val declarations: MutableList, +) : SirStruct() { + override lateinit var parent: SirDeclarationParent + + override fun acceptChildren(visitor: SirVisitor, data: D) { + declarations.forEach { it.accept(visitor, data) } + } + + override fun transformChildren(transformer: SirTransformer, data: D) { + declarations.transformInPlace(transformer, data) + } +} diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirTransformer.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirTransformer.kt index 6e81dc8b5df..9b5eed5fd3e 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirTransformer.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirTransformer.kt @@ -54,20 +54,13 @@ abstract class SirTransformer : SirVisitor() { return transformForeignDeclaration(foreignDeclaration, data) } - open fun transformDeclarationWithName(declarationWithName: SirDeclarationWithName, data: D): SirDeclaration { - return transformElement(declarationWithName, data) + + open fun transformNamedDeclaration(namedDeclaration: SirNamedDeclaration, data: D): SirDeclaration { + return transformElement(namedDeclaration, data) } - final override fun visitDeclarationWithName(declarationWithName: SirDeclarationWithName, data: D): SirDeclaration { - return transformDeclarationWithName(declarationWithName, data) - } - - open fun transformNamedTypeDeclaration(namedTypeDeclaration: SirNamedTypeDeclaration, data: D): SirDeclaration { - return transformElement(namedTypeDeclaration, data) - } - - final override fun visitNamedTypeDeclaration(namedTypeDeclaration: SirNamedTypeDeclaration, data: D): SirDeclaration { - return transformNamedTypeDeclaration(namedTypeDeclaration, data) + final override fun visitNamedDeclaration(namedDeclaration: SirNamedDeclaration, data: D): SirDeclaration { + return transformNamedDeclaration(namedDeclaration, data) } open fun transformEnum(enum: SirEnum, data: D): SirDeclaration { @@ -78,6 +71,14 @@ abstract class SirTransformer : SirVisitor() { return transformEnum(enum, data) } + open fun transformStruct(struct: SirStruct, data: D): SirDeclaration { + return transformElement(struct, data) + } + + final override fun visitStruct(struct: SirStruct, data: D): SirDeclaration { + return transformStruct(struct, data) + } + open fun transformCallable(callable: SirCallable, data: D): SirDeclaration { return transformElement(callable, data) } diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitor.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitor.kt index 5f7649f2477..7c2cc544b53 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitor.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitor.kt @@ -29,14 +29,14 @@ abstract class SirVisitor { open fun visitForeignDeclaration(foreignDeclaration: SirForeignDeclaration, data: D): R = visitDeclaration(foreignDeclaration, data) - open fun visitDeclarationWithName(declarationWithName: SirDeclarationWithName, data: D): R = - visitDeclaration(declarationWithName, data) - - open fun visitNamedTypeDeclaration(namedTypeDeclaration: SirNamedTypeDeclaration, data: D): R = - visitDeclarationWithName(namedTypeDeclaration, data) + open fun visitNamedDeclaration(namedDeclaration: SirNamedDeclaration, data: D): R = + visitDeclaration(namedDeclaration, data) open fun visitEnum(enum: SirEnum, data: D): R = - visitNamedTypeDeclaration(enum, data) + visitNamedDeclaration(enum, data) + + open fun visitStruct(struct: SirStruct, data: D): R = + visitNamedDeclaration(struct, data) open fun visitCallable(callable: SirCallable, data: D): R = visitDeclaration(callable, data) diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirOrigin.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirOrigin.kt index 9b9e6bac767..18d4b915f9b 100644 --- a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirOrigin.kt +++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirOrigin.kt @@ -5,4 +5,16 @@ package org.jetbrains.kotlin.sir -data class SirOrigin(val path: List) \ No newline at end of file +sealed interface SirOrigin { + sealed interface Synthetic : SirOrigin + + data class ExternallyDefined(val name: String) : Synthetic + + data class KotlinEntity(val path: List) : SirOrigin + + /** + * Value for nodes of unknown or non-viable origin + * (e.g. objects created in/for tests) + */ + data object Unknown: SirOrigin +} \ No newline at end of file diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirType.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirType.kt index 7f6b8de7575..fef7f25471e 100644 --- a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirType.kt +++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirType.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.sir sealed interface SirType class SirNominalType( - val type: SirNamedTypeDeclaration, + val type: SirNamedDeclaration, val parent: SirNominalType? = null, ) : SirType diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirSwiftModule.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirSwiftModule.kt new file mode 100644 index 00000000000..a971d1ff0d5 --- /dev/null +++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirSwiftModule.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.sir.util + +import org.jetbrains.kotlin.sir.SirDeclaration +import org.jetbrains.kotlin.sir.SirModule +import org.jetbrains.kotlin.sir.SirOrigin +import org.jetbrains.kotlin.sir.SirVisibility +import org.jetbrains.kotlin.sir.builder.buildStruct +import org.jetbrains.kotlin.sir.visitors.SirTransformer +import org.jetbrains.kotlin.sir.visitors.SirVisitor + +/** + * A module representing the swift standard library + */ +object SirSwiftModule : SirModule() { + override val name: String get() = "Swift" + override val declarations: List by lazy { + listOf( + bool, + int8, + int16, + int32, + int64, + double, + float, + ) + } + + val bool = primitive("Bool") + val int8 = primitive("Int8") + val int16 = primitive("Int16") + val int32 = primitive("Int32") + val int64 = primitive("Int64") + val double = primitive("Double") + val float = primitive("Float") + + override fun acceptChildren(visitor: SirVisitor, data: D) { + declarations.forEach { it.accept(visitor, data) } + } + + override fun transformChildren(transformer: SirTransformer, data: D) {} +} + +private fun primitive(typeName: String) = buildStruct { + origin = SirOrigin.ExternallyDefined("Swift.$typeName") + visibility = SirVisibility.PUBLIC + name = typeName +}.also { it.parent = SirSwiftModule } diff --git a/settings.gradle b/settings.gradle index 719d6ebd6d6..4166aab08cd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -400,6 +400,7 @@ include ":plugins:compose-compiler-plugin:compiler", // Swift Export modules include ":native:swift:sir", ":native:swift:sir-passes", + ":native:swift:sir-printer", ":native:swift:sir-analysis-api", ":native:swift:sir-compiler-bridge", ":generators:sir-tests-generator"