KT-63748: Pack Swift Export Frontend into compiler plugin

Co-authored-by: Sergej Jaskiewicz <jaskiewiczs@icloud.com>


Merge-request: KT-MR-13351
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2023-12-13 10:40:38 +00:00
committed by Space Team
parent ae5a053025
commit 5fcdd4a9f6
29 changed files with 821 additions and 9 deletions
@@ -21,7 +21,7 @@ import java.util.regex.Pattern;
public class SirAnalysisGeneratedTests extends AbstractKotlinSirContextTest {
@Test
public void testAllFilesPresentInTestData() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/sir-analysis-api/testData"), Pattern.compile("^([^_](.+)).kt$"), null, false);
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/sir-analysis-api/testData"), Pattern.compile("^(.+)\\.kt$"), null, false);
}
@Test
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.sir.visitors.SirTransformer
* Pass that for every occurring declaration in package x.y.z generates a mirroring type scope and puts it there.
* Right now, enums without cases are used for namespace simulation.
*/
public class SirInflatePackagesPass : SirPass<SirModule, Unit, SirModule> {
public class SirInflatePackagesPass : SirModulePass {
private data class Namespace(
val elements: MutableList<SirDeclaration> = mutableListOf(),
val children: MutableMap<String, Namespace> = mutableMapOf(),
@@ -79,7 +79,7 @@ public class SirInflatePackagesPass : SirPass<SirModule, Unit, SirModule> {
}.also(SirDeclarationContainer::fixParents)
}
public override fun run(element: SirModule, data: Unit): SirModule = element.transform(Transformer, Context())
public override fun run(element: SirModule, data: Nothing?): SirModule = element.transform(Transformer, Context())
}
private fun SirDeclarationContainer.fixParents() = declarations
@@ -6,6 +6,9 @@
package org.jetbrains.sir.passes
import org.jetbrains.kotlin.sir.SirElement
import org.jetbrains.kotlin.sir.SirModule
public typealias SirModulePass = SirPass<SirModule, Nothing?, SirModule>
/**
* Swift IR is supposed to be transformed by a series of passes.
@@ -23,4 +26,4 @@ public interface SirPass<in E : SirElement, in T, out R> {
public fun run(element: E, data: T): R
}
public fun <E : SirElement, R> SirPass<E, Unit, R>.run(element: E): R = this.run(element, Unit)
public fun <E : SirElement, R> SirPass<E, Nothing?, R>.run(element: E): R = this.run(element, null)
@@ -21,7 +21,7 @@ import java.lang.IllegalStateException
* or `element` does not contain origin of type `SirOrigin.KotlinEntity.Function`,
* returns original element.
*/
public class ForeignIntoSwiftFunctionTranslationPass : SirPass<SirElement, Nothing?, SirElement> {
public class ForeignIntoSwiftFunctionTranslationPass : SirPass<SirElement, Nothing?, SirDeclaration> {
private class Transformer : SirTransformerVoid() {
override fun <E : SirElement> transformElement(element: E): E {
@@ -45,7 +45,7 @@ public class ForeignIntoSwiftFunctionTranslationPass : SirPass<SirElement, Nothi
}
}
override fun run(element: SirElement, data: Nothing?): SirElement = element.transform(Transformer())
override fun run(element: SirElement, data: Nothing?): SirDeclaration = element.transform(Transformer())
}
private fun SirKotlinOrigin.Parameter.toSir(): SirParameter = SirParameter(
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.sir.mock.MockParameter
import org.jetbrains.kotlin.sir.passes.asserts.assertSirFunctionsEquals
import org.jetbrains.kotlin.sir.passes.mocks.MockSirFunction
import org.jetbrains.kotlin.sir.util.SirSwiftModule
import org.jetbrains.sir.passes.run
import org.jetbrains.sir.passes.translation.ForeignIntoSwiftFunctionTranslationPass
import kotlin.test.Test
import kotlin.test.assertNotNull
@@ -39,7 +40,7 @@ class SirPassTests {
mySirElement.parent = module
val myPass = ForeignIntoSwiftFunctionTranslationPass()
val result = myPass.run(mySirElement, null) as? SirFunction
val result = myPass.run(mySirElement) as? SirFunction
assertNotNull(result, "SirFunction should be produced")
val exp = MockSirFunction(
name = "foo",
@@ -95,7 +96,7 @@ class SirPassTests {
mySirElement.parent = module
val myPass = ForeignIntoSwiftFunctionTranslationPass()
val result = myPass.run(mySirElement, null) as? SirFunction
val result = myPass.run(mySirElement) as? SirFunction
assertNotNull(result, "SirFunction should be produced")
val exp = MockSirFunction(
name = "foo",
@@ -8,6 +8,7 @@ package org.jetbrains.sir.printer
import org.jetbrains.kotlin.sir.*
import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
private const val DEFAULT_INDENT: String = " "
@@ -46,6 +47,14 @@ public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVi
)
}
override fun visitEnum(enum: SirEnum): Unit = with(printer) {
println("enum ${enum.name.swiftIdentifier} {")
withIndent {
enum.acceptChildren(SirAsSwiftSourcesPrinter(printer))
}
println("}")
}
override fun visitForeignFunction(function: SirForeignFunction) {} // we do not write foreign nodes
override fun visitElement(element: SirElement): Unit = with(printer) {