FIR tree generator: merge fields from parents properly

This commit is contained in:
Mikhail Glukhikh
2021-03-15 12:41:16 +03:00
parent 7f7a964b2e
commit 06a80c0b34
22 changed files with 94 additions and 88 deletions
@@ -204,13 +204,8 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("value", "T", null)
}
qualifiedAccessExpression.configure {
+field("source", sourceElementType, nullable = true, withReplace = true)
}
functionCall.configure {
+field("calleeReference", namedReference)
+field("source", sourceElementType, nullable = true, withReplace = true)
}
comparisonExpression.configure {
@@ -457,7 +452,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("originalExpression", qualifiedAccessExpression)
+field("typesFromSmartCast", "Collection<ConeKotlinType>", null, customType = coneKotlinTypeType)
+field("originalType", typeRef)
+field("source", sourceElementType, nullable = true, withReplace = true)
}
safeCallExpression.configure {
@@ -475,7 +469,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
callableReferenceAccess.configure {
+field("calleeReference", namedReference, withReplace = true).withTransform()
+booleanField("hasQuestionMarkAtLHS", withReplace = true)
+field("source", sourceElementType, nullable = true, withReplace = true)
}
getClassCall.configure {
@@ -591,7 +584,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
thisReceiverExpression.configure {
+field("calleeReference", thisReference)
+field("source", sourceElementType, nullable = true, withReplace = true)
}
whenExpression.configure {
@@ -104,7 +104,7 @@ class Element(val name: String, kind: Kind) : AbstractElement {
}
val parentFields: List<Field> by lazy {
val result = LinkedHashSet<Field>()
val result = LinkedHashMap<String, Field>()
parents.forEach { parent ->
val fields = parent.allFields.map { field ->
val copy = (field as? SimpleField)?.let { simpleField ->
@@ -119,9 +119,23 @@ class Element(val name: String, kind: Kind) : AbstractElement {
fromParent = true
}
}
result.addAll(fields)
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.toList()
result.values.toList()
}
override val allFirFields: List<Field> by lazy {