From ad4e97154fcdf5f43b26abc48c69e26625f91d10 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Tue, 14 Nov 2023 19:45:41 +0100 Subject: [PATCH] [FIR/IR generator] Factor out `allFields` to `AbstractElement` --- .../fir/tree/generator/model/Element.kt | 63 ------------------- .../kotlin/fir/tree/generator/model/Field.kt | 22 +++++-- .../fir/tree/generator/printer/element.kt | 6 +- .../tree/generator/printer/implementation.kt | 2 +- .../kotlin/fir/tree/generator/util/util.kt | 10 --- .../org/jetbrains/kotlin/ir/generator/Main.kt | 2 - .../generator/config/AbstractTreeBuilder.kt | 8 +-- .../kotlin/ir/generator/model/Model.kt | 57 ++++++++--------- .../ir/generator/model/Transformations.kt | 48 -------------- .../kotlin/ir/generator/print/Elements.kt | 15 ++++- .../kotlin/ir/generator/print/Factory.kt | 2 +- .../kotlin/generators/tree/AbstractElement.kt | 47 +++++++++++++- .../generators/tree/AbstractElementPrinter.kt | 10 +-- .../kotlin/generators/tree/AbstractField.kt | 16 ++++- .../generators/tree/AbstractFieldPrinter.kt | 6 +- .../kotlin/generators/tree/FieldContainer.kt | 7 ++- .../jetbrains/kotlin/generators/tree/utils.kt | 10 +++ 17 files changed, 153 insertions(+), 178 deletions(-) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt index 16b51867fa1..b507a79a3d7 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.tree.generator.model import org.jetbrains.kotlin.fir.tree.generator.printer.BASE_PACKAGE import org.jetbrains.kotlin.fir.tree.generator.printer.safeDecapitalizedName -import org.jetbrains.kotlin.fir.tree.generator.util.set import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.generators.tree.ElementOrRef as GenericElementOrRef import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef @@ -80,8 +79,6 @@ class Element(name: String, override val propertyName: String, kind: Kind) : Abs var doesNotNeedImplementation: Boolean = false val needTransformOtherChildren: Boolean get() = _needTransformOtherChildren || elementParents.any { it.element.needTransformOtherChildren } - val overridenFields: MutableMap> = mutableMapOf() - val useNullableForReplace: MutableSet = mutableSetOf() val allImplementations: List by lazy { if (doesNotNeedImplementation) { emptyList() @@ -92,66 +89,6 @@ class Element(name: String, override val propertyName: String, kind: Kind) : Abs } } - override val allFields: List by lazy { - val result = LinkedHashSet() - result.addAll(fields.toList().asReversed()) - result.forEach { overridenFields[it, it] = false } - for (parentField in parentFields.asReversed()) { - val overrides = !result.add(parentField) - if (overrides) { - val existingField = result.first { it == parentField } - existingField.fromParent = true - existingField.needsSeparateTransform = existingField.needsSeparateTransform || parentField.needsSeparateTransform - existingField.needTransformInOtherChildren = existingField.needTransformInOtherChildren || parentField.needTransformInOtherChildren - existingField.withReplace = parentField.withReplace || existingField.withReplace - existingField.parentHasSeparateTransform = parentField.needsSeparateTransform - if (parentField.typeRef.copy(nullable = false) != existingField.typeRef.copy(nullable = false) && parentField.withReplace) { - existingField.overridenTypes += parentField.typeRef - overridenFields[existingField, parentField] = false - } else { - overridenFields[existingField, parentField] = true - if (parentField.nullable != existingField.nullable) { - existingField.useNullableForReplace = true - } - } - } else { - overridenFields[parentField, parentField] = true - } - } - result.toList().asReversed() - } - - val parentFields: List by lazy { - val result = LinkedHashMap() - elementParents.forEach { parentRef -> - val parent = parentRef.element - val fields = parent.allFields.map { field -> - val copy = (field as? SimpleField)?.let { simpleField -> - simpleField.replaceType(simpleField.typeRef.substitute(parentRef.args) as TypeRefWithNullability) - } ?: field.copy() - copy.apply { - fromParent = true - } - } - fields.forEach { - result.merge(it.name, it) { previousField, thisField -> - val resultField = previousField.copy() - if (thisField.withReplace) { - resultField.withReplace = true - } - if (thisField.useNullableForReplace) { - resultField.useNullableForReplace = true - } - if (thisField.isMutable) { - resultField.isMutable = true - } - resultField - } - } - } - result.values.toList() - } - override fun toString(): String { return with(ImportCollector("")) { render() } } 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 83fce4f9c96..581219b47cd 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 @@ -22,7 +22,6 @@ sealed class Field : AbstractField() { open var isMutableInInterface: Boolean = false open val fromDelegate: Boolean get() = false - open val overridenTypes: MutableSet = mutableSetOf() open var useNullableForReplace: Boolean = false open var notNull: Boolean = false @@ -38,7 +37,9 @@ sealed class Field : AbstractField() { abstract override var isMutable: Boolean - fun copy(): Field = internalCopy().also { + override fun replaceType(newType: TypeRefWithNullability): Field = copy() + + override fun copy(): Field = internalCopy().also { updateFieldsInCopy(it) } @@ -48,7 +49,7 @@ sealed class Field : AbstractField() { copy.needTransformInOtherChildren = needTransformInOtherChildren copy.useInBaseTransformerDetection = useInBaseTransformerDetection copy.isMutable = isMutable - copy.overridenTypes += overridenTypes + copy.overriddenTypes += overriddenTypes copy.arbitraryImportables += arbitraryImportables copy.useNullableForReplace = useNullableForReplace copy.customInitializationCall = customInitializationCall @@ -61,6 +62,15 @@ sealed class Field : AbstractField() { protected abstract fun internalCopy(): Field + override fun updatePropertiesFromOverriddenField(parentField: Field, haveSameClass: Boolean) { + needsSeparateTransform = needsSeparateTransform || parentField.needsSeparateTransform + needTransformInOtherChildren = needTransformInOtherChildren || parentField.needTransformInOtherChildren + withReplace = withReplace || parentField.withReplace + parentHasSeparateTransform = parentField.needsSeparateTransform + if (parentField.nullable != nullable && haveSameClass) { + useNullableForReplace = true + } + } } // ----------- Field with default ----------- @@ -112,8 +122,8 @@ class FieldWithDefault(val origin: Field) : Field() { override var withGetter: Boolean = false override var customSetter: String? = null override var fromDelegate: Boolean = false - override val overridenTypes: MutableSet - get() = origin.overridenTypes + override val overriddenTypes: MutableSet + get() = origin.overriddenTypes override val arbitraryImportables: MutableList get() = origin.arbitraryImportables @@ -158,7 +168,7 @@ class SimpleField( } } - fun replaceType(newType: TypeRefWithNullability) = SimpleField( + override fun replaceType(newType: TypeRefWithNullability) = SimpleField( name = name, typeRef = newType, withReplace = withReplace, diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/element.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/element.kt index 62271e620c9..91f78636a86 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/element.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/element.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.tree.generator.* import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.model.Element import org.jetbrains.kotlin.fir.tree.generator.model.Field -import org.jetbrains.kotlin.fir.tree.generator.util.get +import org.jetbrains.kotlin.generators.tree.get import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.generators.tree.printer.* import org.jetbrains.kotlin.utils.SmartPrinter @@ -43,9 +43,9 @@ private class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter MutableMap>.set(k1: K, k2: V, value: U) { - this.putIfAbsent(k1, mutableMapOf()) - val map = getValue(k1) - map[k2] = value -} - -operator fun Map>.get(k1: K, k2: V): U { - return getValue(k1).getValue(k2) -} - inline fun File.writeToFileUsingSmartPrinterIfFileContentChanged(block: SmartPrinter.() -> Unit) { val newText = buildString { SmartPrinter(this).block() } GeneratorsFileUtil.writeFileIfContentChanged(this, newText, logNotChanged = false) diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/Main.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/Main.kt index 8c2e92918e0..d336736675b 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/Main.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/Main.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.collectPreviously import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.removeExtraFilesFromPreviousGeneration import org.jetbrains.kotlin.ir.generator.model.addWalkableChildren import org.jetbrains.kotlin.ir.generator.model.markLeaves -import org.jetbrains.kotlin.ir.generator.model.processFieldOverrides import org.jetbrains.kotlin.ir.generator.print.* import java.io.File @@ -29,7 +28,6 @@ fun main(args: Array) { InterfaceAndAbstractClassConfigurator(model.elements).configureInterfacesAndAbstractClasses() addPureAbstractElement(model.elements, elementBaseType) markLeaves(model.elements) - processFieldOverrides(model.elements) addWalkableChildren(model.elements) val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath) diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt index 9f8492f790c..1d73904cb4b 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt @@ -72,19 +72,19 @@ abstract class AbstractTreeBuilder { protected fun field( name: String, - type: TypeRefWithNullability?, + type: TypeRefWithNullability, nullable: Boolean = false, mutable: Boolean = true, isChild: Boolean = false, initializer: SingleField.() -> Unit = {} ): SingleField { checkChildType(isChild, type, name) - return SingleField(name, type?.copy(nullable) ?: InferredOverriddenType, mutable, isChild).apply(initializer) + return SingleField(name, type.copy(nullable), mutable, isChild).apply(initializer) } protected fun listField( name: String, - elementType: TypeRef?, + elementType: TypeRef, nullable: Boolean = false, mutability: ListField.Mutability, isChild: Boolean = false, @@ -98,7 +98,7 @@ abstract class AbstractTreeBuilder { } return ListField( name = name, - baseType = elementType ?: InferredOverriddenType, + baseType = elementType, listType = listType, isNullable = nullable, mutable = mutability == ListField.Mutability.Var, 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 5109486c9b9..cade4e4f69b 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 @@ -42,10 +42,6 @@ class Element( var generateIrFactoryMethod = category == Category.Declaration val fieldsToSkipInIrFactoryMethod = hashSetOf() - - override val allFields: List - get() = fields.toList() - override val element: Element get() = this @@ -124,29 +120,6 @@ class Element( override fun toString() = name - fun elementParentsRecursively(): List { - val linkedSet = buildSet { - fun recurse(element: Element) { - addAll(element.elementParents) - element.elementParents.forEach { recurse(it.element) } - } - recurse(this@Element) - } - return topologicalSort(linkedSet) { - element.elementParents - } - } - - fun allFieldsRecursively(): List { - val parentFields = elementParentsRecursively() - .reversed() - .flatMap { it.element.fields } - return (parentFields + fields) - .asReversed() - .distinctBy { it.name } - .asReversed() - } - operator fun TypeVariable.unaryPlus() = apply { params.add(this) } @@ -198,6 +171,24 @@ sealed class Field( override val isParameter: Boolean get() = false + + override fun copy() = internalCopy().also(::updateFieldsInCopy) + + protected fun updateFieldsInCopy(copy: Field) { + copy.useInBaseTransformerDetection = useInBaseTransformerDetection + copy.isMutable = isMutable + copy.optInAnnotation = optInAnnotation + copy.baseDefaultValue = baseDefaultValue + copy.baseGetter = baseGetter + copy.useInIrFactoryStrategy = useInIrFactoryStrategy + copy.fromParent = fromParent + copy.customSetter = customSetter + copy.visibility = visibility + copy.deprecation = deprecation + copy.kDoc = kDoc + } + + protected abstract fun internalCopy(): Field } class SingleField( @@ -205,7 +196,13 @@ class SingleField( override var typeRef: TypeRefWithNullability, mutable: Boolean, isChild: Boolean, -) : Field(name, mutable, isChild) +) : Field(name, mutable, isChild) { + + override fun replaceType(newType: TypeRefWithNullability) = + SingleField(name, newType, isMutable, isChild).also(::updateFieldsInCopy) + + override fun internalCopy() = SingleField(name, typeRef, isMutable, isChild) +} class ListField( name: String, @@ -219,6 +216,10 @@ class ListField( override val typeRef: ClassRef get() = listType.withArgs(baseType).copy(isNullable) + override fun replaceType(newType: TypeRefWithNullability) = copy() + + override fun internalCopy() = ListField(name, baseType, isNullable, listType, isMutable, isChild) + enum class Mutability { Var, MutableList, 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 82d9d80cea7..809554a8ac5 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 @@ -7,21 +7,6 @@ package org.jetbrains.kotlin.ir.generator.model import org.jetbrains.kotlin.generators.tree.* -internal object InferredOverriddenType : TypeRefWithNullability { - - context(ImportCollector) - override fun renderTo(appendable: Appendable) { - renderingIsNotSupported() - } - - override fun substitute(map: TypeParameterSubstitutionMap) = this - - override val nullable: Boolean - get() = false - - override fun copy(nullable: Boolean) = this -} - typealias Model = org.jetbrains.kotlin.generators.tree.Model internal fun markLeaves(elements: List) { @@ -40,39 +25,6 @@ internal fun markLeaves(elements: List) { } } -internal fun processFieldOverrides(elements: List) { - for (element in iterateElementsParentFirst(elements)) { - for (field in element.fields) { - fun visitParents(visited: Element) { - for (parent in visited.elementParents) { - val overriddenField = parent.element.fields.singleOrNull { it.name == field.name } - if (overriddenField != null) { - field.fromParent = true - field.optInAnnotation = field.optInAnnotation ?: overriddenField.optInAnnotation - - fun transformInferredType(type: TypeRef, overriddenType: TypeRef) = - type.takeUnless { it is InferredOverriddenType } ?: overriddenType - when (field) { - is SingleField -> { - field.typeRef = - transformInferredType(field.typeRef, (overriddenField as SingleField).typeRef) as TypeRefWithNullability - } - is ListField -> { - field.baseType = transformInferredType(field.baseType, (overriddenField as ListField).baseType) - } - } - - break - } - - visitParents(parent.element) - } - } - - visitParents(element) - } - } -} internal fun addWalkableChildren(elements: List) { for (element in elements) { 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 e24b6734728..9652b320b16 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 @@ -11,11 +11,12 @@ import org.jetbrains.kotlin.ir.generator.BASE_PACKAGE import org.jetbrains.kotlin.ir.generator.TREE_GENERATOR_README import org.jetbrains.kotlin.ir.generator.elementTransformerType import org.jetbrains.kotlin.ir.generator.elementVisitorType -import org.jetbrains.kotlin.ir.generator.model.* +import org.jetbrains.kotlin.ir.generator.model.Element +import org.jetbrains.kotlin.ir.generator.model.Field import org.jetbrains.kotlin.ir.generator.model.ListField import org.jetbrains.kotlin.ir.generator.model.Model +import org.jetbrains.kotlin.ir.generator.model.SingleField import org.jetbrains.kotlin.utils.SmartPrinter -import org.jetbrains.kotlin.utils.withIndent import java.io.File import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef @@ -34,6 +35,16 @@ private class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter = element.fields.map { field -> + field.copy().apply { + if (field in element.parentFields) { + fromParent = true + } + } + } + context(ImportCollector) override fun SmartPrinter.printAdditionalMethods(element: Element) { element.generationCallback?.invoke(this@ImportCollector, this) 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 b68fc207875..ca3439c32e5 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 @@ -255,7 +255,7 @@ private class FactoryMethod(val element: Element) { val name = "create" + element.name.capitalizeAsciiOnly() - val parameters = (element.allFieldsRecursively() + element.additionalIrFactoryMethodParameters) + val parameters = (element.allFields + element.additionalIrFactoryMethodParameters) .filterNot { it.name in element.fieldsToSkipInIrFactoryMethod } .mapNotNull { field -> (field.useInIrFactoryStrategy as? Field.UseFieldAsParameterInIrFactoryStrategy.Yes)?.let { diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElement.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElement.kt index d59b051db32..b03bc344228 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElement.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElement.kt @@ -78,7 +78,52 @@ abstract class AbstractElement( } } - abstract override val allFields: List + override val allFields: List by lazy { + val result = LinkedHashSet() + result.addAll(fields.toList().asReversed()) + result.forEach { overriddenFieldsHaveSameClass[it, it] = false } + for (parentField in parentFields.asReversed()) { + val overrides = !result.add(parentField) + if (overrides) { + val existingField = result.first { it == parentField } + existingField.fromParent = true + val haveSameClass = parentField.typeRef.copy(nullable = false) == existingField.typeRef.copy(nullable = false) + if (!haveSameClass) { + existingField.overriddenTypes += parentField.typeRef + } + overriddenFieldsHaveSameClass[existingField, parentField] = haveSameClass + existingField.updatePropertiesFromOverriddenField(parentField, haveSameClass) + } else { + overriddenFieldsHaveSameClass[parentField, parentField] = true + } + } + result.toList().asReversed() + } + + val overriddenFieldsHaveSameClass: MutableMap> = mutableMapOf() + + val parentFields: List by lazy { + val result = LinkedHashMap() + elementParents.forEach { parentRef -> + val parent = parentRef.element + val fields = parent.allFields.map { field -> + field.replaceType(field.typeRef.substitute(parentRef.args) as TypeRefWithNullability) + .apply { + fromParent = true + } + } + fields.forEach { + result.merge(it.name, it) { previousField, thisField -> + val resultField = previousField.copy() + if (thisField.isMutable) { + resultField.isMutable = true + } + resultField + } + } + } + result.values.toList() + } /** * A custom return type of the corresponding transformer method for this element. diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt index ee504416bc5..ca6ddd87991 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt @@ -27,6 +27,8 @@ abstract class AbstractElementPrinter, protected open val separateFieldsWithBlankLine: Boolean get() = false + protected open fun filterFields(element: Element): Collection = element.allFields + context(ImportCollector) fun printElement(element: Element) { printer.run { @@ -49,11 +51,9 @@ abstract class AbstractElementPrinter, val body = SmartPrinter(StringBuilder()).apply { val fieldPrinter = makeFieldPrinter(this) withIndent { - for (field in element.allFields) { - if ( - !field.withGetter && field.defaultValueInImplementation == null && field.isFinal && field.fromParent || - field.isParameter - ) { + for (field in filterFields(element)) { + if (field.isParameter) continue + if (!field.withGetter && field.defaultValueInImplementation == null && field.isFinal && field.fromParent) { continue } if (separateFieldsWithBlankLine) println() 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 4e567074a74..f1e2a30e171 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 @@ -28,7 +28,7 @@ abstract class AbstractField> { open var optInAnnotation: ClassRef<*>? = null - abstract val isMutable: Boolean + abstract var isMutable: Boolean open val withGetter: Boolean get() = false open val customSetter: String? get() = null @@ -58,6 +58,10 @@ abstract class AbstractField> { */ var needAcceptAndTransform: Boolean = true + open val overriddenTypes: MutableSet = mutableSetOf() + + open fun updatePropertiesFromOverriddenField(parentField: Field, haveSameClass: Boolean) {} + override fun toString(): String { return name } @@ -73,4 +77,14 @@ abstract class AbstractField> { override fun hashCode(): Int { return name.hashCode() } + + /** + * Returns a copy of this field with its [typeRef] set to [newType] (if it's possible). + */ + abstract fun replaceType(newType: TypeRefWithNullability): Field + + /** + * Returns a copy of this field. + */ + abstract fun copy(): Field } diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt index ac56b97adf8..432a219378c 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt @@ -34,7 +34,9 @@ abstract class AbstractFieldPrinter>( modality: Modality? = null, ) { printer.run { - printKDoc(field.kDoc) + if (!field.fromParent) { + printKDoc(field.kDoc) + } field.deprecation?.let { println("@Deprecated(") @@ -107,4 +109,4 @@ abstract class AbstractFieldPrinter>( } } } -} \ No newline at end of file +} diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt index b20d7f18f91..be1a20af3a4 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt @@ -6,7 +6,12 @@ package org.jetbrains.kotlin.generators.tree interface FieldContainer> { + + /** + * All the fields of this element, including the fields of all its parents. + */ val allFields: List + operator fun get(fieldName: String): Field? val hasAcceptMethod: Boolean @@ -32,4 +37,4 @@ interface FieldContainer> { */ val transformableChildren: List get() = walkableChildren.filter { it.isMutable || it is ListField } -} \ No newline at end of file +} diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/utils.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/utils.kt index 786bb4c5103..98079c7ae0b 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/utils.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/utils.kt @@ -36,4 +36,14 @@ fun > detectBaseTransformerTypes(model: Mo } } } +} + +operator fun MutableMap>.set(k1: K, k2: V, value: U) { + this.putIfAbsent(k1, mutableMapOf()) + val map = getValue(k1) + map[k2] = value +} + +operator fun Map>.get(k1: K, k2: V): U { + return getValue(k1).getValue(k2) } \ No newline at end of file