diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt index bf8e7b94bf5..a8fbe9e67ec 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt @@ -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 { diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt index 405fb06319b..4060b9de2e2 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt @@ -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) } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt index b938c4bc37c..0c758dd74c5 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt @@ -125,7 +125,7 @@ private fun replaceElementRefs(config: Config, mapping: Map { - 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) { private fun configureDescriptorApiAnnotation(elements: List) { 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) { 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) diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt index 74fb0e05895..cafe9ed5a41 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt @@ -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("?") diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Factory.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Factory.kt index cc9948bc02a..31400ffd36d 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Factory.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Factory.kt @@ -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(), ) diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/VisitorsAndTransformers.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/VisitorsAndTransformers.kt index 37e5616da94..28f492362bb 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/VisitorsAndTransformers.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/VisitorsAndTransformers.kt @@ -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() diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt index 4d3683ea324..aebfad6c8b1 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt @@ -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() 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 = 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