[FIR/IR generator] Factor out allFields to AbstractElement
This commit is contained in:
committed by
Space Team
parent
38ee477ab4
commit
ad4e97154f
-63
@@ -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<Field, MutableMap<Field, Boolean>> = mutableMapOf()
|
||||
val useNullableForReplace: MutableSet<Field> = mutableSetOf()
|
||||
val allImplementations: List<Implementation> by lazy {
|
||||
if (doesNotNeedImplementation) {
|
||||
emptyList()
|
||||
@@ -92,66 +89,6 @@ class Element(name: String, override val propertyName: String, kind: Kind) : Abs
|
||||
}
|
||||
}
|
||||
|
||||
override val allFields: List<Field> by lazy {
|
||||
val result = LinkedHashSet<Field>()
|
||||
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<Field> by lazy {
|
||||
val result = LinkedHashMap<String, Field>()
|
||||
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() }
|
||||
}
|
||||
|
||||
+16
-6
@@ -22,7 +22,6 @@ sealed class Field : AbstractField<Field>() {
|
||||
open var isMutableInInterface: Boolean = false
|
||||
open val fromDelegate: Boolean get() = false
|
||||
|
||||
open val overridenTypes: MutableSet<TypeRefWithNullability> = mutableSetOf()
|
||||
open var useNullableForReplace: Boolean = false
|
||||
open var notNull: Boolean = false
|
||||
|
||||
@@ -38,7 +37,9 @@ sealed class Field : AbstractField<Field>() {
|
||||
|
||||
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<Field>() {
|
||||
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<Field>() {
|
||||
|
||||
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<TypeRefWithNullability>
|
||||
get() = origin.overridenTypes
|
||||
override val overriddenTypes: MutableSet<TypeRefWithNullability>
|
||||
get() = origin.overriddenTypes
|
||||
|
||||
override val arbitraryImportables: MutableList<Importable>
|
||||
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,
|
||||
|
||||
+3
-3
@@ -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<Ele
|
||||
}
|
||||
|
||||
allFields.filter { it.withReplace }.forEach {
|
||||
val override = overridenFields[it, it] && !(it.name == "source" && element == FirTreeBuilder.qualifiedAccessExpression)
|
||||
val override = overriddenFieldsHaveSameClass[it, it] && !(it.name == "source" && element == FirTreeBuilder.qualifiedAccessExpression)
|
||||
it.replaceDeclaration(override, forceNullable = it.useNullableForReplace)
|
||||
for (overriddenType in it.overridenTypes) {
|
||||
for (overriddenType in it.overriddenTypes) {
|
||||
it.replaceDeclaration(true, overriddenType)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -380,7 +380,7 @@ fun SmartPrinter.printImplementation(implementation: Implementation) {
|
||||
}
|
||||
}
|
||||
|
||||
for (overridenType in field.overridenTypes) {
|
||||
for (overridenType in field.overriddenTypes) {
|
||||
generateReplace(field, overridenType) {
|
||||
println("require($newValue is ${field.typeRef.render()})")
|
||||
println("replace$capitalizedFieldName($newValue)")
|
||||
|
||||
-10
@@ -9,16 +9,6 @@ import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import java.io.File
|
||||
|
||||
operator fun <K, V, U> MutableMap<K, MutableMap<V, U>>.set(k1: K, k2: V, value: U) {
|
||||
this.putIfAbsent(k1, mutableMapOf())
|
||||
val map = getValue(k1)
|
||||
map[k2] = value
|
||||
}
|
||||
|
||||
operator fun <K, V, U> Map<K, Map<V, U>>.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)
|
||||
|
||||
Reference in New Issue
Block a user