From 2ec305b34e9dd26690d23aff9acf023a5020fb98 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 15 Oct 2019 15:16:46 +0300 Subject: [PATCH] [FIR] Don't generate replace and transform in implementations with kind = Interface --- .../fir/java/declarations/FirJavaClass.kt | 4 + .../fir/lightTree/fir/modifier/Modifier.kt | 8 + .../lightTree/fir/modifier/TypeModifier.kt | 8 + .../fir/modifier/TypeParameterModifier.kt | 8 + .../fir/modifier/TypeProjectionModifier.kt | 8 + .../declarations/impl/FirModifiableClass.kt | 22 +- .../impl/FirModifiableConstructor.kt | 44 +--- .../impl/FirModifiableFunction.kt | 40 +-- .../impl/FirModifiableTypeParametersOwner.kt | 9 +- .../impl/FirModifiableVariable.kt | 45 +--- .../fir/expressions/impl/FirAbstractLoop.kt | 30 +-- .../expressions/impl/FirAbstractLoopJump.kt | 15 +- .../impl/FirCallWithArgumentList.kt | 16 +- .../impl/FirModifiableQualifiedAccess.kt | 38 +-- .../fir/impl/FirAbstractAnnotatedElement.kt | 9 +- .../kotlin/fir/tree/generator/Printer.kt | 239 ++++++++++-------- 16 files changed, 206 insertions(+), 337 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt index 1deaeeca489..837fee1412e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt @@ -67,6 +67,10 @@ class FirJavaClass internal constructor( supertypesComputationStatus = newSupertypesComputationStatus } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { + resolvePhase = newResolvePhase + } + override fun acceptChildren(visitor: FirVisitor, data: D) { declarations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) } diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt index 092cc09bc34..8f3040c4ab9 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PARAMETER_MO import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PLATFORM_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor class Modifier( override val psi: PsiElement? = null, @@ -155,4 +157,10 @@ class Modifier( fun hasActual(): Boolean { return platformModifiers.contains(PlatformModifier.ACTUAL) || platformModifiers.contains(PlatformModifier.IMPL) } + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement { + return this + } } diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeModifier.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeModifier.kt index 394bb05c5eb..44ff0f01788 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeModifier.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeModifier.kt @@ -9,6 +9,8 @@ import com.intellij.lang.LighterASTNode import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.lexer.KtTokens class TypeModifier( @@ -26,4 +28,10 @@ class TypeModifier( fun hasNoAnnotations(): Boolean { return annotations.isEmpty() } + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement { + return this + } } diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeParameterModifier.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeParameterModifier.kt index 7034a23b374..4bcc37e9f4e 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeParameterModifier.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeParameterModifier.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.REIFICATION_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.types.Variance class TypeParameterModifier( @@ -40,4 +42,10 @@ class TypeParameterModifier( fun hasReified(): Boolean { return reificationModifier == ReificationModifier.REIFIED } + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement { + return this + } } diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeProjectionModifier.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeProjectionModifier.kt index 135eb58180d..79d8c7a84bb 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeProjectionModifier.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/TypeProjectionModifier.kt @@ -10,6 +10,8 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.types.Variance class TypeProjectionModifier( @@ -32,4 +34,10 @@ class TypeProjectionModifier( else -> Variance.INVARIANT } } + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement { + return this + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableClass.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableClass.kt index 404677c3a22..2745c20ea7f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableClass.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableClass.kt @@ -29,25 +29,9 @@ interface FirModifiableClass : FirClass, FirAbstractAnnotatedElement { override val superTypeRefs: MutableList override val declarations: MutableList override val annotations: MutableList - override fun acceptChildren(visitor: FirVisitor, data: D) { - superTypeRefs.forEach { it.accept(visitor, data) } - declarations.forEach { it.accept(visitor, data) } - annotations.forEach { it.accept(visitor, data) } - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableClass - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableClass { - superTypeRefs.transformInplace(transformer, data) - declarations.transformInplace(transformer, data) - annotations.transformInplace(transformer, data) - return this - } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) - override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { - resolvePhase = newResolvePhase - } - - override fun replaceSuperTypeRefs(newSuperTypeRefs: List) { - superTypeRefs.clear() - superTypeRefs.addAll(newSuperTypeRefs) - } + override fun replaceSuperTypeRefs(newSuperTypeRefs: List) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt index b6b5cd840fe..ce7114af3c3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt @@ -46,47 +46,13 @@ interface FirModifiableConstructor : FirConstructor, FirModifiableTypeParameters override val symbol: FirConstructorSymbol override var delegatedConstructor: FirDelegatedConstructorCall? override val isPrimary: Boolean - override fun acceptChildren(visitor: FirVisitor, data: D) { - returnTypeRef.accept(visitor, data) - receiverTypeRef?.accept(visitor, data) - controlFlowGraphReference.accept(visitor, data) - typeParameters.forEach { it.accept(visitor, data) } - valueParameters.forEach { it.accept(visitor, data) } - body?.accept(visitor, data) - status.accept(visitor, data) - annotations.forEach { it.accept(visitor, data) } - delegatedConstructor?.accept(visitor, data) - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableConstructor - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableConstructor { - transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) - transformControlFlowGraphReference(transformer, data) - typeParameters.transformInplace(transformer, data) - transformValueParameters(transformer, data) - body = body?.transformSingle(transformer, data) - status = status.transformSingle(transformer, data) - annotations.transformInplace(transformer, data) - delegatedConstructor = delegatedConstructor?.transformSingle(transformer, data) - return this - } + override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableConstructor - override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableConstructor { - returnTypeRef = returnTypeRef.transformSingle(transformer, data) - return this - } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableConstructor - override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableConstructor { - controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) - return this - } + override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableConstructor - override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableConstructor { - valueParameters.transformInplace(transformer, data) - return this - } - - override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { - resolvePhase = newResolvePhase - } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt index f96aede4479..df7a5dc8ba8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt @@ -37,43 +37,13 @@ interface FirModifiableFunction> : FirFunction, FirAbstra override val symbol: FirFunctionSymbol override val valueParameters: MutableList override var body: FirBlock? - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - returnTypeRef.accept(visitor, data) - receiverTypeRef?.accept(visitor, data) - controlFlowGraphReference.accept(visitor, data) - typeParameters.forEach { it.accept(visitor, data) } - valueParameters.forEach { it.accept(visitor, data) } - body?.accept(visitor, data) - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableFunction - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableFunction { - annotations.transformInplace(transformer, data) - transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) - transformControlFlowGraphReference(transformer, data) - typeParameters.transformInplace(transformer, data) - transformValueParameters(transformer, data) - body = body?.transformSingle(transformer, data) - return this - } + override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableFunction - override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableFunction { - returnTypeRef = returnTypeRef.transformSingle(transformer, data) - return this - } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableFunction - override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableFunction { - controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) - return this - } + override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableFunction - override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableFunction { - valueParameters.transformInplace(transformer, data) - return this - } - - override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { - resolvePhase = newResolvePhase - } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableTypeParametersOwner.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableTypeParametersOwner.kt index 2125af997e4..0a2ef07dd4d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableTypeParametersOwner.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableTypeParametersOwner.kt @@ -18,12 +18,5 @@ import org.jetbrains.kotlin.fir.visitors.* interface FirModifiableTypeParametersOwner : FirTypeParametersOwner { override val psi: PsiElement? override val typeParameters: MutableList - override fun acceptChildren(visitor: FirVisitor, data: D) { - typeParameters.forEach { it.accept(visitor, data) } - } - - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableTypeParametersOwner { - typeParameters.transformInplace(transformer, data) - return this - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableTypeParametersOwner } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt index e2e1f157eb8..87001dc11d9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt @@ -40,48 +40,15 @@ interface FirModifiableVariable> : FirVariable, FirAbstra override var getter: FirPropertyAccessor? override var setter: FirPropertyAccessor? override val annotations: MutableList - override fun acceptChildren(visitor: FirVisitor, data: D) { - returnTypeRef.accept(visitor, data) - receiverTypeRef?.accept(visitor, data) - initializer?.accept(visitor, data) - delegate?.accept(visitor, data) - getter?.accept(visitor, data) - setter?.accept(visitor, data) - annotations.forEach { it.accept(visitor, data) } - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableVariable - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableVariable { - transformReturnTypeRef(transformer, data) - transformGetter(transformer, data) - transformSetter(transformer, data) - transformOtherChildren(transformer, data) - return this - } + override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableVariable - override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableVariable { - returnTypeRef = returnTypeRef.transformSingle(transformer, data) - return this - } + override fun transformGetter(transformer: FirTransformer, data: D): FirModifiableVariable - override fun transformGetter(transformer: FirTransformer, data: D): FirModifiableVariable { - getter = getter?.transformSingle(transformer, data) - return this - } + override fun transformSetter(transformer: FirTransformer, data: D): FirModifiableVariable - override fun transformSetter(transformer: FirTransformer, data: D): FirModifiableVariable { - setter = setter?.transformSingle(transformer, data) - return this - } + override fun transformOtherChildren(transformer: FirTransformer, data: D): FirModifiableVariable - override fun transformOtherChildren(transformer: FirTransformer, data: D): FirModifiableVariable { - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) - initializer = initializer?.transformSingle(transformer, data) - delegate = delegate?.transformSingle(transformer, data) - annotations.transformInplace(transformer, data) - return this - } - - override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { - resolvePhase = newResolvePhase - } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoop.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoop.kt index 74c698195af..169b5c24559 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoop.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoop.kt @@ -25,33 +25,11 @@ interface FirAbstractLoop : FirLoop, FirAbstractAnnotatedElement { override var block: FirBlock override var condition: FirExpression override var label: FirLabel? - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - block.accept(visitor, data) - condition.accept(visitor, data) - label?.accept(visitor, data) - } + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractLoop - override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractLoop { - transformBlock(transformer, data) - transformCondition(transformer, data) - transformOtherChildren(transformer, data) - return this - } + override fun transformBlock(transformer: FirTransformer, data: D): FirAbstractLoop - override fun transformBlock(transformer: FirTransformer, data: D): FirAbstractLoop { - block = block.transformSingle(transformer, data) - return this - } + override fun transformCondition(transformer: FirTransformer, data: D): FirAbstractLoop - override fun transformCondition(transformer: FirTransformer, data: D): FirAbstractLoop { - condition = condition.transformSingle(transformer, data) - return this - } - - override fun transformOtherChildren(transformer: FirTransformer, data: D): FirAbstractLoop { - annotations.transformInplace(transformer, data) - label = label?.transformSingle(transformer, data) - return this - } + override fun transformOtherChildren(transformer: FirTransformer, data: D): FirAbstractLoop } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoopJump.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoopJump.kt index 0b37e6cab26..e665e3da374 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoopJump.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractLoopJump.kt @@ -25,18 +25,7 @@ interface FirAbstractLoopJump : FirLoopJump, FirAbstractAnnotatedElement { override var typeRef: FirTypeRef override val annotations: MutableList override var target: FirTarget - override fun acceptChildren(visitor: FirVisitor, data: D) { - typeRef.accept(visitor, data) - annotations.forEach { it.accept(visitor, data) } - } + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractLoopJump - override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractLoopJump { - typeRef = typeRef.transformSingle(transformer, data) - annotations.transformInplace(transformer, data) - return this - } - - override fun replaceTypeRef(newTypeRef: FirTypeRef) { - typeRef = newTypeRef - } + override fun replaceTypeRef(newTypeRef: FirTypeRef) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallWithArgumentList.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallWithArgumentList.kt index 943f1ecd8b6..77a2d6ccd06 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallWithArgumentList.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallWithArgumentList.kt @@ -21,19 +21,7 @@ interface FirCallWithArgumentList : FirCall, FirAbstractAnnotatedElement { override val psi: PsiElement? override val annotations: MutableList override val arguments: MutableList - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - arguments.forEach { it.accept(visitor, data) } - } + override fun transformChildren(transformer: FirTransformer, data: D): FirCallWithArgumentList - override fun transformChildren(transformer: FirTransformer, data: D): FirCallWithArgumentList { - annotations.transformInplace(transformer, data) - transformArguments(transformer, data) - return this - } - - override fun transformArguments(transformer: FirTransformer, data: D): FirCallWithArgumentList { - arguments.transformInplace(transformer, data) - return this - } + override fun transformArguments(transformer: FirTransformer, data: D): FirCallWithArgumentList } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt index 32ea87f1f09..c23a90d01a0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt @@ -24,41 +24,11 @@ interface FirModifiableQualifiedAccess : FirQualifiedAccessWithoutCallee, FirAbs override var explicitReceiver: FirExpression? override var dispatchReceiver: FirExpression override var extensionReceiver: FirExpression - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - explicitReceiver?.accept(visitor, data) - if (dispatchReceiver !== explicitReceiver) { - dispatchReceiver.accept(visitor, data) - } - if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { - extensionReceiver.accept(visitor, data) - } - } + override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess - override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess { - annotations.transformInplace(transformer, data) - explicitReceiver = explicitReceiver?.transformSingle(transformer, data) - if (dispatchReceiver !== explicitReceiver) { - dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) - } - if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { - extensionReceiver = extensionReceiver.transformSingle(transformer, data) - } - return this - } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess - override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess { - explicitReceiver = explicitReceiver?.transformSingle(transformer, data) - return this - } + override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess - override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess { - dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) - return this - } - - override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess { - extensionReceiver = extensionReceiver.transformSingle(transformer, data) - return this - } + override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/impl/FirAbstractAnnotatedElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/impl/FirAbstractAnnotatedElement.kt index 38555fb2d90..e018045005d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/impl/FirAbstractAnnotatedElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/impl/FirAbstractAnnotatedElement.kt @@ -18,12 +18,5 @@ import org.jetbrains.kotlin.fir.visitors.* interface FirAbstractAnnotatedElement : FirAnnotationContainer { override val psi: PsiElement? override val annotations: MutableList - override fun acceptChildren(visitor: FirVisitor, data: D) { - annotations.forEach { it.accept(visitor, data) } - } - - override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement { - annotations.transformInplace(transformer, data) - return this - } + override fun transformChildren(transformer: FirTransformer, data: D): FirAbstractAnnotatedElement } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt index 51d371ad9a9..3666eeda266 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt @@ -261,7 +261,9 @@ fun PrintWriter.printImplementation(implementation: Implementation) { val fieldsWithoutDefault = allFields.filter { it.defaultValue == null && !it.isLateinit } val fieldsWithDefault = allFields.filter { it.defaultValue != null || it.isLateinit } - if (kind != Implementation.Kind.Interface && fieldsWithoutDefault.isNotEmpty()) { + val isInterface = kind == Implementation.Kind.Interface + + if (!isInterface && fieldsWithoutDefault.isNotEmpty()) { println("(") fieldsWithoutDefault.forEachIndexed { i, field -> val end = if (i == fieldsWithoutDefault.size - 1) "" else "," @@ -276,7 +278,7 @@ fun PrintWriter.printImplementation(implementation: Implementation) { } println(" {") - if (kind == Implementation.Kind.Interface) { + if (isInterface) { allFields.forEach { printField(it, isImplementation = true, override = true, end = "") } } else { fieldsWithDefault.forEach { @@ -288,7 +290,7 @@ fun PrintWriter.printImplementation(implementation: Implementation) { } element.allFields.filter { it.type.contains("Symbol") } - .takeIf { it.isNotEmpty() && kind != Implementation.Kind.Interface && !element.type.contains("Reference")} + .takeIf { it.isNotEmpty() && !isInterface && !element.type.contains("Reference")} ?.let { symbolFields -> indent(1) println("init {") @@ -301,21 +303,24 @@ fun PrintWriter.printImplementation(implementation: Implementation) { println() } - indent(1) - print("override fun acceptChildren(visitor: FirVisitor, data: D) {") - fun Field.acceptString(): String = "${name}${call()}accept(visitor, data)" + if (!isInterface) { - if (element.allFirFields.isNotEmpty()) { - println() - for (field in allFields.filter { it.isFirType }) { - if (field.withGetter || !field.needAcceptAndTransform) continue - when (field.name) { - "explicitReceiver" -> { - val explicitReceiver = implementation["explicitReceiver"]!! - val dispatchReceiver = implementation["dispatchReceiver"]!! - val extensionReceiver = implementation["extensionReceiver"]!! - println(""" + indent(1) + print("override fun acceptChildren(visitor: FirVisitor, data: D) {") + + + if (element.allFirFields.isNotEmpty()) { + println() + for (field in allFields.filter { it.isFirType }) { + if (field.withGetter || !field.needAcceptAndTransform) continue + when (field.name) { + "explicitReceiver" -> { + val explicitReceiver = implementation["explicitReceiver"]!! + val dispatchReceiver = implementation["dispatchReceiver"]!! + val extensionReceiver = implementation["extensionReceiver"]!! + println( + """ | ${explicitReceiver.acceptString()} | if (dispatchReceiver !== explicitReceiver) { | ${dispatchReceiver.acceptString()} @@ -323,115 +328,135 @@ fun PrintWriter.printImplementation(implementation: Implementation) { | if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { | ${extensionReceiver.acceptString()} | } - """.trimMargin()) - } - - "dispatchReceiver", "extensionReceiver", "subjectVariable" -> {} - "companionObject" -> {} - - else -> { - if (type == "FirClassImpl" && field.name == "declarations") { - indent(2) - println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }") + """.trimMargin() + ) } - if (type == "FirWhenExpressionImpl" && field.name == "subject") { - println( - """ + + "dispatchReceiver", "extensionReceiver", "subjectVariable" -> { + } + "companionObject" -> { + } + + else -> { + if (type == "FirClassImpl" && field.name == "declarations") { + indent(2) + println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }") + } + if (type == "FirWhenExpressionImpl" && field.name == "subject") { + println( + """ | if (subjectVariable != null) { | subjectVariable.accept(visitor, data) | } else { | subject?.accept(visitor, data) | } """.trimMargin() - ) - } else { - indent(2) - when (field.origin) { - is FirField -> { - println(field.acceptString()) - } + ) + } else { + indent(2) + when (field.origin) { + is FirField -> { + println(field.acceptString()) + } - is FieldList -> { - println("${field.name}.forEach { it.accept(visitor, data) }") - } + is FieldList -> { + println("${field.name}.forEach { it.accept(visitor, data) }") + } - else -> throw IllegalStateException() + else -> throw IllegalStateException() + } } } - } + } } + indent() } - indent() + println("}") + println() } - println("}") - println() indent() - println("override fun transformChildren(transformer: FirTransformer, data: D): $typeWithArguments {") - for (field in allFields) { - when { - !field.isMutable || !field.isFirType || field.withGetter || !field.needAcceptAndTransform -> {} - field.name == "explicitReceiver" -> { - val explicitReceiver = implementation["explicitReceiver"]!! - val dispatchReceiver = implementation["dispatchReceiver"]!! - val extensionReceiver = implementation["extensionReceiver"]!! - if (explicitReceiver.isMutable) { - indent(2) - println("explicitReceiver = explicitReceiver${explicitReceiver.call()}transformSingle(transformer, data)") + print("override fun transformChildren(transformer: FirTransformer, data: D): $typeWithArguments") + if (!isInterface) { + println(" {") + for (field in allFields) { + when { + !field.isMutable || !field.isFirType || field.withGetter || !field.needAcceptAndTransform -> { } - if (dispatchReceiver.isMutable) { - println(""" + field.name == "explicitReceiver" -> { + val explicitReceiver = implementation["explicitReceiver"]!! + val dispatchReceiver = implementation["dispatchReceiver"]!! + val extensionReceiver = implementation["extensionReceiver"]!! + if (explicitReceiver.isMutable) { + indent(2) + println("explicitReceiver = explicitReceiver${explicitReceiver.call()}transformSingle(transformer, data)") + } + if (dispatchReceiver.isMutable) { + println( + """ | if (dispatchReceiver !== explicitReceiver) { | dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) | } - """.trimMargin()) - } - if (extensionReceiver.isMutable) { - println(""" + """.trimMargin() + ) + } + if (extensionReceiver.isMutable) { + println( + """ | if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { | extensionReceiver = extensionReceiver.transformSingle(transformer, data) | } - """.trimMargin()) + """.trimMargin() + ) + } + } + field.name in setOf("dispatchReceiver", "extensionReceiver") -> { + } + type == "FirClassImpl" && field.name == "declarations" -> { + indent(2) + println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data)") + indent(2) + println("declarations.transformInplace(transformer, data)") + } + field.name == "companionObject" -> { + indent(2) + println("companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion }") + } + field.needsSeparateTransform -> { + indent(2) + println("transform${field.name.capitalize()}(transformer, data)") + } + !element.needTransformOtherChildren -> { + indent(2) + field.transform() + } + else -> { } } - field.name in setOf("dispatchReceiver", "extensionReceiver") -> {} - type == "FirClassImpl" && field.name == "declarations" -> { - indent(2) - println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data)") - indent(2) - println("declarations.transformInplace(transformer, data)") - } - field.name == "companionObject" -> { - indent(2) - println("companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion }") - } - field.needsSeparateTransform -> { - indent(2) - println("transform${field.name.capitalize()}(transformer, data)") - } - !element.needTransformOtherChildren -> { - indent(2) - field.transform() - } - else -> {} } - } - if (element.needTransformOtherChildren) { + if (element.needTransformOtherChildren) { + indent(2) + println("transformOtherChildren(transformer, data)") + } indent(2) - println("transformOtherChildren(transformer, data)") + println("return this") + indent() + println("}") + } else { + println() } - indent(2) - println("return this") - indent() - println("}") for (field in allFields) { if (!field.needsSeparateTransform) continue println() indent() - print("override ${field.transformFunctionDeclaration(typeWithArguments)} {") - println() + print("override ${field.transformFunctionDeclaration(typeWithArguments)}") + if (isInterface) { + println() + continue + } + println(" {") if (field.isMutable && field.isFirType) { // TODO: replace with smth normal if (type == "FirWhenExpressionImpl" && field.name == "subject") { @@ -456,24 +481,34 @@ fun PrintWriter.printImplementation(implementation: Implementation) { if (element.needTransformOtherChildren) { println() indent() - println("override fun transformOtherChildren(transformer: FirTransformer, data: D): $typeWithArguments {") - for (field in allFields) { - if (!field.isMutable || !field.isFirType || field.name == "subjectVariable") continue - if (!field.needsSeparateTransform) { - indent(2) - field.transform() + print("override fun transformOtherChildren(transformer: FirTransformer, data: D): $typeWithArguments") + if (isInterface) { + println() + } else { + println(" {") + for (field in allFields) { + if (!field.isMutable || !field.isFirType || field.name == "subjectVariable") continue + if (!field.needsSeparateTransform) { + indent(2) + field.transform() + } } + indent(2) + println("return this") + indent() + println("}") } - indent(2) - println("return this") - indent() - println("}") } for (field in allFields.filter { it.withReplace }) { println() indent() - print("override ${field.replaceFunctionDeclaration()} {") + print("override ${field.replaceFunctionDeclaration()}") + if (isInterface) { + println() + continue + } + print(" {") if (!field.isMutable) { println("}") continue