FIR: Simplify FirQualifiedAccess hiearchy

Mostly, it's getting rid of FirQualifiedAccessWithoutCallee and FirModifiableQualifiedAccess
The latter was only used during FIR building to set explicit receiver
that might be done by replace call on explicit receiver

The problem with replaceExplicitReceiver is that for FirComponentCall
explicitReceiver should be not null, so it's needed to perform those tricks
at the generatot
This commit is contained in:
Denis Zharkov
2020-08-21 14:29:14 +03:00
parent e6837a5b8c
commit cb6fbc329a
39 changed files with 159 additions and 222 deletions
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.expressions.impl.FirStubStatement import org.jetbrains.kotlin.fir.expressions.impl.FirStubStatement
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -462,12 +461,7 @@ private fun FirExpression.checkReceiver(name: String?): Boolean {
} }
fun FirModifiableQualifiedAccess.wrapWithSafeCall(receiver: FirExpression): FirSafeCallExpression { fun FirQualifiedAccess.wrapWithSafeCall(receiver: FirExpression): FirSafeCallExpression {
// TODO: Refactor tree to make FirModifiableQualifiedAccess inherit FirQualifiedAccess
require(this is FirQualifiedAccess) {
"Safe-call instances are expected to be FirQualifiedAccess, but ${this::class} was found"
}
val checkedSafeCallSubject = buildCheckedSafeCallSubject { val checkedSafeCallSubject = buildCheckedSafeCallSubject {
@OptIn(FirContractViolation::class) @OptIn(FirContractViolation::class)
this.originalReceiverRef = FirExpressionRef<FirExpression>().apply { this.originalReceiverRef = FirExpressionRef<FirExpression>().apply {
@@ -475,7 +469,7 @@ fun FirModifiableQualifiedAccess.wrapWithSafeCall(receiver: FirExpression): FirS
} }
} }
explicitReceiver = checkedSafeCallSubject replaceExplicitReceiver(checkedSafeCallSubject)
return buildSafeCallExpression { return buildSafeCallExpression {
this.receiver = receiver this.receiver = receiver
@OptIn(FirContractViolation::class) @OptIn(FirContractViolation::class)
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
@@ -475,12 +474,12 @@ class ExpressionsConverter(
} }
} }
(firSelector as? FirModifiableQualifiedAccess)?.let { (firSelector as? FirQualifiedAccess)?.let {
if (isSafe) { if (isSafe) {
return it.wrapWithSafeCall(firReceiver!!) return it.wrapWithSafeCall(firReceiver!!)
} }
it.explicitReceiver = firReceiver it.replaceExplicitReceiver(firReceiver)
} }
return firSelector return firSelector
} }
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.builder.* import org.jetbrains.kotlin.fir.references.builder.*
@@ -1810,14 +1809,14 @@ class RawFirBuilder(
expression.toFirSourceElement(), ConeSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax), expression.toFirSourceElement(), ConeSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax),
) )
val firSelector = selector.toFirExpression("Incorrect selector expression") val firSelector = selector.toFirExpression("Incorrect selector expression")
if (firSelector is FirModifiableQualifiedAccess) { if (firSelector is FirQualifiedAccess) {
val receiver = expression.receiverExpression.toFirExpression("Incorrect receiver expression") val receiver = expression.receiverExpression.toFirExpression("Incorrect receiver expression")
if (expression is KtSafeQualifiedExpression) { if (expression is KtSafeQualifiedExpression) {
return firSelector.wrapWithSafeCall(receiver) return firSelector.wrapWithSafeCall(receiver)
} }
firSelector.explicitReceiver = receiver firSelector.replaceExplicitReceiver(receiver)
} }
return firSelector return firSelector
} }
@@ -34,6 +34,8 @@ abstract class FirCallableReferenceAccess : FirQualifiedAccessExpression() {
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference) abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
@@ -41,6 +41,8 @@ abstract class FirComponentCall : FirFunctionCall() {
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirComponentCall abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirComponentCall
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCall abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirComponentCall
@@ -18,25 +18,25 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirDelegatedConstructorCall : FirPureAbstractElement(), FirResolvable, FirCall { abstract class FirDelegatedConstructorCall : FirPureAbstractElement(), FirResolvable, FirCall {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val calleeReference: FirReference
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract val constructedTypeRef: FirTypeRef abstract val constructedTypeRef: FirTypeRef
abstract val dispatchReceiver: FirExpression abstract val dispatchReceiver: FirExpression
abstract override val calleeReference: FirReference
abstract val isThis: Boolean abstract val isThis: Boolean
abstract val isSuper: Boolean abstract val isSuper: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDelegatedConstructorCall(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDelegatedConstructorCall(this, data)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef) abstract fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef)
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall
abstract fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall abstract fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCall
} }
@@ -21,11 +21,11 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val typeRef: FirTypeRef abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract override val calleeReference: FirReference
abstract override val typeArguments: List<FirTypeProjection> abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression? abstract override val explicitReceiver: FirExpression?
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val calleeReference: FirReference
abstract val originalExpression: FirQualifiedAccessExpression abstract val originalExpression: FirQualifiedAccessExpression
abstract val typesFromSmartCast: Collection<ConeKotlinType> abstract val typesFromSmartCast: Collection<ConeKotlinType>
abstract val originalType: FirTypeRef abstract val originalType: FirTypeRef
@@ -34,12 +34,16 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() {
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
@@ -47,6 +51,4 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() {
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirExpressionWithSmartcast
} }
@@ -34,6 +34,8 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference) abstract fun replaceCalleeReference(newCalleeReference: FirNamedReference)
@@ -15,30 +15,32 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
interface FirQualifiedAccess : FirQualifiedAccessWithoutCallee, FirResolvable { interface FirQualifiedAccess : FirResolvable, FirStatement {
override val source: FirSourceElement? override val source: FirSourceElement?
override val annotations: List<FirAnnotationCall>
override val typeArguments: List<FirTypeProjection>
override val explicitReceiver: FirExpression?
override val dispatchReceiver: FirExpression
override val extensionReceiver: FirExpression
override val calleeReference: FirReference override val calleeReference: FirReference
override val annotations: List<FirAnnotationCall>
val typeArguments: List<FirTypeProjection>
val explicitReceiver: FirExpression?
val dispatchReceiver: FirExpression
val extensionReceiver: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccess(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccess(this, data)
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
override fun replaceCalleeReference(newCalleeReference: FirReference) override fun replaceCalleeReference(newCalleeReference: FirReference)
fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccess override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccess fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
} }
@@ -20,22 +20,26 @@ abstract class FirQualifiedAccessExpression : FirExpression(), FirQualifiedAcces
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val typeRef: FirTypeRef abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract override val calleeReference: FirReference
abstract override val typeArguments: List<FirTypeProjection> abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression? abstract override val explicitReceiver: FirExpression?
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val calleeReference: FirReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessExpression(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessExpression(this, data)
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
@@ -43,6 +47,4 @@ abstract class FirQualifiedAccessExpression : FirExpression(), FirQualifiedAcces
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpression
} }
@@ -1,38 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
interface FirQualifiedAccessWithoutCallee : FirStatement {
override val source: FirSourceElement?
override val annotations: List<FirAnnotationCall>
val typeArguments: List<FirTypeProjection>
val explicitReceiver: FirExpression?
val dispatchReceiver: FirExpression
val extensionReceiver: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data)
fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccessWithoutCallee
}
@@ -33,6 +33,8 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract fun replaceCalleeReference(newCalleeReference: FirThisReference) abstract fun replaceCalleeReference(newCalleeReference: FirThisReference)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
@@ -18,20 +18,24 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirVariableAssignment : FirPureAbstractElement(), FirQualifiedAccess { abstract class FirVariableAssignment : FirPureAbstractElement(), FirQualifiedAccess {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val calleeReference: FirReference
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract override val typeArguments: List<FirTypeProjection> abstract override val typeArguments: List<FirTypeProjection>
abstract override val explicitReceiver: FirExpression? abstract override val explicitReceiver: FirExpression?
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val calleeReference: FirReference
abstract val lValue: FirReference abstract val lValue: FirReference
abstract val rValue: FirExpression abstract val rValue: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitVariableAssignment(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitVariableAssignment(this, data)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference) abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?)
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirVariableAssignment
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirVariableAssignment abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirVariableAssignment
@@ -43,7 +47,5 @@ abstract class FirVariableAssignment : FirPureAbstractElement(), FirQualifiedAcc
abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirVariableAssignment abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirVariableAssignment
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirVariableAssignment
abstract fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirVariableAssignment abstract fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirVariableAssignment
} }
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirCallableReferenceAccessImpl import org.jetbrains.kotlin.fir.expressions.impl.FirCallableReferenceAccessImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -33,22 +32,22 @@ class FirQualifiedAccessExpressionBuilder : FirQualifiedAccessBuilder, FirAnnota
override var source: FirSourceElement? = null override var source: FirSourceElement? = null
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
lateinit var calleeReference: FirReference
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
lateinit var calleeReference: FirReference
override fun build(): FirQualifiedAccessExpression { override fun build(): FirQualifiedAccessExpression {
return FirQualifiedAccessExpressionImpl( return FirQualifiedAccessExpressionImpl(
source, source,
typeRef, typeRef,
annotations, annotations,
calleeReference,
typeArguments, typeArguments,
explicitReceiver, explicitReceiver,
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
calleeReference,
) )
} }
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirThisReceiverExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirThisReceiverExpressionImpl
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirVariableAssignmentImpl import org.jetbrains.kotlin.fir.expressions.impl.FirVariableAssignmentImpl
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -28,23 +27,23 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl @FirBuilderDsl
class FirVariableAssignmentBuilder : FirQualifiedAccessBuilder, FirAnnotationContainerBuilder { class FirVariableAssignmentBuilder : FirQualifiedAccessBuilder, FirAnnotationContainerBuilder {
override var source: FirSourceElement? = null override var source: FirSourceElement? = null
lateinit var calleeReference: FirReference
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var explicitReceiver: FirExpression? = null override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
lateinit var calleeReference: FirReference
lateinit var rValue: FirExpression lateinit var rValue: FirExpression
override fun build(): FirVariableAssignment { override fun build(): FirVariableAssignment {
return FirVariableAssignmentImpl( return FirVariableAssignmentImpl(
source, source,
calleeReference,
annotations, annotations,
typeArguments, typeArguments,
explicitReceiver, explicitReceiver,
dispatchReceiver, dispatchReceiver,
extensionReceiver, extensionReceiver,
calleeReference,
rValue, rValue,
) )
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -31,7 +30,7 @@ internal class FirCallableReferenceAccessImpl(
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
override var hasQuestionMarkAtLHS: Boolean, override var hasQuestionMarkAtLHS: Boolean,
) : FirCallableReferenceAccess(), FirModifiableQualifiedAccess { ) : FirCallableReferenceAccess() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data) typeRef.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
@@ -100,6 +99,10 @@ internal class FirCallableReferenceAccessImpl(
typeArguments.addAll(newTypeArguments) typeArguments.addAll(newTypeArguments)
} }
override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
explicitReceiver = newExplicitReceiver
}
override fun replaceCalleeReference(newCalleeReference: FirNamedReference) { override fun replaceCalleeReference(newCalleeReference: FirNamedReference) {
calleeReference = newCalleeReference calleeReference = newCalleeReference
} }
@@ -121,4 +121,9 @@ internal class FirComponentCallImpl(
require(newCalleeReference is FirNamedReference) require(newCalleeReference is FirNamedReference)
replaceCalleeReference(newCalleeReference) replaceCalleeReference(newCalleeReference)
} }
override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
require(newExplicitReceiver != null)
explicitReceiver = newExplicitReceiver
}
} }
@@ -33,22 +33,17 @@ internal class FirDelegatedConstructorCallImpl(
override val isSuper: Boolean get() = !isThis override val isSuper: Boolean get() = !isThis
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)
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
argumentList.accept(visitor, data) argumentList.accept(visitor, data)
constructedTypeRef.accept(visitor, data) constructedTypeRef.accept(visitor, data)
calleeReference.accept(visitor, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCallImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCallImpl {
transformCalleeReference(transformer, data)
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
argumentList = argumentList.transformSingle(transformer, data) argumentList = argumentList.transformSingle(transformer, data)
constructedTypeRef = constructedTypeRef.transformSingle(transformer, data) constructedTypeRef = constructedTypeRef.transformSingle(transformer, data)
return this transformCalleeReference(transformer, data)
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCallImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this return this
} }
@@ -62,8 +57,9 @@ internal class FirDelegatedConstructorCallImpl(
return this return this
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) { override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirDelegatedConstructorCallImpl {
calleeReference = newCalleeReference calleeReference = calleeReference.transformSingle(transformer, data)
return this
} }
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
@@ -73,4 +69,8 @@ internal class FirDelegatedConstructorCallImpl(
override fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef) { override fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef) {
constructedTypeRef = newConstructedTypeRef constructedTypeRef = newConstructedTypeRef
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) {
calleeReference = newCalleeReference
}
} }
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
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.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -33,7 +32,7 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference, override var calleeReference: FirNamedReference,
) : FirFunctionCall(), FirModifiableQualifiedAccess { ) : FirFunctionCall() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data) typeRef.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
@@ -104,6 +103,10 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
typeArguments.addAll(newTypeArguments) typeArguments.addAll(newTypeArguments)
} }
override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
explicitReceiver = newExplicitReceiver
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) { override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList argumentList = newArgumentList
} }
@@ -1,41 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessWithoutCallee
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
interface FirModifiableQualifiedAccess : FirQualifiedAccessWithoutCallee {
override val source: FirSourceElement?
override val annotations: MutableList<FirAnnotationCall>
override val typeArguments: MutableList<FirTypeProjection>
override var explicitReceiver: FirExpression?
override var dispatchReceiver: FirExpression
override var extensionReceiver: FirExpression
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirModifiableQualifiedAccess
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
}
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -24,15 +23,16 @@ internal class FirQualifiedAccessExpressionImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override var typeRef: FirTypeRef, override var typeRef: FirTypeRef,
override val annotations: MutableList<FirAnnotationCall>, override val annotations: MutableList<FirAnnotationCall>,
override var calleeReference: FirReference,
override val typeArguments: MutableList<FirTypeProjection>, override val typeArguments: MutableList<FirTypeProjection>,
override var explicitReceiver: FirExpression?, override var explicitReceiver: FirExpression?,
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var calleeReference: FirReference, ) : FirQualifiedAccessExpression() {
) : FirQualifiedAccessExpression(), FirModifiableQualifiedAccess {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data) typeRef.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
calleeReference.accept(visitor, data)
typeArguments.forEach { it.accept(visitor, data) } typeArguments.forEach { it.accept(visitor, data) }
explicitReceiver?.accept(visitor, data) explicitReceiver?.accept(visitor, data)
if (dispatchReceiver !== explicitReceiver) { if (dispatchReceiver !== explicitReceiver) {
@@ -41,12 +41,12 @@ internal class FirQualifiedAccessExpressionImpl(
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
extensionReceiver.accept(visitor, data) extensionReceiver.accept(visitor, data)
} }
calleeReference.accept(visitor, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
typeRef = typeRef.transformSingle(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
transformCalleeReference(transformer, data)
transformTypeArguments(transformer, data) transformTypeArguments(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
if (dispatchReceiver !== explicitReceiver) { if (dispatchReceiver !== explicitReceiver) {
@@ -55,7 +55,6 @@ internal class FirQualifiedAccessExpressionImpl(
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
extensionReceiver = extensionReceiver.transformSingle(transformer, data) extensionReceiver = extensionReceiver.transformSingle(transformer, data)
} }
transformCalleeReference(transformer, data)
return this return this
} }
@@ -64,6 +63,11 @@ internal class FirQualifiedAccessExpressionImpl(
return this return this
} }
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl { override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
typeArguments.transformInplace(transformer, data) typeArguments.transformInplace(transformer, data)
return this return this
@@ -84,21 +88,20 @@ internal class FirQualifiedAccessExpressionImpl(
return this return this
} }
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccessExpressionImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef typeRef = newTypeRef
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) {
calleeReference = newCalleeReference
}
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) { override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
typeArguments.clear() typeArguments.clear()
typeArguments.addAll(newTypeArguments) typeArguments.addAll(newTypeArguments)
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) { override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
calleeReference = newCalleeReference explicitReceiver = newExplicitReceiver
} }
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirThisReference
@@ -28,7 +27,7 @@ internal class FirThisReceiverExpressionImpl(
override val annotations: MutableList<FirAnnotationCall>, override val annotations: MutableList<FirAnnotationCall>,
override val typeArguments: MutableList<FirTypeProjection>, override val typeArguments: MutableList<FirTypeProjection>,
override var calleeReference: FirThisReference, override var calleeReference: FirThisReference,
) : FirThisReceiverExpression(), FirModifiableQualifiedAccess { ) : FirThisReceiverExpression() {
override var explicitReceiver: FirExpression? = null override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
override var extensionReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression
@@ -101,6 +100,10 @@ internal class FirThisReceiverExpressionImpl(
typeArguments.addAll(newTypeArguments) typeArguments.addAll(newTypeArguments)
} }
override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
explicitReceiver = newExplicitReceiver
}
override fun replaceCalleeReference(newCalleeReference: FirThisReference) { override fun replaceCalleeReference(newCalleeReference: FirThisReference) {
calleeReference = newCalleeReference calleeReference = newCalleeReference
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -21,14 +20,14 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirVariableAssignmentImpl( internal class FirVariableAssignmentImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override var calleeReference: FirReference,
override val annotations: MutableList<FirAnnotationCall>, override val annotations: MutableList<FirAnnotationCall>,
override val typeArguments: MutableList<FirTypeProjection>, override val typeArguments: MutableList<FirTypeProjection>,
override var explicitReceiver: FirExpression?, override var explicitReceiver: FirExpression?,
override var dispatchReceiver: FirExpression, override var dispatchReceiver: FirExpression,
override var extensionReceiver: FirExpression, override var extensionReceiver: FirExpression,
override var calleeReference: FirReference,
override var rValue: FirExpression, override var rValue: FirExpression,
) : FirVariableAssignment(), FirModifiableQualifiedAccess { ) : FirVariableAssignment() {
override var lValue: FirReference override var lValue: FirReference
get() = calleeReference get() = calleeReference
set(value) { set(value) {
@@ -36,6 +35,7 @@ internal class FirVariableAssignmentImpl(
} }
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)
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
typeArguments.forEach { it.accept(visitor, data) } typeArguments.forEach { it.accept(visitor, data) }
explicitReceiver?.accept(visitor, data) explicitReceiver?.accept(visitor, data)
@@ -45,11 +45,11 @@ internal class FirVariableAssignmentImpl(
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
extensionReceiver.accept(visitor, data) extensionReceiver.accept(visitor, data)
} }
calleeReference.accept(visitor, data)
rValue.accept(visitor, data) rValue.accept(visitor, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
transformCalleeReference(transformer, data)
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
transformTypeArguments(transformer, data) transformTypeArguments(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
@@ -59,11 +59,15 @@ internal class FirVariableAssignmentImpl(
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
extensionReceiver = extensionReceiver.transformSingle(transformer, data) extensionReceiver = extensionReceiver.transformSingle(transformer, data)
} }
transformCalleeReference(transformer, data)
transformRValue(transformer, data) transformRValue(transformer, data)
return this return this
} }
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl { override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
annotations.transformInplace(transformer, data) annotations.transformInplace(transformer, data)
return this return this
@@ -89,22 +93,21 @@ internal class FirVariableAssignmentImpl(
return this return this
} }
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl { override fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirVariableAssignmentImpl {
rValue = rValue.transformSingle(transformer, data) rValue = rValue.transformSingle(transformer, data)
return this return this
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) {
calleeReference = newCalleeReference
}
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) { override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
typeArguments.clear() typeArguments.clear()
typeArguments.addAll(newTypeArguments) typeArguments.addAll(newTypeArguments)
} }
override fun replaceCalleeReference(newCalleeReference: FirReference) { override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
calleeReference = newCalleeReference explicitReceiver = newExplicitReceiver
} }
} }
@@ -74,7 +74,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessWithoutCallee
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall
import org.jetbrains.kotlin.fir.expressions.FirElvisExpression import org.jetbrains.kotlin.fir.expressions.FirElvisExpression
@@ -414,10 +413,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(whenBranch, data) return transformElement(whenBranch, data)
} }
open fun transformQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee: FirQualifiedAccessWithoutCallee, data: D): CompositeTransformResult<FirStatement> {
return transformElement(qualifiedAccessWithoutCallee, data)
}
open fun transformQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirStatement> { open fun transformQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirStatement> {
return transformElement(qualifiedAccess, data) return transformElement(qualifiedAccess, data)
} }
@@ -918,10 +913,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformWhenBranch(whenBranch, data) return transformWhenBranch(whenBranch, data)
} }
final override fun visitQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee: FirQualifiedAccessWithoutCallee, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee, data)
}
final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirStatement> { final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccess(qualifiedAccess, data) return transformQualifiedAccess(qualifiedAccess, data)
} }
@@ -74,7 +74,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessWithoutCallee
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall
import org.jetbrains.kotlin.fir.expressions.FirElvisExpression import org.jetbrains.kotlin.fir.expressions.FirElvisExpression
@@ -276,8 +275,6 @@ abstract class FirVisitor<out R, in D> {
open fun visitWhenBranch(whenBranch: FirWhenBranch, data: D): R = visitElement(whenBranch, data) open fun visitWhenBranch(whenBranch: FirWhenBranch, data: D): R = visitElement(whenBranch, data)
open fun visitQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee: FirQualifiedAccessWithoutCallee, data: D): R = visitElement(qualifiedAccessWithoutCallee, data)
open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): R = visitElement(qualifiedAccess, data) open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): R = visitElement(qualifiedAccess, data)
open fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: D): R = visitElement(checkNotNullCall, data) open fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: D): R = visitElement(checkNotNullCall, data)
@@ -74,7 +74,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessWithoutCallee
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall
import org.jetbrains.kotlin.fir.expressions.FirElvisExpression import org.jetbrains.kotlin.fir.expressions.FirElvisExpression
@@ -412,10 +411,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(whenBranch) visitElement(whenBranch)
} }
open fun visitQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee: FirQualifiedAccessWithoutCallee) {
visitElement(qualifiedAccessWithoutCallee)
}
open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) { open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
visitElement(qualifiedAccess) visitElement(qualifiedAccess)
} }
@@ -916,10 +911,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitWhenBranch(whenBranch) visitWhenBranch(whenBranch)
} }
final override fun visitQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee: FirQualifiedAccessWithoutCallee, data: Nothing?) {
visitQualifiedAccessWithoutCallee(qualifiedAccessWithoutCallee)
}
final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: Nothing?) { final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: Nothing?) {
visitQualifiedAccess(qualifiedAccess) visitQualifiedAccess(qualifiedAccess)
} }
@@ -78,5 +78,9 @@ internal class FirExpressionWithSmartcastImpl(
throw IllegalStateException() throw IllegalStateException()
} }
override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) {
throw IllegalStateException()
}
override fun replaceTypeRef(newTypeRef: FirTypeRef) {} override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
} }
@@ -24,7 +24,7 @@ object FieldSets {
val calleeReference = field("calleeReference", reference, withReplace = true) val calleeReference = field("calleeReference", reference, withReplace = true)
val receivers = fieldSet( val receivers = fieldSet(
field("explicitReceiver", expression, nullable = true).withTransform(), field("explicitReceiver", expression, nullable = true, withReplace = true).withTransform(),
field("dispatchReceiver", expression).withTransform(), field("dispatchReceiver", expression).withTransform(),
field("extensionReceiver", expression).withTransform() field("extensionReceiver", expression).withTransform()
) )
@@ -83,4 +83,4 @@ object FieldSets {
val modality = field(modalityType, nullable = true) val modality = field(modalityType, nullable = true)
val scopeProvider = field("scopeProvider", firScopeProviderType) val scopeProvider = field("scopeProvider", firScopeProviderType)
} }
@@ -90,8 +90,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val equalityOperatorCall = element("EqualityOperatorCall", Expression, expression, call) val equalityOperatorCall = element("EqualityOperatorCall", Expression, expression, call)
val whenExpression = element("WhenExpression", Expression, expression, resolvable) val whenExpression = element("WhenExpression", Expression, expression, resolvable)
val whenBranch = element("WhenBranch", Expression) val whenBranch = element("WhenBranch", Expression)
val qualifiedAccessWithoutCallee = element("QualifiedAccessWithoutCallee", Expression, statement) val qualifiedAccess = element("QualifiedAccess", Expression, resolvable, statement)
val qualifiedAccess = element("QualifiedAccess", Expression, qualifiedAccessWithoutCallee, resolvable)
val checkNotNullCall = element("CheckNotNullCall", Expression, expression, call, resolvable) val checkNotNullCall = element("CheckNotNullCall", Expression, expression, call, resolvable)
val elvisExpression = element("ElvisExpression", Expression, expression, resolvable) val elvisExpression = element("ElvisExpression", Expression, expression, resolvable)
@@ -74,11 +74,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(arrayOfCall) impl(arrayOfCall)
val modifiableQualifiedAccess = impl(qualifiedAccessWithoutCallee, "FirModifiableQualifiedAccess") {} impl(callableReferenceAccess)
impl(callableReferenceAccess) {
parents += modifiableQualifiedAccess
}
impl(componentCall) { impl(componentCall) {
default("calleeReference", "FirSimpleNamedReference(source, Name.identifier(\"component\$componentIndex\"), null)") default("calleeReference", "FirSimpleNamedReference(source, Name.identifier(\"component\$componentIndex\"), null)")
@@ -128,14 +124,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
} }
impl(functionCall) { impl(functionCall) {
parents += modifiableQualifiedAccess
kind = OpenClass kind = OpenClass
} }
impl(qualifiedAccessExpression) { impl(qualifiedAccessExpression)
parents += modifiableQualifiedAccess
}
noImpl(expressionWithSmartcast) noImpl(expressionWithSmartcast)
@@ -269,7 +261,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
} }
impl(thisReceiverExpression) { impl(thisReceiverExpression) {
parents += modifiableQualifiedAccess
defaultNoReceivers() defaultNoReceivers()
} }
@@ -280,8 +271,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
} }
impl(variableAssignment) { impl(variableAssignment) {
parents += modifiableQualifiedAccess
default("lValue") { default("lValue") {
value = "calleeReference" value = "calleeReference"
customSetter = "calleeReference = value" customSetter = "calleeReference = value"
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.tree.generator.FieldSets.calleeReference
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.classKind import org.jetbrains.kotlin.fir.tree.generator.FieldSets.classKind
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.controlFlowGraphReferenceField import org.jetbrains.kotlin.fir.tree.generator.FieldSets.controlFlowGraphReferenceField
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.declarations import org.jetbrains.kotlin.fir.tree.generator.FieldSets.declarations
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.effectiveVisibility
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.initializer import org.jetbrains.kotlin.fir.tree.generator.FieldSets.initializer
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.modality import org.jetbrains.kotlin.fir.tree.generator.FieldSets.modality
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.name import org.jetbrains.kotlin.fir.tree.generator.FieldSets.name
@@ -192,7 +191,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("rhs", expression).withTransform() +field("rhs", expression).withTransform()
} }
qualifiedAccessWithoutCallee.configure { qualifiedAccess.configure {
+typeArguments.withTransform() +typeArguments.withTransform()
+receivers +receivers
} }
@@ -354,6 +353,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
delegatedConstructorCall.configure { delegatedConstructorCall.configure {
+field("constructedTypeRef", typeRef, withReplace = true) +field("constructedTypeRef", typeRef, withReplace = true)
+field("dispatchReceiver", expression).withTransform() +field("dispatchReceiver", expression).withTransform()
+field("calleeReference", reference, withReplace = true)
generateBooleanFields("this", "super") generateBooleanFields("this", "super")
} }
@@ -33,6 +33,7 @@ interface AbstractElement : FieldContainer, KindOwner {
val defaultImplementation: Implementation? val defaultImplementation: Implementation?
val customImplementations: List<Implementation> val customImplementations: List<Implementation>
val overridenFields: Map<Field, Map<Importable, Boolean>> val overridenFields: Map<Field, Map<Importable, Boolean>>
val useNullableForReplace: Set<Field>
override val allParents: List<KindOwner> get() = parents override val allParents: List<KindOwner> get() = parents
} }
@@ -63,6 +64,7 @@ class Element(val name: String, kind: Kind) : AbstractElement {
override val needTransformOtherChildren: Boolean get() = _needTransformOtherChildren || parents.any { it.needTransformOtherChildren } override val needTransformOtherChildren: Boolean get() = _needTransformOtherChildren || parents.any { it.needTransformOtherChildren }
override val overridenFields: MutableMap<Field, MutableMap<Importable, Boolean>> = mutableMapOf() override val overridenFields: MutableMap<Field, MutableMap<Importable, Boolean>> = mutableMapOf()
override val useNullableForReplace: MutableSet<Field> = mutableSetOf()
override val allImplementations: List<Implementation> by lazy { override val allImplementations: List<Implementation> by lazy {
if (doesNotNeedImplementation) { if (doesNotNeedImplementation) {
emptyList() emptyList()
@@ -90,6 +92,9 @@ class Element(val name: String, kind: Kind) : AbstractElement {
overridenFields[existingField, parentField] = false overridenFields[existingField, parentField] = false
} else { } else {
overridenFields[existingField, parentField] = true overridenFields[existingField, parentField] = true
if (parentField.nullable != existingField.nullable) {
existingField.useNullableForReplace = true
}
} }
} else { } else {
overridenFields[parentField, parentField] = true overridenFields[parentField, parentField] = true
@@ -174,4 +179,4 @@ class TypeArgumentWithMultipleUpperBounds(name: String, override val upperBounds
} }
} }
data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable
@@ -26,6 +26,7 @@ sealed class Field : Importable {
open val fromDelegate: Boolean get() = false open val fromDelegate: Boolean get() = false
open val overridenTypes: MutableSet<Importable> = mutableSetOf() open val overridenTypes: MutableSet<Importable> = mutableSetOf()
open var useNullableForReplace: Boolean = false
fun copy(): Field = internalCopy().also { fun copy(): Field = internalCopy().also {
updateFieldsInCopy(it) updateFieldsInCopy(it)
@@ -39,6 +40,7 @@ sealed class Field : Importable {
copy.needTransformInOtherChildren = needTransformInOtherChildren copy.needTransformInOtherChildren = needTransformInOtherChildren
copy.isMutable = isMutable copy.isMutable = isMutable
copy.overridenTypes += overridenTypes copy.overridenTypes += overridenTypes
copy.useNullableForReplace = useNullableForReplace
} }
copy.fromParent = fromParent copy.fromParent = fromParent
} }
@@ -98,6 +100,10 @@ class FieldWithDefault(val origin: Field) : Field() {
override val overridenTypes: MutableSet<Importable> override val overridenTypes: MutableSet<Importable>
get() = origin.overridenTypes get() = origin.overridenTypes
override var useNullableForReplace: Boolean
get() = origin.useNullableForReplace
set(_) {}
override fun internalCopy(): Field { override fun internalCopy(): Field {
return FieldWithDefault(origin).also { return FieldWithDefault(origin).also {
it.defaultValueInImplementation = defaultValueInImplementation it.defaultValueInImplementation = defaultValueInImplementation
@@ -84,15 +84,15 @@ fun SmartPrinter.printElement(element: Element) {
override() override()
println("fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visit$name(this, data)") println("fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visit$name(this, data)")
fun Field.replaceDeclaration(override: Boolean, overridenType: Importable? = null) { fun Field.replaceDeclaration(override: Boolean, overridenType: Importable? = null, forceNullable: Boolean = false) {
println() println()
abstract() abstract()
if (override) print("override ") if (override) print("override ")
println(replaceFunctionDeclaration(overridenType)) println(replaceFunctionDeclaration(overridenType, forceNullable))
} }
allFields.filter { it.withReplace }.forEach { allFields.filter { it.withReplace }.forEach {
it.replaceDeclaration(overridenFields[it, it]) it.replaceDeclaration(overridenFields[it, it], forceNullable = it.useNullableForReplace)
for (overridenType in it.overridenTypes) { for (overridenType in it.overridenTypes) {
it.replaceDeclaration(true, overridenType) it.replaceDeclaration(true, overridenType)
} }
@@ -303,10 +303,15 @@ fun SmartPrinter.printImplementation(implementation: Implementation) {
} }
} }
fun generateReplace(field: Field, overridenType: Importable? = null, body: () -> Unit) { fun generateReplace(
field: Field,
overridenType: Importable? = null,
forceNullable: Boolean = false,
body: () -> Unit,
) {
println() println()
abstract() abstract()
print("override ${field.replaceFunctionDeclaration(overridenType)}") print("override ${field.replaceFunctionDeclaration(overridenType, forceNullable)}")
if (isInterface || isAbstract) { if (isInterface || isAbstract) {
println() println()
return return
@@ -326,7 +331,7 @@ fun SmartPrinter.printImplementation(implementation: Implementation) {
for (field in allFields.filter { it.withReplace }) { for (field in allFields.filter { it.withReplace }) {
val capitalizedFieldName = field.name.capitalize() val capitalizedFieldName = field.name.capitalize()
val newValue = "new$capitalizedFieldName" val newValue = "new$capitalizedFieldName"
generateReplace(field) { generateReplace(field, forceNullable = field.useNullableForReplace) {
when { when {
field.withGetter -> {} field.withGetter -> {}
@@ -336,6 +341,9 @@ fun SmartPrinter.printImplementation(implementation: Implementation) {
} }
else -> { else -> {
if (field.useNullableForReplace) {
println("require($newValue != null)")
}
println("${field.name} = $newValue") println("${field.name} = $newValue")
} }
} }
@@ -96,10 +96,13 @@ fun transformFunctionDeclaration(transformName: String, returnType: String): Str
return "fun <D> transform$transformName(transformer: FirTransformer<D>, data: D): $returnType" return "fun <D> transform$transformName(transformer: FirTransformer<D>, data: D): $returnType"
} }
fun Field.replaceFunctionDeclaration(overridenType: Importable? = null): String { fun Field.replaceFunctionDeclaration(overridenType: Importable? = null, forceNullable: Boolean = false): String {
val capName = name.capitalize() val capName = name.capitalize()
val type = overridenType?.typeWithArguments ?: typeWithArguments val type = overridenType?.typeWithArguments ?: typeWithArguments
return "fun replace$capName(new$capName: $type)"
val typeWithNullable = if (forceNullable && !type.endsWith("?")) "$type?" else type
return "fun replace$capName(new$capName: $typeWithNullable)"
} }
val Field.mutableType: String val Field.mutableType: String