From 38ee477ab498ed3247583fd2525aeb4abfbe9d28 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Tue, 14 Nov 2023 19:04:31 +0100 Subject: [PATCH] [FIR/IR generator] Make `AbstractField` generic over itself This will make some code more type-safe. --- .../kotlin/fir/tree/generator/model/Builder.kt | 2 +- .../jetbrains/kotlin/fir/tree/generator/model/Field.kt | 2 +- .../kotlin/fir/tree/generator/model/Implementation.kt | 2 +- .../fir/tree/generator/printer/implementation.kt | 2 -- .../org/jetbrains/kotlin/ir/generator/model/Model.kt | 2 +- .../kotlin/generators/tree/AbstractElement.kt | 4 ++-- .../kotlin/generators/tree/AbstractElementPrinter.kt | 2 +- .../jetbrains/kotlin/generators/tree/AbstractField.kt | 4 ++-- .../kotlin/generators/tree/AbstractFieldPrinter.kt | 2 +- .../kotlin/generators/tree/AbstractVisitorPrinter.kt | 2 +- .../generators/tree/AbstractVisitorVoidPrinter.kt | 2 +- .../jetbrains/kotlin/generators/tree/FieldContainer.kt | 10 +++++----- .../org/jetbrains/kotlin/generators/tree/TypeRef.kt | 4 ++-- .../kotlin/generators/tree/printer/printUtils.kt | 4 ++-- 14 files changed, 21 insertions(+), 23 deletions(-) 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 2d427f5c750..1e019d3b704 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 @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.generators.tree.* private const val DEFAULT_BUILDER_PACKAGE = "org.jetbrains.kotlin.fir.tree.builder" -sealed class Builder : FieldContainer, TypeRef, Importable { +sealed class Builder : FieldContainer, TypeRef, Importable { val parents: MutableList = mutableListOf() val usedTypes: MutableList = mutableListOf() abstract override val allFields: List 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 e98b10341da..83fce4f9c96 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 @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model import org.jetbrains.kotlin.generators.tree.* -sealed class Field : AbstractField() { +sealed class Field : AbstractField() { open var withReplace: Boolean = false open var needsSeparateTransform: Boolean = false 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 c80ed8400cf..3c695b3944c 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 @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model import org.jetbrains.kotlin.generators.tree.* -class Implementation(val element: Element, val name: String?) : FieldContainer, ImplementationKindOwner { +class Implementation(val element: Element, val name: String?) : FieldContainer, ImplementationKindOwner { override val allParents: List get() = listOf(element) val isDefault = name == null override val typeName = name ?: (element.typeName + "Impl") 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 1d42bf081af..a5851b67a54 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 @@ -159,7 +159,6 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { println() withIndent { for (field in walkableFields) { - check(field is FieldWithDefault) when (field.name) { "explicitReceiver" -> { val explicitReceiver = implementation["explicitReceiver"]!! @@ -226,7 +225,6 @@ fun SmartPrinter.printImplementation(implementation: Implementation) { if (!isInterface && !isAbstract) { printBlock { for (field in transformableChildren) { - check(field is FieldWithDefault) when { field.name == "explicitReceiver" -> { val explicitReceiver = implementation["explicitReceiver"]!! 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 fc235c1a464..5109486c9b9 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 @@ -163,7 +163,7 @@ sealed class Field( override val name: String, override var isMutable: Boolean, val isChild: Boolean, -) : AbstractField() { +) : AbstractField() { var baseDefaultValue: String? = null var baseGetter: String? = null 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 3ae94e3c2ce..d59b051db32 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 @@ -10,9 +10,9 @@ package org.jetbrains.kotlin.generators.tree */ abstract class AbstractElement( val name: String, -) : ElementOrRef, FieldContainer, ImplementationKindOwner +) : ElementOrRef, FieldContainer, ImplementationKindOwner where Element : AbstractElement, - Field : AbstractField { + Field : AbstractField { /** * The fully-qualified name of the property in the tree generator that is used to configure this element. diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt index ef383c1949e..ee504416bc5 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractElementPrinter.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.utils.withIndent /** * A common class for printing FIR or IR tree elements. */ -abstract class AbstractElementPrinter, Field : AbstractField>( +abstract class AbstractElementPrinter, Field : AbstractField>( private val printer: SmartPrinter, ) { diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt index 3eebc7af072..4e567074a74 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.generators.tree -abstract class AbstractField { +abstract class AbstractField> { abstract val name: String @@ -66,7 +66,7 @@ abstract class AbstractField { if (this === other) return true if (other == null) return false if (javaClass != other.javaClass) return false - other as AbstractField + other as AbstractField<*> return name == other.name } diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt index 6207b6f422c..ac56b97adf8 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractFieldPrinter.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent -abstract class AbstractFieldPrinter( +abstract class AbstractFieldPrinter>( private val printer: SmartPrinter, ) { diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt index 2fac6317890..5a4113649e5 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorPrinter.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.withIndent -abstract class AbstractVisitorPrinter, Field : AbstractField>( +abstract class AbstractVisitorPrinter, Field : AbstractField>( val printer: SmartPrinter, ) { diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt index 887b0c50453..8a0d606aad4 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractVisitorVoidPrinter.kt @@ -13,7 +13,7 @@ abstract class AbstractVisitorVoidPrinter( printer: SmartPrinter, ) : AbstractVisitorPrinter(printer) where Element : AbstractElement, - Field : AbstractField { + Field : AbstractField { final override val visitorTypeParameters: List get() = emptyList() diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt index 8a7b59e2733..b20d7f18f91 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/FieldContainer.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.generators.tree -interface FieldContainer { - val allFields: List - operator fun get(fieldName: String): AbstractField? +interface FieldContainer> { + val allFields: List + operator fun get(fieldName: String): Field? val hasAcceptMethod: Boolean get() = false @@ -24,12 +24,12 @@ interface FieldContainer { /** * The fields on which to run the visitor in generated `acceptChildren` methods. */ - val walkableChildren: List + val walkableChildren: List get() = allFields.filter { it.containsElement && !it.withGetter && it.needAcceptAndTransform } /** * The fields on which to run the transformer in generated `transformChildren` methods. */ - val transformableChildren: List + val transformableChildren: List get() = walkableChildren.filter { it.isMutable || it is ListField } } \ 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 eed72a9612b..6afc3c2570b 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 @@ -130,13 +130,13 @@ data class TypeRefWithVariance(val variance: Variance, val type interface ElementOrRef : ParametrizedTypeRef, NamedTypeParameterRef>, ClassOrElementRef where Element : AbstractElement, - Field : AbstractField { + Field : AbstractField { val element: Element override fun copy(nullable: Boolean): ElementRef } -data class ElementRef, Field : AbstractField>( +data class ElementRef, Field : AbstractField>( override val element: Element, override val args: Map = emptyMap(), override val nullable: Boolean = false, diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt index 2968b73b6f7..ec630a40015 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt @@ -280,7 +280,7 @@ fun SmartPrinter.printTransformMethod( context(ImportCollector) fun SmartPrinter.printAcceptChildrenMethod( - element: FieldContainer, + element: FieldContainer<*>, visitorClass: ClassRef, visitorResultType: TypeRef, modality: Modality? = null, @@ -315,7 +315,7 @@ fun SmartPrinter.printAcceptChildrenMethod( context(ImportCollector) fun SmartPrinter.printTransformChildrenMethod( - element: FieldContainer, + element: FieldContainer<*>, transformerClass: ClassRef, returnType: TypeRef, modality: Modality? = null,