diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 04155e21bce..8cd48fca79f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -182,6 +182,35 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } }) + private fun transformCallee(qualifiedAccess: T): T { + val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess + + val receiver = qualifiedAccess.explicitReceiver?.transformSingle(this, noExpectedType) + + val info = CallInfo(CallKind.VariableAccess, receiver, emptyList(), emptyList()) { it.resultType } + val resolver = CallResolver(jump, session) + resolver.callInfo = info + resolver.scopes = (scopes + localScopes).asReversed() + + val consumer = createVariableAndObjectConsumer( + session, + callee.name, + info, inferenceComponents + ) + val result = resolver.runTowerResolver(consumer) + + val nameReference = createResolvedNamedReference( + callee, + result.bestCandidates(), + result.currentApplicability + ) + + val resultExpression = + qualifiedAccess.transformCalleeReference(StoreNameReference, nameReference) as T + if (resultExpression is FirExpression) storeTypeFromCallee(resultExpression) + return resultExpression + } + override fun transformQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any? @@ -207,32 +236,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } } - val callee = qualifiedAccessExpression.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccessExpression.compose() + return transformCallee(qualifiedAccessExpression).compose() + } - val receiver = qualifiedAccessExpression.explicitReceiver?.transformSingle(this, null) - - val info = CallInfo(CallKind.VariableAccess, receiver, emptyList(), emptyList()) { it.resultType } - val resolver = CallResolver(jump, session) - resolver.callInfo = info - resolver.scopes = (scopes + localScopes).asReversed() - - val consumer = createVariableAndObjectConsumer( - session, - callee.name, - info, inferenceComponents - ) - val result = resolver.runTowerResolver(consumer) - - val nameReference = createResolvedNamedReference( - callee, - result.bestCandidates(), - result.currentApplicability - ) - - val resultExpression = - qualifiedAccessExpression.transformCalleeReference(StoreNameReference, nameReference) - storeTypeFromCallee(resultExpression as FirQualifiedAccessExpression) - return resultExpression.compose() + override fun transformVariableAssignment( + variableAssignment: FirVariableAssignment, + data: Any? + ): CompositeTransformResult { + val variableAssignment = variableAssignment.transformRValue(this, null) + return transformCallee(variableAssignment).compose() } private fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?): FirFunctionCall { diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt index 1e3e3753594..1d8de32469f 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt @@ -5,7 +5,7 @@ FILE: noPrimaryConstructor.kt public constructor(x: R|kotlin/String|): R|NoPrimary| { super() - this#.x# = R|/x| + this#.R|/NoPrimary.x| = R|/x| } public constructor(): R|NoPrimary| { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAssignment.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAssignment.kt index 3e5c53ee42a..bc88c1cfa8d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAssignment.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAssignment.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirReference +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirAssignment : FirQualifiedAccess { @@ -15,6 +16,8 @@ interface FirAssignment : FirQualifiedAccess { val operation: FirOperation + fun transformRValue(transformer: FirTransformer, data: D): FirAssignment + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitAssignment(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractAssignment.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractAssignment.kt index 747a06edd7a..48b4d333754 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractAssignment.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractAssignment.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.expressions.FirAssignment import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment @@ -29,6 +30,11 @@ abstract class FirAbstractAssignment( calleeReference = value } + override fun transformRValue(transformer: FirTransformer, data: D): FirAssignment { + rValue = rValue.transformSingle(transformer, data) + return this + } + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { rValue = rValue.transformSingle(transformer, data) return super.transformChildren(transformer, data)