FIR: visit/transform dispatch & extension receivers only once
This commit is contained in:
@@ -30,8 +30,12 @@ interface FirQualifiedAccess : FirResolvable {
|
|||||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||||
calleeReference.accept(visitor, data)
|
calleeReference.accept(visitor, data)
|
||||||
explicitReceiver?.accept(visitor, data)
|
explicitReceiver?.accept(visitor, data)
|
||||||
dispatchReceiver.accept(visitor, data)
|
if (dispatchReceiver !== explicitReceiver) {
|
||||||
extensionReceiver.accept(visitor, data)
|
dispatchReceiver.accept(visitor, data)
|
||||||
|
}
|
||||||
|
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
|
||||||
|
extensionReceiver.accept(visitor, data)
|
||||||
|
}
|
||||||
super.acceptChildren(visitor, data)
|
super.acceptChildren(visitor, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-14
@@ -24,21 +24,8 @@ abstract class FirAbstractQualifiedAccess(
|
|||||||
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||||
|
|
||||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||||
calleeReference = calleeReference.transformSingle(transformer, data)
|
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
|
||||||
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
|
|
||||||
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
|
||||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
|
||||||
|
|
||||||
return super<FirAnnotatedStatement>.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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+1
-4
@@ -29,10 +29,7 @@ class FirFunctionCallImpl(
|
|||||||
|
|
||||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||||
typeArguments.transformInplace(transformer, data)
|
typeArguments.transformInplace(transformer, data)
|
||||||
calleeReference = calleeReference.transformSingle(transformer, data)
|
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
|
||||||
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
|
|
||||||
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
|
||||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
|
||||||
|
|
||||||
return super<FirFunctionCall>.transformChildren(transformer, data)
|
return super<FirFunctionCall>.transformChildren(transformer, data)
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -5,9 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.expressions.impl
|
package org.jetbrains.kotlin.fir.expressions.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirReference
|
import org.jetbrains.kotlin.fir.FirReference
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
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.expressions.FirQualifiedAccess
|
||||||
|
import org.jetbrains.kotlin.fir.transformInplace
|
||||||
import org.jetbrains.kotlin.fir.transformSingle
|
import org.jetbrains.kotlin.fir.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
|
|
||||||
@@ -47,4 +50,18 @@ interface FirModifiableQualifiedAccess<C : FirReference> : FirQualifiedAccess {
|
|||||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
||||||
return this
|
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
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+1
-4
@@ -26,10 +26,7 @@ class FirQualifiedAccessExpressionImpl(
|
|||||||
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||||
|
|
||||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||||
calleeReference = calleeReference.transformSingle(transformer, data)
|
super<FirModifiableQualifiedAccess>.transformChildren(transformer, data)
|
||||||
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
|
|
||||||
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
|
||||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
|
||||||
|
|
||||||
return super<FirQualifiedAccessExpression>.transformChildren(transformer, data)
|
return super<FirQualifiedAccessExpression>.transformChildren(transformer, data)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user