[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:
committed by
Space Team
parent
15751333e3
commit
f9d17a2d51
+10
@@ -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 {
|
||||
|
||||
+27
-9
@@ -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)
|
||||
}
|
||||
|
||||
+3
-3
@@ -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)
|
||||
|
||||
+5
-5
@@ -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("?")
|
||||
|
||||
+1
-1
@@ -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(),
|
||||
)
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
+6
-6
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user