From fbdc64cdad6c7313bebf9beb580ecd1fc80a33d7 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Mon, 9 Oct 2023 15:26:13 +0200 Subject: [PATCH] [FIR] In tree generator make it possible to add custom super types ...to element. MR: KT-MR-12245 ^KT-60671 --- .../fir/tree/generator/NodeConfigurator.kt | 1 + .../fir/tree/generator/model/Element.kt | 1 + .../fir/tree/generator/printer/element.kt | 23 +++++++++---------- .../fir/tree/generator/printer/utils.kt | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index a8fcab6d13b..1536a76ed50 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -707,6 +707,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild resolvedTypeRef.configure { +field("type", coneKotlinTypeType) +field("delegatedTypeRef", typeRef, nullable = true) + // TODO: add supertype in subsequent commits } typeRefWithNullability.configure { 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 e67d7ca3a86..b7d245ec411 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 @@ -40,6 +40,7 @@ class Element(override val name: String, kind: Kind) : AbstractElement>() + val additionalSupertypeInterfaces = mutableListOf() var defaultImplementation: Implementation? = null val customImplementations = mutableListOf() 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 4efccb092a7..cfefa7bd4ae 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 @@ -55,25 +55,24 @@ fun SmartPrinter.printElement(element: Element) { print("${kind!!.title} $type") print(typeParameters()) val needPureAbstractElement = !isInterface && !allParents.any { it.kind == ImplementationKind.AbstractClass || it.kind == ImplementationKind.SealedClass } + val superTypesStrings = parentRefs.map { + // TODO: Factor out + var result = it.element.type + if (it.args.isNotEmpty()) { + result += it.args.values.joinToString(", ", "<", ">") { it.typeWithArguments } + } + result + it.element.kind.braces() + } + additionalSupertypeInterfaces.map { it.type } - if (parentRefs.isNotEmpty() || needPureAbstractElement) { + if (superTypesStrings.isNotEmpty() || needPureAbstractElement) { print(" : ") if (needPureAbstractElement) { print("${pureAbstractElementType.type}()") - if (parentRefs.isNotEmpty()) { + if (superTypesStrings.isNotEmpty()) { print(", ") } } - print( - parentRefs.joinToString(", ") { - // TODO: Factor out - var result = it.element.type - if (it.args.isNotEmpty()) { - result += it.args.values.joinToString(", ", "<", ">") { it.typeWithArguments } - } - result + it.element.kind.braces() - }, - ) + print(superTypesStrings.joinToString(", "),) } print(multipleUpperBoundsList()) println(" {") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt index ac97b853e74..b0296ce3066 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt @@ -67,6 +67,7 @@ fun Element.collectImports(): List { if (needPureAbstractElement) { baseTypes += pureAbstractElementType.fullQualifiedName } + baseTypes.addAll(additionalSupertypeInterfaces.map { it.fullQualifiedName!! }) return collectImportsInternal( baseTypes, ImportKind.Element,