diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 12e34bcb2bf..d69840db7aa 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -68,7 +68,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } default("delegate") { - needAcceptAndTransform = false + isChild = false } } @@ -88,14 +88,14 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(annotationCall) { commonAnnotationConfig() default("argumentMapping") { - needAcceptAndTransform = false + isChild = false } } impl(errorAnnotationCall) { commonAnnotationConfig() default("argumentMapping") { - needAcceptAndTransform = false + isChild = false } default("annotationResolvePhase") { value = "FirAnnotationResolvePhase.Types" @@ -513,7 +513,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(resolvedTypeRef) { publicImplementation() default("delegatedTypeRef") { - needAcceptAndTransform = false + isChild = false } } 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 2ccf311bd43..b4718d60576 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 @@ -127,7 +127,7 @@ class FieldWithDefault(override val origin: Field) : Field(), AbstractFieldWithD it.isMutable = isMutable it.withGetter = withGetter it.fromDelegate = fromDelegate - it.needAcceptAndTransform = needAcceptAndTransform + it.isChild = isChild } } } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index 32b6c59477a..648a5cccc69 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -104,8 +104,7 @@ object IrTree : AbstractTreeBuilder() { +descriptor("DeclarationDescriptor") +field("origin", type(Packages.declarations, "IrDeclarationOrigin")) - +field("parent", declarationParent) { - needAcceptAndTransform = false + +field("parent", declarationParent, isChild = false) { skipInIrFactory() } +factory @@ -316,13 +315,11 @@ object IrTree : AbstractTreeBuilder() { idempotence invariant and can contain a chain of declarations. """.trimIndent() - +field("attributeOwnerId", attributeContainer) { - needAcceptAndTransform = false + +field("attributeOwnerId", attributeContainer, isChild = false) { skipInIrFactory() } // null <=> this element wasn't inlined - +field("originalBeforeInline", attributeContainer, nullable = true) { - needAcceptAndTransform = false + +field("originalBeforeInline", attributeContainer, nullable = true, isChild = false) { skipInIrFactory() } } @@ -552,9 +549,7 @@ object IrTree : AbstractTreeBuilder() { +listField("importedScripts", scriptSymbolType, mutability = Var, nullable = true) +listField("earlierScripts", scriptSymbolType, mutability = Var, nullable = true) +field("targetClass", classSymbolType, nullable = true) - +field("constructor", constructor, nullable = true) { // K1 - needAcceptAndTransform = false - } + +field("constructor", constructor, nullable = true, isChild = false) // K1 } val simpleFunction: Element by element(Declaration) { isLeaf = true @@ -645,9 +640,7 @@ object IrTree : AbstractTreeBuilder() { parent(metadataSourceOwner) +symbol(fileSymbolType) - +field("module", moduleFragment) { - needAcceptAndTransform = false - } + +field("module", moduleFragment, isChild = false) +field("fileEntry", type(Packages.tree, "IrFileEntry")) } @@ -659,13 +652,11 @@ object IrTree : AbstractTreeBuilder() { parent(varargElement) parent(attributeContainer) - +field("attributeOwnerId", attributeContainer) { - needAcceptAndTransform = false + +field("attributeOwnerId", attributeContainer, isChild = false) { baseDefaultValue = "this" skipInIrFactory() } - +field("originalBeforeInline", attributeContainer, nullable = true) { - needAcceptAndTransform = false + +field("originalBeforeInline", attributeContainer, nullable = true, isChild = false) { baseDefaultValue = "null" skipInIrFactory() } @@ -884,9 +875,7 @@ object IrTree : AbstractTreeBuilder() { parent(expression) - +field("loop", loop) { - needAcceptAndTransform = false - } + +field("loop", loop, isChild = false) +field("label", string, nullable = true) { baseDefaultValue = "null" } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt index 356f7afc442..c45a1ce10ba 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/AbstractTreeBuilder.kt @@ -75,9 +75,13 @@ abstract class AbstractTreeBuilder { type: TypeRefWithNullability, nullable: Boolean = false, mutable: Boolean = true, + isChild: Boolean = true, initializer: SingleField.() -> Unit = {} ): SingleField { - return SingleField(name, type.copy(nullable), mutable).apply(initializer) + return SingleField(name, type.copy(nullable), mutable).apply { + this.isChild = isChild + initializer() + } } protected fun listField( @@ -85,6 +89,7 @@ abstract class AbstractTreeBuilder { baseType: TypeRef, nullable: Boolean = false, mutability: ListField.Mutability, + isChild: Boolean = true, initializer: ListField.() -> Unit = {} ): ListField { val listType = when (mutability) { @@ -98,7 +103,10 @@ abstract class AbstractTreeBuilder { listType = listType, isNullable = nullable, mutable = mutability == ListField.Mutability.Var, - ).apply(initializer) + ).apply(initializer).apply { + this.isChild = isChild + initializer() + } } fun build(): Model { 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 0a57e4a9f6e..4802bbbc16a 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 @@ -158,7 +158,7 @@ sealed class Field( val useInIrFactoryStrategy: UseFieldAsParameterInIrFactoryStrategy get() = customUseInIrFactoryStrategy - ?: if (needAcceptAndTransform && containsElement) { + ?: if (isChild && containsElement) { UseFieldAsParameterInIrFactoryStrategy.No } else { UseFieldAsParameterInIrFactoryStrategy.Yes(null) 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 b7d6a856755..5fd68715f8b 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 @@ -57,11 +57,14 @@ abstract class AbstractField> { var useInBaseTransformerDetection = true /** - * Whether a visitor should be run on this field in the generated `acceptChildren` in `transformChildren` method. + * Whether this field semantically represents a reference to a child node of the tree. + * + * This may have the effect of including or excluding this field from visiting it by visitors in the generated + * `acceptChildren` and `transformChildren` methods (child fields are always visited in those methods). * * Only has effect if [containsElement] is `true`. */ - var needAcceptAndTransform: Boolean = true + var isChild: Boolean = true open val overriddenTypes: MutableSet = mutableSetOf() @@ -103,7 +106,7 @@ abstract class AbstractField> { copy.visibility = visibility copy.fromParent = fromParent copy.useInBaseTransformerDetection = useInBaseTransformerDetection - copy.needAcceptAndTransform = needAcceptAndTransform + copy.isChild = isChild copy.overriddenTypes += overriddenTypes } } 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 3c4c5e58c66..7eb1d2476ad 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 @@ -37,7 +37,7 @@ interface FieldContainer> { */ val walkableChildren: List get() = allFields - .filter { it.containsElement && !it.withGetter && it.needAcceptAndTransform } + .filter { it.containsElement && !it.withGetter && it.isChild } .reorderFieldsIfNecessary(childrenOrderOverride) /** diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/config/AbstractImplementationConfigurator.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/config/AbstractImplementationConfigurator.kt index ffbaf02e4dc..6e890f0e8ed 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/config/AbstractImplementationConfigurator.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/config/AbstractImplementationConfigurator.kt @@ -378,16 +378,18 @@ abstract class AbstractImplementationConfigurator field.defaultValueInImplementation = value