rrn/rd/KT-63270-swift-printer

KT-63270: add swift printing capabilities to SIR

Co-authored-by: Artem Olkov <artem.olkov@jetbrains.com>
Co-authored-by: Sergej Jaskiewicz <jaskiewiczs@icloud.com>


Merge-request: KT-MR-13191
Merged-by: Gleb Lukianets <Gleb.Lukianets@jetbrains.com>
This commit is contained in:
Artem Olkov
2023-11-24 12:53:51 +00:00
committed by Space Team
parent f9933adf5e
commit a040954f68
30 changed files with 533 additions and 46 deletions
@@ -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
@@ -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<SirDeclaration>
abstract override val name: String
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
visitor.visitModule(this, data)
@@ -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
}
@@ -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 <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
visitor.visitNamedTypeDeclaration(this, data)
visitor.visitNamedDeclaration(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : SirElement, D> transform(transformer: SirTransformer<D>, data: D): E =
transformer.transformNamedTypeDeclaration(this, data) as E
transformer.transformNamedDeclaration(this, data) as E
}
@@ -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<SirDeclaration>
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
visitor.visitDeclarationWithName(this, data)
visitor.visitStruct(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : SirElement, D> transform(transformer: SirTransformer<D>, data: D): E =
transformer.transformDeclarationWithName(this, data) as E
transformer.transformStruct(this, data) as E
}
@@ -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<SirDeclaration> = mutableListOf()
val cases: MutableList<SirEnumCase> = mutableListOf()
@@ -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)
}
@@ -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<SirParameter> = mutableListOf()
lateinit var returnType: SirType
@@ -19,16 +19,18 @@ import org.jetbrains.kotlin.sir.impl.SirModuleImpl
@SirBuilderDsl
class SirModuleBuilder {
val declarations: MutableList<SirDeclaration> = 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)
}
@@ -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<SirDeclaration> = 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()
}
@@ -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
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
internal class SirModuleImpl(
override val declarations: MutableList<SirDeclaration>,
override val name: String,
) : SirModule() {
override fun <R, D> acceptChildren(visitor: SirVisitor<R, D>, data: D) {
@@ -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<SirDeclaration>,
) : SirStruct() {
override lateinit var parent: SirDeclarationParent
override fun <R, D> acceptChildren(visitor: SirVisitor<R, D>, data: D) {
declarations.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: SirTransformer<D>, data: D) {
declarations.transformInPlace(transformer, data)
}
}
@@ -54,20 +54,13 @@ abstract class SirTransformer<in D> : SirVisitor<SirElement, D>() {
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<in D> : SirVisitor<SirElement, D>() {
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)
}
@@ -29,14 +29,14 @@ abstract class SirVisitor<out R, in D> {
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)
@@ -5,4 +5,16 @@
package org.jetbrains.kotlin.sir
data class SirOrigin(val path: List<String>)
sealed interface SirOrigin {
sealed interface Synthetic : SirOrigin
data class ExternallyDefined(val name: String) : Synthetic
data class KotlinEntity(val path: List<String>) : SirOrigin
/**
* Value for nodes of unknown or non-viable origin
* (e.g. objects created in/for tests)
*/
data object Unknown: SirOrigin
}
@@ -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
@@ -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<SirDeclaration> 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 <R, D> acceptChildren(visitor: SirVisitor<R, D>, data: D) {
declarations.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: SirTransformer<D>, data: D) {}
}
private fun primitive(typeName: String) = buildStruct {
origin = SirOrigin.ExternallyDefined("Swift.$typeName")
visibility = SirVisibility.PUBLIC
name = typeName
}.also { it.parent = SirSwiftModule }