From 977e3164898d5f889136483fc929706ff739850b Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Thu, 7 Sep 2023 15:15:02 +0200 Subject: [PATCH] [FIR generator] Factor out `TypeArgument` to common module This is a step towards commonizing the code generator between FIR and IR: KT-61970 --- .../fir/tree/generator/NodeConfigurator.kt | 1 + .../context/AbstractFieldConfigurator.kt | 2 ++ .../fir/tree/generator/model/Builder.kt | 5 ++++ .../fir/tree/generator/model/Element.kt | 29 ++++--------------- .../fir/tree/generator/model/ElementUtils.kt | 2 +- .../kotlin/fir/tree/generator/model/Field.kt | 8 ++++- .../tree/generator/model/Implementation.kt | 5 ++++ .../kotlin/fir/tree/generator/model/Type.kt | 3 ++ .../fir/tree/generator/printer/builder.kt | 1 + .../fir/tree/generator/printer/element.kt | 1 + .../tree/generator/printer/implementation.kt | 1 + .../fir/tree/generator/printer/transformer.kt | 1 + .../fir/tree/generator/printer/utils.kt | 20 ++----------- .../fir/tree/generator/printer/visitor.kt | 1 + .../generators/tree/ArbitrarilyImportable.kt | 4 ++- .../kotlin/generators/tree/Importable.kt | 6 +++- .../kotlin/generators/tree/TypeArgument.kt | 28 ++++++++++++++++++ 17 files changed, 72 insertions(+), 46 deletions(-) create mode 100644 generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeArgument.kt 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 204f5b11e15..1edaf6ab46f 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 @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFieldConfigurator import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder.Companion.baseFirElement import org.jetbrains.kotlin.fir.tree.generator.context.type import org.jetbrains.kotlin.fir.tree.generator.model.* +import org.jetbrains.kotlin.generators.tree.SimpleTypeArgument import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuilder) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt index 51848afd3bf..769928704e9 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.tree.generator.context import org.jetbrains.kotlin.fir.tree.generator.model.* import org.jetbrains.kotlin.generators.tree.ImplementationKind import org.jetbrains.kotlin.generators.tree.Importable +import org.jetbrains.kotlin.generators.tree.SimpleTypeArgument +import org.jetbrains.kotlin.generators.tree.TypeArgumentWithMultipleUpperBounds abstract class AbstractFieldConfigurator(private val builder: T) { inner class ConfigureContext(val element: Element) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Builder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Builder.kt index 2c82a28013b..573774b765d 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Builder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Builder.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model +import org.jetbrains.kotlin.fir.tree.generator.printer.generics import org.jetbrains.kotlin.generators.tree.FieldContainer import org.jetbrains.kotlin.generators.tree.Importable @@ -42,6 +43,8 @@ class LeafBuilder(val implementation: Implementation) : Builder() { "${implementation.element.type}Builder" } + override fun getTypeWithArguments(notNull: Boolean): String = type + implementation.element.generics + override val allFields: List by lazy { implementation.fieldsWithoutDefault } override val uselessFields: List by lazy { @@ -68,4 +71,6 @@ class IntermediateBuilder(override val type: String) : Builder() { override val uselessFields: List = emptyList() override var packageName: String = DEFAULT_BUILDER_PACKAGE + + override fun getTypeWithArguments(notNull: Boolean): String = type } 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 049a22df1f0..c3c3f2e6a72 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 @@ -6,11 +6,13 @@ 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.typeWithArguments +import org.jetbrains.kotlin.fir.tree.generator.printer.generics +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.fir.tree.generator.util.set import org.jetbrains.kotlin.generators.tree.FieldContainer import org.jetbrains.kotlin.generators.tree.ImplementationKind import org.jetbrains.kotlin.generators.tree.Importable +import org.jetbrains.kotlin.generators.tree.TypeArgument import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner interface AbstractElement : FieldContainer, ImplementationKindOwner { @@ -34,6 +36,8 @@ interface AbstractElement : FieldContainer, ImplementationKindOwner { get() = false override val allParents: List get() = parents + + override fun getTypeWithArguments(notNull: Boolean): String = type + generics } class Element(override val name: String, kind: Kind) : AbstractElement { @@ -180,26 +184,3 @@ class ElementWithArguments(val element: Element, override val typeArguments: Lis return element.hashCode() } } - -sealed class TypeArgument(val name: String) { - abstract val upperBounds: List -} - -class SimpleTypeArgument(name: String, val upperBound: Importable?) : TypeArgument(name) { - override val upperBounds: List = listOfNotNull(upperBound) - - override fun toString(): String { - var result = name - if (upperBound != null) { - result += " : ${upperBound.typeWithArguments}" - } - return result - } -} - -class TypeArgumentWithMultipleUpperBounds(name: String, override val upperBounds: List) : TypeArgument(name) { - override fun toString(): String { - return name - } -} - diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt index 7d78e58d6e9..aa4dd31d83e 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.context.type -import org.jetbrains.kotlin.fir.tree.generator.printer.typeWithArguments +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.generators.tree.Importable // ----------- Simple field ----------- 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 d968079ba01..b87b025c82a 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 @@ -5,7 +5,8 @@ package org.jetbrains.kotlin.fir.tree.generator.model -import org.jetbrains.kotlin.fir.tree.generator.printer.typeWithArguments +import org.jetbrains.kotlin.fir.tree.generator.printer.generics +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.generators.tree.ArbitraryImportable import org.jetbrains.kotlin.generators.tree.Importable import org.jetbrains.kotlin.generators.tree.AbstractField @@ -30,6 +31,8 @@ sealed class Field : AbstractField() { var withBindThis = true + override fun getTypeWithArguments(notNull: Boolean): String = type + generics + if (nullable && !notNull) "?" else "" + fun copy(): Field = internalCopy().also { updateFieldsInCopy(it) } @@ -207,6 +210,9 @@ class FirField( override var isLateinit: Boolean = false override var isParameter: Boolean = false + override fun getTypeWithArguments(notNull: Boolean): String = + element.getTypeWithArguments(notNull) + if (nullable && !notNull) "?" else "" + override fun internalCopy(): Field { return FirField( name, diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt index e37d230598e..388024f3c30 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model +import org.jetbrains.kotlin.fir.tree.generator.printer.generics import org.jetbrains.kotlin.generators.tree.* class ImplementationWithArg( @@ -12,6 +13,8 @@ class ImplementationWithArg( val argument: Importable? ) : FieldContainer by implementation, ImplementationKindOwner by implementation { val element: Element get() = implementation.element + + override fun getTypeWithArguments(notNull: Boolean): String = type + generics } class Implementation(val element: Element, val name: String?) : FieldContainer, ImplementationKindOwner { @@ -37,6 +40,8 @@ class Implementation(val element: Element, val name: String?) : FieldContainer, } } + override fun getTypeWithArguments(notNull: Boolean): String = type + element.generics + override val packageName = element.packageName + ".impl" val usedTypes = mutableListOf() val arbitraryImportables = mutableListOf() diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt index 11ab9a12829..e17d8929269 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt @@ -5,8 +5,11 @@ package org.jetbrains.kotlin.fir.tree.generator.model +import org.jetbrains.kotlin.fir.tree.generator.printer.generics import org.jetbrains.kotlin.generators.tree.Importable data class Type(override val packageName: String?, override val type: String, val firType: Boolean = false) : Importable { val arguments = mutableListOf() + + override fun getTypeWithArguments(notNull: Boolean): String = type + generics } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt index a131f587785..0f8b31d3bc6 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/builder.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer import org.jetbrains.kotlin.fir.tree.generator.declarationAttributesType import org.jetbrains.kotlin.fir.tree.generator.model.* +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent import java.io.File 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 e7f78e59b1b..00ca42de43a 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 @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.generators.tree.ImplementationKind import org.jetbrains.kotlin.generators.tree.Importable import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType import org.jetbrains.kotlin.fir.tree.generator.util.get +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent import java.io.File diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt index b14e43289ae..5bfb2ae79bd 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/implementation.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.tree.generator.model.* import org.jetbrains.kotlin.generators.tree.ImplementationKind import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType import org.jetbrains.kotlin.generators.tree.Importable +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty import org.jetbrains.kotlin.utils.withIndent diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt index fe907a385a2..53e815bde24 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/transformer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.model.Element +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent 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 b96bdd55b4b..793c415ba57 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 @@ -8,12 +8,10 @@ package org.jetbrains.kotlin.fir.tree.generator.printer import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.firImplementationDetailType import org.jetbrains.kotlin.fir.tree.generator.model.* -import org.jetbrains.kotlin.generators.tree.ImplementationKind import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType -import org.jetbrains.kotlin.generators.tree.Importable -import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner -import java.io.File +import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty +import java.io.File class GeneratedFile(val file: File, val newText: String) @@ -168,20 +166,6 @@ fun ImplementationKind?.braces(): String = when (this) { val Element.safeDecapitalizedName: String get() = if (name == "Class") "klass" else name.replaceFirstChar(Char::lowercaseChar) -val Importable.typeWithArguments: String get() = getTypeWithArguments() - -fun Importable.getTypeWithArguments(notNull: Boolean = false): String = when (this) { - is AbstractElement -> type + generics - is Implementation -> type + element.generics - is FirField -> element.getTypeWithArguments(notNull) + if (nullable && !notNull) "?" else "" - is Field -> type + generics + if (nullable && !notNull) "?" else "" - is Type -> type + generics - is ImplementationWithArg -> type + generics - is LeafBuilder -> type + implementation.element.generics - is IntermediateBuilder -> type - else -> throw IllegalArgumentException() -} - val ImplementationWithArg.generics: String get() = argument?.let { "<${it.type}>" } ?: "" diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt index 6c1b9be2900..ac2b7e4e6f0 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.model.Element +import org.jetbrains.kotlin.generators.tree.typeWithArguments import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent import java.io.File diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ArbitrarilyImportable.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ArbitrarilyImportable.kt index 81d2bbeac5c..92136da5583 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ArbitrarilyImportable.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/ArbitrarilyImportable.kt @@ -5,4 +5,6 @@ package org.jetbrains.kotlin.generators.tree -data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable \ No newline at end of file +data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable { + override fun getTypeWithArguments(notNull: Boolean): String = type +} \ No newline at end of file diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/Importable.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/Importable.kt index 11c8018d9de..e155b48dcae 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/Importable.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/Importable.kt @@ -9,4 +9,8 @@ interface Importable { val type: String val packageName: String? val fullQualifiedName: String? get() = packageName?.let { "$it.${type.replace(Regex("<.+>"), "")}" } -} \ No newline at end of file + + fun getTypeWithArguments(notNull: Boolean = false): String +} + +val Importable.typeWithArguments: String get() = getTypeWithArguments() \ No newline at end of file diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeArgument.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeArgument.kt new file mode 100644 index 00000000000..6fc149ff5b0 --- /dev/null +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/TypeArgument.kt @@ -0,0 +1,28 @@ +/* + * 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 + +sealed class TypeArgument(val name: String) { + abstract val upperBounds: List +} + +class SimpleTypeArgument(name: String, val upperBound: Importable?) : TypeArgument(name) { + override val upperBounds: List = listOfNotNull(upperBound) + + override fun toString(): String { + var result = name + if (upperBound != null) { + result += " : ${upperBound.typeWithArguments}" + } + return result + } +} + +class TypeArgumentWithMultipleUpperBounds(name: String, override val upperBounds: List) : TypeArgument(name) { + override fun toString(): String { + return name + } +} \ No newline at end of file