[Swift Export] initial infrastructure for Swift IR

New modules 'sir', 'sir-passes', and 'sir-analysis-api' were added under
'native:swift' for creating and manipulating Swift IR elements.

* `sir` contains the implementation of Swift IR.
* `sir-analysis-api` contains translation from Analysis API to SIR.
* `sir-passses` contains transformation passes.

This groundwork will allow to progress with the Swift IR.
This commit is contained in:
Sergey Bogolepov
2023-11-08 15:43:43 +02:00
committed by Space Team
parent d15ee71b6c
commit cc14f11e2a
10 changed files with 193 additions and 0 deletions
@@ -0,0 +1,20 @@
plugins {
kotlin("jvm")
}
description = "Build Swift IR from Analysis"
dependencies {
compileOnly(kotlinStdlib())
api(project(":native:swift:sir"))
api(project(":analysis:analysis-api"))
testImplementation(libs.junit4)
testImplementation(projectTests(":compiler:tests-common"))
}
sourceSets {
"main" { projectDefault() }
"test" { projectDefault() }
}
@@ -0,0 +1,15 @@
/*
* 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.analysisapi
import org.jetbrains.kotlin.sir.SirElement
/**
* A root interface for classes that produce Swift IR elements.
*/
interface SirFactory {
fun build(): SirElement
}
@@ -0,0 +1,28 @@
/*
* 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.analysisapi
import org.jetbrains.kotlin.sir.SirElement
import org.junit.Test
import kotlin.test.assertEquals
class FactoryTests {
@Test
fun smoke() {
val expectedString = "Element from factory"
val myFactory = object : SirFactory {
override fun build(): SirElement {
return object : SirElement {
override fun toString(): String {
return expectedString
}
}
}
}
val element = myFactory.build()
assertEquals(expectedString, element.toString())
}
}
+19
View File
@@ -0,0 +1,19 @@
plugins {
kotlin("jvm")
}
description = "Infrastructure of transformations over SIR"
dependencies {
compileOnly(kotlinStdlib())
api(project(":native:swift:sir"))
testImplementation(libs.junit4)
testImplementation(projectTests(":compiler:tests-common"))
}
sourceSets {
"main" { projectDefault() }
"test" { projectDefault() }
}
@@ -0,0 +1,24 @@
/*
* 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.passes
import org.jetbrains.kotlin.sir.SirElement
/**
* Swift IR is supposed to be transformed by a series of passes.
* This is a base interface that all such passes should implement.
*/
interface SirPass<out R, in T> {
/**
* Executes the pass over the given [SirElement].
*
* @param element SIR element to be processed.
* @param data Additional data that is required to run the pass.
* @return The result of the pass.
*/
fun run(element: SirElement, data: T): R
}
@@ -0,0 +1,30 @@
/*
* 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.passes
import org.jetbrains.kotlin.sir.SirElement
import org.jetbrains.sir.passes.SirPass
import org.junit.Test
import kotlin.test.assertEquals
class SirPassTests {
@Test
fun smoke() {
val elementDescription = "mySirElement"
val mySirElement = object : SirElement {
override fun toString(): String {
return elementDescription
}
}
val myPass = object : SirPass<String, Unit> {
override fun run(element: SirElement, data: Unit): String {
return element.toString()
}
}
val result = myPass.run(mySirElement, Unit)
assertEquals(elementDescription, result)
}
}
+17
View File
@@ -0,0 +1,17 @@
plugins {
kotlin("jvm")
}
description = "Swift Intermediate Representation"
dependencies {
compileOnly(kotlinStdlib())
testImplementation(libs.junit4)
testImplementation(projectTests(":compiler:tests-common"))
}
sourceSets {
"main" { projectDefault() }
"test" { projectDefault() }
}
@@ -0,0 +1,12 @@
/*
* 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
/**
* A marker interface that denotes Swift IR elements.
*/
interface SirElement {
}
@@ -0,0 +1,23 @@
/*
* 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
import org.junit.Test
import kotlin.test.assertTrue
class SirTest {
// TODO: Just a fake test to validate that everything is working. Feel free to delete.
@Test
fun exampleTest() {
val fakeElement = produceSwiftElement()
assertTrue(fakeElement is SirElement)
}
private fun produceSwiftElement(): Any {
return object : SirElement {}
}
}
+5
View File
@@ -397,6 +397,11 @@ include ":plugins:compose-compiler-plugin:compiler",
":plugins:compose-compiler-plugin:compiler-daemon",
":plugins:compose-compiler-plugin:compiler-daemon:integration-tests"
// Swift Export modules
include ":native:swift:sir",
":native:swift:sir-passes",
":native:swift:sir-analysis-api"
void intellij(String imlPath) {
File imlFile = new File("${rootDir}/intellij/community/plugins/kotlin/${imlPath}")
imlFile = imlFile.exists() ? imlFile : new File("${rootDir}/intellij/plugins/kotlin/${imlPath}")