[FIR/IR generator] Introduce ImportCollector

This class enables printing the import list in generated files
in a smarter way.

Also, refactor `Importable` interface hierarchy, namely, don't inherit
`TypeRef` from `Importable`, since we have types like `TypeRef.Star`
which are not really importable.

Replace the `Importable#typeWithArguments` property with
the `TypeRef#render` method to utilize `ImportCollector` while rendering
types.
This commit is contained in:
Sergej Jaskiewicz
2023-10-16 14:57:22 +02:00
committed by Space Team
parent bec6d38490
commit 7b7bcb8ffa
451 changed files with 1592 additions and 3017 deletions
@@ -10,7 +10,6 @@ import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.ir.generator.BASE_PACKAGE
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.util.*
class Config(
@@ -74,11 +73,10 @@ class ElementConfig(
override fun toString() = element.name
override val packageName: String
get() = category.packageName
override val type: String
get() = Element.elementName2typeName(name)
context(ImportCollector)
override fun renderTo(appendable: Appendable) {
renderingIsNotSupported()
}
enum class Category(private val packageDir: String, val defaultVisitorParam: String) {
Expression("expressions", "expression"),
@@ -103,11 +101,10 @@ class ElementConfigRef(
override fun toString() = element.name
override val type: String
get() = element.type
override val packageName: String
get() = element.packageName
context(ImportCollector)
override fun renderTo(appendable: Appendable) {
renderingIsNotSupported()
}
}
sealed class UseFieldAsParameterInIrFactoryStrategy {
@@ -46,12 +46,9 @@ class Element(
null -> null
}
val typeName
override val typeName
get() = elementName2typeName(name)
override val type: String
get() = typeName
var isLeaf = config.isForcedLeaf
val childrenOrderOverride: List<String>? = config.childrenOrderOverride
override var walkableChildren: List<Field> = emptyList()
@@ -14,13 +14,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.partitionIsInstance
import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef
private object InferredOverriddenType : TypeRefWithNullability {
override val type: String
get() = error("not supported")
override val packageName: String?
get() = null
override val typeWithArguments: String
get() = error("not supported")
context(ImportCollector)
override fun renderTo(appendable: Appendable) {
renderingIsNotSupported()
}
override fun substitute(map: TypeParameterSubstitutionMap) = this
@@ -14,14 +14,14 @@ import org.jetbrains.kotlin.ir.generator.util.*
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef
fun Element.toPoet() = ClassName(packageName, typeName)
fun Element.toPoet() = ClassName(packageName, this.typeName)
fun Element.toPoetSelfParameterized() = toPoet().parameterizedByIfAny(poetTypeVariables)
fun Element.toPoetStarParameterized() = toPoet().parameterizedByIfAny(List(params.size) { STAR })
val Element.poetTypeVariables get() = params.map { TypeVariableName(it.name) }
fun TypeRef.toPoet(): TypeName {
return when (this) {
is GenericElementRef<*, *> -> ClassName(element.packageName!!, element.type).parameterizedByIfAny(typeArgsToPoet())
is GenericElementRef<*, *> -> ClassName(element.packageName, element.typeName).parameterizedByIfAny(typeArgsToPoet())
is ClassRef<*> -> ClassName(packageName, simpleNames).parameterizedByIfAny(typeArgsToPoet())
is NamedTypeParameterRef -> TypeVariableName(name)
is ElementConfigOrRef -> ClassName(this.element.category.packageName, elementName2typeName(element.name)).parameterizedByIfAny(