From 7ef2f7ccde2f5fb91098ae4950abcce544d0a02c Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 24 Aug 2022 16:37:00 +0300 Subject: [PATCH] [FIR] Add `transformContextReceivers()` method to `FirProperty` --- .../kotlin/fir/declarations/FirProperty.kt | 8 +++--- .../builder/FirPropertyBuilder.kt | 6 ++--- .../fir/declarations/impl/FirPropertyImpl.kt | 21 +++++++++------ .../synthetic/FirSyntheticProperty.kt | 26 ++++++++++++------- .../fir/tree/generator/NodeConfigurator.kt | 1 + .../fir/tree/generator/model/Element.kt | 1 + .../kotlin/fir/tree/generator/model/Field.kt | 2 ++ .../fir/tree/generator/printer/element.kt | 2 +- 8 files changed, 43 insertions(+), 24 deletions(-) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt index 1fff98c76a6..fec355b862e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt @@ -36,7 +36,6 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override val deprecationsProvider: DeprecationsProvider abstract override val containerSource: DeserializedContainerSource? abstract override val dispatchReceiverType: ConeSimpleKotlinType? - abstract override val contextReceivers: List abstract override val name: Name abstract override val initializer: FirExpression? abstract override val delegate: FirExpression? @@ -47,6 +46,7 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override val backingField: FirBackingField? abstract override val annotations: List abstract override val controlFlowGraphReference: FirControlFlowGraphReference? + abstract override val contextReceivers: List abstract override val symbol: FirPropertySymbol abstract val delegateFieldSymbol: FirDelegateFieldSymbol? abstract val isLocal: Boolean @@ -67,8 +67,6 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) - abstract override fun replaceContextReceivers(newContextReceivers: List) - abstract override fun replaceInitializer(newInitializer: FirExpression?) abstract override fun replaceGetter(newGetter: FirPropertyAccessor?) @@ -77,6 +75,8 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract override fun replaceContextReceivers(newContextReceivers: List) + abstract fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) abstract override fun transformStatus(transformer: FirTransformer, data: D): FirProperty @@ -97,6 +97,8 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirProperty + abstract fun transformContextReceivers(transformer: FirTransformer, data: D): FirProperty + abstract override fun transformTypeParameters(transformer: FirTransformer, data: D): FirProperty abstract override fun transformOtherChildren(transformer: FirTransformer, data: D): FirProperty diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt index 8a853f3eab1..82d481af61c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt @@ -57,7 +57,6 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider var containerSource: DeserializedContainerSource? = null var dispatchReceiverType: ConeSimpleKotlinType? = null - val contextReceivers: MutableList = mutableListOf() lateinit var name: Name var initializer: FirExpression? = null var delegate: FirExpression? = null @@ -66,6 +65,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, var setter: FirPropertyAccessor? = null var backingField: FirBackingField? = null override val annotations: MutableList = mutableListOf() + val contextReceivers: MutableList = mutableListOf() lateinit var symbol: FirPropertySymbol var delegateFieldSymbol: FirDelegateFieldSymbol? = null var isLocal: Boolean by kotlin.properties.Delegates.notNull() @@ -85,7 +85,6 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, deprecationsProvider, containerSource, dispatchReceiverType, - contextReceivers, name, initializer, delegate, @@ -94,6 +93,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, setter, backingField, annotations, + contextReceivers, symbol, delegateFieldSymbol, isLocal, @@ -129,7 +129,6 @@ inline fun buildPropertyCopy(original: FirProperty, init: FirPropertyBuilder.() copyBuilder.deprecationsProvider = original.deprecationsProvider copyBuilder.containerSource = original.containerSource copyBuilder.dispatchReceiverType = original.dispatchReceiverType - copyBuilder.contextReceivers.addAll(original.contextReceivers) copyBuilder.name = original.name copyBuilder.initializer = original.initializer copyBuilder.delegate = original.delegate @@ -138,6 +137,7 @@ inline fun buildPropertyCopy(original: FirProperty, init: FirPropertyBuilder.() copyBuilder.setter = original.setter copyBuilder.backingField = original.backingField copyBuilder.annotations.addAll(original.annotations) + copyBuilder.contextReceivers.addAll(original.contextReceivers) copyBuilder.symbol = original.symbol copyBuilder.delegateFieldSymbol = original.delegateFieldSymbol copyBuilder.isLocal = original.isLocal diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt index c6d94a862a8..518ce672d92 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt @@ -50,7 +50,6 @@ internal class FirPropertyImpl( override var deprecationsProvider: DeprecationsProvider, override val containerSource: DeserializedContainerSource?, override val dispatchReceiverType: ConeSimpleKotlinType?, - override val contextReceivers: MutableList, override val name: Name, override var initializer: FirExpression?, override var delegate: FirExpression?, @@ -59,6 +58,7 @@ internal class FirPropertyImpl( override var setter: FirPropertyAccessor?, override var backingField: FirBackingField?, override val annotations: MutableList, + override val contextReceivers: MutableList, override val symbol: FirPropertySymbol, override val delegateFieldSymbol: FirDelegateFieldSymbol?, override val isLocal: Boolean, @@ -77,7 +77,6 @@ internal class FirPropertyImpl( status.accept(visitor, data) returnTypeRef.accept(visitor, data) receiverTypeRef?.accept(visitor, data) - contextReceivers.forEach { it.accept(visitor, data) } initializer?.accept(visitor, data) delegate?.accept(visitor, data) getter?.accept(visitor, data) @@ -85,6 +84,7 @@ internal class FirPropertyImpl( backingField?.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } controlFlowGraphReference?.accept(visitor, data) + contextReceivers.forEach { it.accept(visitor, data) } typeParameters.forEach { it.accept(visitor, data) } } @@ -97,6 +97,7 @@ internal class FirPropertyImpl( transformGetter(transformer, data) transformSetter(transformer, data) transformBackingField(transformer, data) + transformContextReceivers(transformer, data) transformTypeParameters(transformer, data) transformOtherChildren(transformer, data) return this @@ -147,13 +148,17 @@ internal class FirPropertyImpl( return this } + override fun transformContextReceivers(transformer: FirTransformer, data: D): FirPropertyImpl { + contextReceivers.transformInplace(transformer, data) + return this + } + override fun transformTypeParameters(transformer: FirTransformer, data: D): FirPropertyImpl { typeParameters.transformInplace(transformer, data) return this } override fun transformOtherChildren(transformer: FirTransformer, data: D): FirPropertyImpl { - contextReceivers.transformInplace(transformer, data) transformAnnotations(transformer, data) controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data) return this @@ -175,11 +180,6 @@ internal class FirPropertyImpl( deprecationsProvider = newDeprecationsProvider } - override fun replaceContextReceivers(newContextReceivers: List) { - contextReceivers.clear() - contextReceivers.addAll(newContextReceivers) - } - override fun replaceInitializer(newInitializer: FirExpression?) { initializer = newInitializer } @@ -196,6 +196,11 @@ internal class FirPropertyImpl( controlFlowGraphReference = newControlFlowGraphReference } + override fun replaceContextReceivers(newContextReceivers: List) { + contextReceivers.clear() + contextReceivers.addAll(newContextReceivers) + } + override fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) { bodyResolveState = newBodyResolveState } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt index d93f632ffa1..519327c7fd2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt @@ -138,43 +138,51 @@ class FirSyntheticProperty( throw AssertionError("Transformation of synthetic property isn't supported") } + override fun transformContextReceivers(transformer: FirTransformer, data: D): FirProperty { + throw AssertionError("Transformation of synthetic property isn't supported") + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceInitializer(newInitializer: FirExpression?) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceGetter(newGetter: FirPropertyAccessor?) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceSetter(newSetter: FirPropertyAccessor?) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() } override fun replaceContextReceivers(newContextReceivers: List) { - throw AssertionError("Mutation of synthetic property isn't supported") + notSupported() + } + + private fun notSupported(): Nothing { + throw AssertionError("Transformation of synthetic property isn't supported") } } 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 5445cb87c7d..5daf3ae37d8 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 @@ -325,6 +325,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild } property.configure { + +fieldList(contextReceiver, withReplace = true).withTransform() +symbol("FirPropertySymbol") +field("delegateFieldSymbol", delegateFieldSymbolType, nullable = true) +booleanField("isLocal") 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 51116d9ec49..6c56a8c5936 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 @@ -102,6 +102,7 @@ class Element(override val name: String, kind: Kind) : AbstractElement { existingField.needsSeparateTransform = existingField.needsSeparateTransform || parentField.needsSeparateTransform existingField.needTransformInOtherChildren = existingField.needTransformInOtherChildren || parentField.needTransformInOtherChildren existingField.withReplace = parentField.withReplace || existingField.withReplace + existingField.parentHasSeparateTransform = parentField.needsSeparateTransform if (parentField.type != existingField.type && parentField.withReplace) { existingField.overridenTypes += parentField overridenFields[existingField, parentField] = 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 7db6d62e7f4..9edbbf07433 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 @@ -17,6 +17,7 @@ sealed class Field : Importable { var fromParent: Boolean = false open var needsSeparateTransform: Boolean = false + var parentHasSeparateTransform: Boolean = true open var needTransformInOtherChildren: Boolean = false open val defaultValueInImplementation: String? get() = null @@ -46,6 +47,7 @@ sealed class Field : Importable { copy.useNullableForReplace = useNullableForReplace } copy.fromParent = fromParent + copy.parentHasSeparateTransform = parentHasSeparateTransform } protected abstract fun internalCopy(): Field 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 0ed3db2dc42..db9eaae940a 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 @@ -117,7 +117,7 @@ fun SmartPrinter.printElement(element: Element) { if (!field.needsSeparateTransform) continue println() abstract() - if (field.fromParent) { + if (field.fromParent && field.parentHasSeparateTransform) { print("override ") } println(field.transformFunctionDeclaration(typeWithArguments))