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 6fd700487d3..3e026f91444 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 @@ -153,6 +153,30 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } + private fun transformCallee(qualifiedAccess: T): T { + val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess + + qualifiedAccess.explicitReceiver?.visitNoTransform(this, null) + + val receiver = qualifiedAccess.explicitReceiver + + //val checkers = listOf(VariableApplicabilityChecker(callee.name)) + + val info = CallInfo(true, receiver, 0) + val resolver = CallResolver(jump, session) + resolver.callInfo = info + resolver.scopes = (scopes + localScopes).asReversed() + + val consumer = createVariableConsumer( + session, callee.name, qualifiedAccess.explicitReceiver, qualifiedAccess.explicitReceiver?.resultType + ) + val result = resolver.runTowerResolver(consumer) + val successCandidates = result.successCandidates() + val resultExpression = qualifiedAccess.transformCalleeReference(this, successCandidates) as T + if (resultExpression is FirExpression) storeTypeFromCallee(resultExpression) + return resultExpression + } + override fun transformQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any? @@ -178,25 +202,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } } - val callee = qualifiedAccessExpression.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccessExpression.compose() + return transformCallee(qualifiedAccessExpression).compose() + } - qualifiedAccessExpression.explicitReceiver?.visitNoTransform(this, null) - - val receiver = qualifiedAccessExpression.explicitReceiver - - //val checkers = listOf(VariableApplicabilityChecker(callee.name)) - - val info = CallInfo(true, receiver, 0) - val resolver = CallResolver(jump, session) - resolver.callInfo = info - resolver.scopes = (scopes + localScopes).asReversed() - - val consumer = createVariableConsumer(session, callee.name, qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.explicitReceiver?.resultType) - val result = resolver.runTowerResolver(consumer) - val successCandidates = result.successCandidates() - val resultExpression = qualifiedAccessExpression.transformCalleeReference(this, successCandidates) - storeTypeFromCallee(resultExpression as FirQualifiedAccessExpression) - return resultExpression.compose() + override fun transformVariableAssignment( + variableAssignment: FirVariableAssignment, + data: Any? + ): CompositeTransformResult { + variableAssignment.rValue.visitNoTransform(this, null) + return transformCallee(variableAssignment).compose() } override fun transformFunctionCall(functionCall: FirFunctionCall, data: Any?): CompositeTransformResult { diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt index 0f1cfa484ff..67ee1396ec2 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/noPrimaryConstructor.txt @@ -4,7 +4,7 @@ FILE: noPrimaryConstructor.kt public get(): R|kotlin/String| public constructor(x: R|kotlin/String|): super() { - this#.x# = R|/x| + this#.R|/NoPrimary.x| = R|/x| } public constructor(): this(String())