[IR generator] Better support for fields' default value in base classes

- Allows using those with the incoming IR implementation printer.
- Moves the logic to common tree generator, so other trees can specify
default values in base classes as well, if needed.

^KT-65773 In Progress
This commit is contained in:
Wojciech Litewka
2024-02-15 19:11:25 +01:00
committed by Space Team
parent 288351d733
commit 4d9d1974ec
9 changed files with 56 additions and 30 deletions
@@ -587,6 +587,16 @@ object IrTree : AbstractTreeBuilder() {
+field("isConst", boolean)
+field("isLateinit", boolean)
+field("initializer", expression, nullable = true)
+field("isAssignable", boolean, mutable = false) {
defaultValueInBase = "true"
withGetter = true
additionalImports.add(setValue)
kDoc = """
Variables are assignable by default. This means that they can be used in [${setValue.typeName}].
Variables are assigned in the IR even though they are not 'var' in the input. Hence
the separate assignability flag.
""".trimIndent()
}
}
val packageFragment: Element by element(Declaration) {
ownsChildren = false
@@ -608,8 +618,9 @@ object IrTree : AbstractTreeBuilder() {
}
+field("packageFqName", type<FqName>())
+field("fqName", type<FqName>()) {
baseGetter = "packageFqName"
defaultValueInBase = "packageFqName"
customSetter = "packageFqName = value"
withGetter = true
deprecation = Deprecated(
"Please use `packageFqName` instead",
ReplaceWith("packageFqName"),
@@ -12,8 +12,6 @@ sealed class Field(
override val name: String,
override var isMutable: Boolean,
) : AbstractField<Field>(), AbstractFieldWithDefaultValue<Field> {
var baseGetter: String? = null
sealed class UseFieldAsParameterInIrFactoryStrategy {
data object No : UseFieldAsParameterInIrFactoryStrategy()
@@ -31,28 +29,26 @@ sealed class Field(
UseFieldAsParameterInIrFactoryStrategy.Yes(null)
}
override var withGetter: Boolean
get() = baseGetter != null
set(value) = error("Operation not supported")
override var defaultValueInImplementation: String? by ::baseGetter
override var withGetter: Boolean = false
override var defaultValueInBase: String? = null
override var defaultValueInImplementation: String? = null
override var defaultValueInBuilder: String?
get() = null
set(_) = error("Builders are not supported")
override var customSetter: String? = null
override val origin: Field
get() = this
override var customSetter: String? = null
override fun toString() = "$name: $typeRef"
override val isVolatile: Boolean
get() = false
override val isFinal: Boolean
get() = baseGetter != null
override var isFinal: Boolean = false
override val isParameter: Boolean
get() = false
@@ -61,7 +57,9 @@ sealed class Field(
override fun updateFieldsInCopy(copy: Field) {
super.updateFieldsInCopy(copy)
copy.baseGetter = baseGetter
copy.withGetter = withGetter
copy.defaultValueInBase = defaultValueInBase
copy.defaultValueInImplementation = defaultValueInImplementation
copy.customUseInIrFactoryStrategy = customUseInIrFactoryStrategy
copy.customSetter = customSetter
}