diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 55b8a38c789..db9281e5519 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -49,23 +49,10 @@ class CandidateFactory private constructor( implicitExtensionReceiverValue: ImplicitReceiverValue<*>? = null, builtInExtensionFunctionReceiverValue: ReceiverValue? = null ): Candidate { - val receiverExpression = builtInExtensionFunctionReceiverValue?.let { - val receiverExpression = builtInExtensionFunctionReceiverValue.receiverExpression - if (receiverExpression is FirQualifiedAccessExpression && - it.type != builtInExtensionFunctionReceiverValue.receiverExpression.typeRef.coneTypeUnsafe()) { - buildExpressionWithSmartcast { - originalExpression = receiverExpression - typeRef = receiverExpression.typeRef.resolvedTypeFromPrototype(it.type) - typesFromSmartCast = listOf(it.type) - } - } else { - receiverExpression - } - } return Candidate( symbol, dispatchReceiverValue, implicitExtensionReceiverValue, explicitReceiverKind, bodyResolveComponents, baseSystem, - receiverExpression?.let { + builtInExtensionFunctionReceiverValue?.receiverExpression?.let { callInfo.withReceiverAsArgument(it) } ?: callInfo ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index e6309053378..48f6749b5a0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -10,12 +10,15 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.builder.buildThisReceiverExpression import org.jetbrains.kotlin.fir.references.builder.buildImplicitThisReference import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.scope +import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirQualifierScope import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope @@ -23,11 +26,8 @@ import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType -import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.ConeStarProjection +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.name.ClassId @@ -44,7 +44,7 @@ interface ReceiverValue : Receiver { type.scope(useSiteSession, scopeSession) } -private fun receiverExpression(symbol: AbstractFirBasedSymbol<*>, type: ConeKotlinType): FirExpression = +private fun receiverExpression(symbol: AbstractFirBasedSymbol<*>, type: ConeKotlinType): FirThisReceiverExpression = buildThisReceiverExpression { calleeReference = buildImplicitThisReference { boundSymbol = symbol @@ -96,7 +96,9 @@ sealed class ImplicitReceiverValue>( override fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? = implicitScope - override val receiverExpression: FirExpression = receiverExpression(boundSymbol, type) + private val originalReceiverExpression: FirThisReceiverExpression = receiverExpression(boundSymbol, type) + final override var receiverExpression: FirExpression = originalReceiverExpression + private set /* * Should be called only in ImplicitReceiverStack @@ -104,6 +106,15 @@ sealed class ImplicitReceiverValue>( internal fun replaceType(type: ConeKotlinType) { if (type == this.type) return this.type = type + receiverExpression = if (type == originalReceiverExpression.typeRef.coneTypeUnsafe()) { + originalReceiverExpression + } else { + buildExpressionWithSmartcast { + originalExpression = originalReceiverExpression + typeRef = originalReceiverExpression.typeRef.resolvedTypeFromPrototype(type) + typesFromSmartCast = listOf(type) + } + } implicitScope = type.scope(useSiteSession, scopeSession) } }