FIR: visit/transform dispatch & extension receivers only once

This commit is contained in:
Mikhail Glukhikh
2019-08-30 09:41:09 +03:00
parent 5defe22651
commit e36a75250b
5 changed files with 26 additions and 24 deletions
@@ -30,8 +30,12 @@ interface FirQualifiedAccess : FirResolvable {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
calleeReference.accept(visitor, data)
explicitReceiver?.accept(visitor, data)
dispatchReceiver.accept(visitor, data)
extensionReceiver.accept(visitor, data)
if (dispatchReceiver !== explicitReceiver) {
dispatchReceiver.accept(visitor, data)
}
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
extensionReceiver.accept(visitor, data)
}
super.acceptChildren(visitor, data)
}
@@ -24,21 +24,8 @@ abstract class FirAbstractQualifiedAccess(
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
return super<FirAnnotatedStatement>.transformChildren(transformer, data)
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
}
}
@@ -29,10 +29,7 @@ class FirFunctionCallImpl(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeArguments.transformInplace(transformer, data)
calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
return super<FirFunctionCall>.transformChildren(transformer, data)
}
@@ -5,9 +5,12 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -47,4 +50,18 @@ interface FirModifiableQualifiedAccess<C : FirReference> : FirQualifiedAccess {
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
return this
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(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
}
}
@@ -26,10 +26,7 @@ class FirQualifiedAccessExpressionImpl(
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
return super<FirQualifiedAccessExpression>.transformChildren(transformer, data)
}