[IR generator] Inherit Field from AbstractField

This is a step towards commonizing the code generator between
FIR and IR: KT-61970
This commit is contained in:
Sergej Jaskiewicz
2023-09-14 18:34:00 +02:00
committed by Space Team
parent 15751333e3
commit f9d17a2d51
7 changed files with 54 additions and 26 deletions
@@ -35,6 +35,16 @@ sealed class Field : AbstractField() {
var withBindThis = true
abstract override var isVolatile: Boolean
abstract override var isFinal: Boolean
abstract override var isLateinit: Boolean
abstract override var isParameter: Boolean
abstract override var isMutable: Boolean
override fun getTypeWithArguments(notNull: Boolean): String = type + generics + if (nullable && !notNull) "?" else ""
fun copy(): Field = internalCopy().also {
@@ -101,12 +101,11 @@ data class ElementRef(
sealed class Field(
config: FieldConfig,
val name: String,
val nullable: Boolean,
val mutable: Boolean,
override val name: String,
override val nullable: Boolean,
override var isMutable: Boolean,
val isChild: Boolean,
) {
abstract val type: TypeRef
) : AbstractField() {
abstract val baseDefaultValue: CodeBlock?
abstract val baseGetter: CodeBlock?
var isOverride = false
@@ -119,13 +118,32 @@ sealed class Field(
val printProperty = config.printProperty
val generationCallback = config.generationCallback
override fun toString() = "$name: $type"
override fun toString() = "$name: $typeRef"
override val isVolatile: Boolean
get() = false
override val isFinal: Boolean
get() = false
override val isLateinit: Boolean
get() = false
override val isParameter: Boolean
get() = false
override val type: String
get() = typeRef.type
override val packageName: String?
get() = typeRef.packageName
override fun getTypeWithArguments(notNull: Boolean): String = typeRef.getTypeWithArguments(notNull)
}
class SingleField(
config: FieldConfig,
name: String,
override var type: TypeRef,
override var typeRef: TypeRef,
nullable: Boolean,
mutable: Boolean,
isChild: Boolean,
@@ -133,7 +151,7 @@ class SingleField(
override val baseGetter: CodeBlock?,
) : Field(config, name, nullable, mutable, isChild) {
override val transformable: Boolean
get() = mutable
get() = isMutable
}
class ListField(
@@ -148,6 +166,6 @@ class ListField(
override val baseDefaultValue: CodeBlock?,
override val baseGetter: CodeBlock?,
) : Field(config, name, nullable, mutable, isChild) {
override val type: TypeRef
override val typeRef: TypeRef
get() = listType.withArgs(elementType)
}
@@ -125,7 +125,7 @@ private fun replaceElementRefs(config: Config, mapping: Map<ElementConfig, Eleme
for (field in el.fields) {
when (field) {
is SingleField -> {
field.type = transform(field.type)
field.typeRef = transform(field.typeRef)
}
is ListField -> {
field.elementType = transform(field.elementType)
@@ -167,7 +167,7 @@ private fun addAbstractElement(elements: List<Element>) {
private fun configureDescriptorApiAnnotation(elements: List<Element>) {
for (el in elements) {
for (field in el.fields) {
val type = field.type
val type = field.typeRef
if (type is ClassRef<*> && type.packageName.startsWith("org.jetbrains.kotlin.descriptors") &&
type.simpleName.endsWith("Descriptor") && type.simpleName != "ModuleDescriptor"
) {
@@ -192,7 +192,7 @@ private fun processFieldOverrides(elements: List<Element>) {
type.takeUnless { it is InferredOverriddenType } ?: overriddenType
when (field) {
is SingleField -> {
field.type = transformInferredType(field.type, (overriddenField as SingleField).type)
field.typeRef = transformInferredType(field.typeRef, (overriddenField as SingleField).typeRef)
}
is ListField -> {
field.elementType = transformInferredType(field.elementType, (overriddenField as ListField).elementType)
@@ -47,9 +47,9 @@ fun printElements(generationPath: File, model: Model) = sequence {
for (field in element.fields) {
if (!field.printProperty) continue
val poetType = field.type.toPoet().copy(nullable = field.nullable)
val poetType = field.typeRef.toPoet().copy(nullable = field.nullable)
addProperty(PropertySpec.builder(field.name, poetType).apply {
mutable(field.mutable)
mutable(field.isMutable)
if (field.isOverride) {
addModifiers(KModifier.OVERRIDE)
}
@@ -215,13 +215,13 @@ fun printElements(generationPath: File, model: Model) = sequence {
args.add(transformMethodName)
}
is ListField -> {
if (child.mutable) {
if (child.isMutable) {
append(" = ")
append(child.name)
if (child.nullable) append("?")
}
append(".%M(%N, %N)")
args.add(if (child.mutable) transformIfNeeded else transformInPlace)
args.add(if (child.isMutable) transformIfNeeded else transformInPlace)
}
}
@@ -229,7 +229,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
args.add(dataParam)
if (child is SingleField) {
val elRef = child.type as ElementRef
val elRef = child.typeRef as ElementRef
if (!elRef.element.transform) {
append(" as %T")
if (child.nullable) append("?")
@@ -43,7 +43,7 @@ internal fun printFactory(generationPath: File, model: Model): GeneratedFile {
.sortedBy { (_, defaultValue) -> defaultValue != null } // All parameters with default values must go last
fields.forEach { (field, defaultValue) ->
addParameter(
ParameterSpec.builder(field.name, field.type.toPoet().copy(nullable = field.nullable))
ParameterSpec.builder(field.name, field.typeRef.toPoet().copy(nullable = field.nullable))
.defaultValue(defaultValue)
.build(),
)
@@ -124,7 +124,7 @@ fun printTypeVisitor(generationPath: File, model: Model): GeneratedFile {
when (field) {
is SingleField -> addStatement("$access = $transformTypeFunName($visitorParam, $access, data)")
is ListField -> {
if (field.mutable) {
if (field.isMutable) {
addStatement("$access = $access.map { $transformTypeFunName($visitorParam, it, data) }")
} else {
beginControlFlow("for (i in 0 until $access.size)")
@@ -144,7 +144,7 @@ fun printTypeVisitor(generationPath: File, model: Model): GeneratedFile {
val irTypeFields = this.fields
.filter {
val type = when (it) {
is SingleField -> it.type
is SingleField -> it.typeRef
is ListField -> it.elementType
}
type.toString() == irTypeType.toString()
@@ -9,26 +9,26 @@ abstract class AbstractField : Importable {
abstract val name: String
val typeRef: TypeRef
open val typeRef: TypeRef
get() = type(packageName!!, type).withArgs(*arguments.toTypedArray()).copy(nullable = nullable)
open val arguments = mutableListOf<TypeRef>()
abstract val nullable: Boolean
abstract var isVolatile: Boolean
abstract val isVolatile: Boolean
abstract var isFinal: Boolean
abstract val isFinal: Boolean
abstract var isLateinit: Boolean
abstract val isLateinit: Boolean
abstract var isParameter: Boolean
abstract val isParameter: Boolean
open val arbitraryImportables: MutableList<Importable> = mutableListOf()
open var optInAnnotation: ArbitraryImportable? = null
abstract var isMutable: Boolean
abstract val isMutable: Boolean
open val withGetter: Boolean get() = false
open val customSetter: String? get() = null