From 04c5ac0eb6db823840623d7b0e5b55ae1cd24dbd Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Tue, 19 Sep 2023 13:14:25 +0200 Subject: [PATCH] [FIR/IR generator] Factor out adding pure abstract element as parent --- .../checkers/expression/ExpressionCheckers.kt | 2 +- .../fir/declarations/FirTypeParameter.kt | 2 +- .../expressions/FirStringConcatenationCall.kt | 2 +- .../kotlin/fir/tree/generator/Main.kt | 2 ++ .../fir/tree/generator/printer/element.kt | 25 +++++-------------- .../kotlin/ir/generator/model/Model.kt | 2 +- .../ir/generator/model/Transformations.kt | 12 ++------- .../kotlin/ir/generator/print/Elements.kt | 1 + .../kotlin/ir/generator/print/Types.kt | 6 ----- .../kotlin/generators/tree/AbstractElement.kt | 2 +- .../tree/ImplementationKindOwner.kt | 4 --- .../kotlin/generators/tree/TypeRef.kt | 15 +++++++++++ .../generators/tree/addPureAbstractElement.kt | 18 +++++++++++++ 13 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/addPureAbstractElement.kt diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt index 22bf5c6fdbc..6318d3c4bf4 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt @@ -72,7 +72,7 @@ abstract class ExpressionCheckers { @CheckersComponentInternal internal val allGetClassCallCheckers: Set by lazy { getClassCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allSafeCallExpressionCheckers: Set by lazy { safeCallExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allEqualityOperatorCallCheckers: Set by lazy { equalityOperatorCallCheckers + basicExpressionCheckers + callCheckers } - @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set by lazy { stringConcatenationCallCheckers + callCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set by lazy { stringConcatenationCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set by lazy { typeOperatorCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allResolvedQualifierCheckers: Set by lazy { resolvedQualifierCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allConstExpressionCheckers: Set by lazy { constExpressionCheckers + basicExpressionCheckers } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt index 5a041abf4e5..ebbff66e0f9 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirTypeParameter.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess -abstract class FirTypeParameter : FirTypeParameterRef, FirDeclaration() { +abstract class FirTypeParameter : FirDeclaration(), FirTypeParameterRef { abstract override val source: KtSourceElement? abstract override val moduleData: FirModuleData abstract override val origin: FirDeclarationOrigin diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirStringConcatenationCall.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirStringConcatenationCall.kt index 87c52d57952..719831f8e14 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirStringConcatenationCall.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirStringConcatenationCall.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess -abstract class FirStringConcatenationCall : FirCall, FirExpression() { +abstract class FirStringConcatenationCall : FirExpression(), FirCall { abstract override val source: KtSourceElement? abstract override val annotations: List abstract override val argumentList: FirArgumentList diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt index f2ddd970180..0f9866b00f2 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.tree.generator import org.jetbrains.kotlin.fir.tree.generator.printer.generateElements import org.jetbrains.kotlin.fir.tree.generator.util.configureInterfacesAndAbstractClasses import org.jetbrains.kotlin.fir.tree.generator.util.detectBaseTransformerTypes +import org.jetbrains.kotlin.generators.tree.addPureAbstractElement import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.collectPreviouslyGeneratedFiles import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.removeExtraFilesFromPreviousGeneration @@ -22,6 +23,7 @@ fun main(args: Array) { detectBaseTransformerTypes(FirTreeBuilder) ImplementationConfigurator.configureImplementations() configureInterfacesAndAbstractClasses(FirTreeBuilder) + addPureAbstractElement(FirTreeBuilder.elements, pureAbstractElementType) BuilderConfigurator.configureBuilders() val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath) val generatedFiles = generateElements(FirTreeBuilder, generationPath) 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 c58d53fc132..4739e83fcc8 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 @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.tree.generator.printer 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.pureAbstractElementType import org.jetbrains.kotlin.fir.tree.generator.util.get import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.generators.tree.printer.* @@ -42,25 +41,13 @@ fun SmartPrinter.printElement(element: Element) { print("${kind!!.title} $type") print(typeParameters()) - val needPureAbstractElement = this.needPureAbstractElement - val superTypesStrings = elementParents.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() - } + otherParents.map { it.type } - - if (superTypesStrings.isNotEmpty() || needPureAbstractElement) { - print(" : ") - if (needPureAbstractElement) { - print("${pureAbstractElementType.type}()") - if (superTypesStrings.isNotEmpty()) { - print(", ") + val parentRefs = element.parentRefs + if (parentRefs.isNotEmpty()) { + print( + parentRefs.sortedBy { it.typeKind }.joinToString(prefix = " : ") { parent -> + parent.typeWithArguments + parent.inheritanceClauseParenthesis() } - } - print(superTypesStrings.joinToString(", "),) + ) } print(multipleUpperBoundsList()) println(" {") 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 67be007b555..f70d2385e64 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 @@ -23,7 +23,7 @@ class Element( val additionalFactoryMethodParameters: MutableList, ) : AbstractElement() { override var elementParents: List = emptyList() - override var otherParents: List> = emptyList() + override var otherParents: MutableList> = mutableListOf() override val allFields: List get() = fields.toList() 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 329e3673388..32c256b7ca8 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 @@ -44,7 +44,7 @@ fun config2model(config: Config): Model { val rootElement = replaceElementRefs(config, ec2el) configureInterfacesAndAbstractClasses(elements) - addAbstractElement(elements) + addPureAbstractElement(elements, elementBaseType) markLeaves(elements) configureDescriptorApiAnnotation(elements) processFieldOverrides(elements) @@ -120,7 +120,7 @@ private fun replaceElementRefs(config: Config, mapping: Map() el.elementParents = elParents.takeIf { it.isNotEmpty() || el == rootEl.element } ?: listOf(rootEl) - el.otherParents = otherParents.castAll>().toList() + el.otherParents = otherParents.castAll>().toMutableList() el.visitorParent = ec.visitorParent?.let(::transform) as GenericElementRef? el.transformerReturnType = (ec.transformerReturnType?.let(::transform) as GenericElementRef?)?.element @@ -158,14 +158,6 @@ private fun markLeaves(elements: List) { } } -private fun addAbstractElement(elements: List) { - for (el in elements) { - if (el.needPureAbstractElement) { - el.otherParents += elementBaseType - } - } -} - private fun configureDescriptorApiAnnotation(elements: List) { for (el in elements) { for (field in el.fields) { 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 78cfd6ecb79..73f8e9e29e5 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 @@ -13,6 +13,7 @@ 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.generators.tree.TypeRefWithNullability +import org.jetbrains.kotlin.generators.tree.typeKind import org.jetbrains.kotlin.ir.generator.util.tryParameterizedBy import java.io.File import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Types.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Types.kt index 0092f25aba4..03ae06fc190 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Types.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Types.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.generator.model.Element.Companion.elementName2typ import org.jetbrains.kotlin.ir.generator.util.* import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef -import org.jetbrains.kotlin.generators.tree.ElementOrRef as GenericElementOrRef fun Element.toPoet() = ClassName(packageName, typeName) fun Element.toPoetSelfParameterized() = toPoet().parameterizedByIfAny(poetTypeVariables) @@ -67,8 +66,3 @@ fun TypeVariable.toPoet() = TypeVariableName( } ) -val ClassOrElementRef.typeKind: TypeKind - get() = when (this) { - is GenericElementOrRef<*, *> -> element.kind!!.typeKind - is ClassRef<*> -> kind - } 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 b25efa48507..97881bc02d3 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 @@ -22,7 +22,7 @@ abstract class AbstractElement : ElementOrRef, F abstract val elementParents: List> - abstract val otherParents: List> + abstract val otherParents: MutableList> val parentRefs: List get() = elementParents + otherParents diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ImplementationKindOwner.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ImplementationKindOwner.kt index 87f2a5631af..c00317a73ed 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ImplementationKindOwner.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ImplementationKindOwner.kt @@ -9,7 +9,3 @@ interface ImplementationKindOwner : Importable { var kind: ImplementationKind? val allParents: List } - -val ImplementationKindOwner.needPureAbstractElement: Boolean - get() = !(kind?.isInterface ?: false) && - allParents.none { it.kind == ImplementationKind.AbstractClass || it.kind == ImplementationKind.SealedClass } \ No newline at end of file diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeRef.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeRef.kt index ab6a1d5b34c..3e5d1a76289 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeRef.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeRef.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.generators.tree +import org.jetbrains.kotlin.generators.tree.printer.braces import org.jetbrains.kotlin.types.Variance import java.util.* import kotlin.reflect.KClass @@ -196,3 +197,17 @@ inline fun type(vararg args: TypeRef) = T::class.asRef(kind, packageName, name) + +val ClassOrElementRef.typeKind: TypeKind + get() = when (this) { + is ElementOrRef<*, *> -> element.kind!!.typeKind + is ClassRef<*> -> kind + } + +fun ClassOrElementRef.inheritanceClauseParenthesis(): String = when (this) { + is ElementOrRef<*, *> -> element.kind.braces() + is ClassRef<*> -> when (kind) { + TypeKind.Class -> "()" + TypeKind.Interface -> "" + } +} diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/addPureAbstractElement.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/addPureAbstractElement.kt new file mode 100644 index 00000000000..a05bd507e59 --- /dev/null +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/addPureAbstractElement.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.generators.tree + +val ImplementationKindOwner.needPureAbstractElement: Boolean + get() = !(kind?.isInterface ?: false) && + allParents.none { it.kind == ImplementationKind.AbstractClass || it.kind == ImplementationKind.SealedClass } + +fun addPureAbstractElement(elements: List>, pureAbstractElement: ClassRef<*>) { + for (el in elements) { + if (el.needPureAbstractElement) { + el.otherParents.add(pureAbstractElement) + } + } +} \ No newline at end of file