diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 92eaae9e9ba..d8e3f44675c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -169,9 +169,15 @@ private fun FirBasedSymbol<*>.toSymbolForCall( session: FirSession, classifierStorage: Fir2IrClassifierStorage, declarationStorage: Fir2IrDeclarationStorage, - preferGetter: Boolean + preferGetter: Boolean, + explicitReceiver: FirExpression? = null ) = when (this) { - is FirCallableSymbol<*> -> unwrapCallRepresentative().toSymbolForCall(dispatchReceiver, declarationStorage, preferGetter) + is FirCallableSymbol<*> -> unwrapCallRepresentative().toSymbolForCall( + dispatchReceiver, + declarationStorage, + preferGetter, + explicitReceiver + ) is FirClassifierSymbol<*> -> toSymbol(session, classifierStorage) else -> error("Unknown symbol: $this") } @@ -182,13 +188,21 @@ fun FirReference.toSymbolForCall( classifierStorage: Fir2IrClassifierStorage, declarationStorage: Fir2IrDeclarationStorage, conversionScope: Fir2IrConversionScope, - preferGetter: Boolean = true + preferGetter: Boolean = true, + explicitReceiver: FirExpression? = null // Actual only for callable references ): IrSymbol? { return when (this) { is FirResolvedNamedReference -> - resolvedSymbol.toSymbolForCall(dispatchReceiver, session, classifierStorage, declarationStorage, preferGetter) + resolvedSymbol.toSymbolForCall(dispatchReceiver, session, classifierStorage, declarationStorage, preferGetter, explicitReceiver) is FirErrorNamedReference -> - candidateSymbol?.toSymbolForCall(dispatchReceiver, session, classifierStorage, declarationStorage, preferGetter) + candidateSymbol?.toSymbolForCall( + dispatchReceiver, + session, + classifierStorage, + declarationStorage, + preferGetter, + explicitReceiver + ) is FirThisReference -> { when (val boundSymbol = boundSymbol) { is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol).owner.thisReceiver?.symbol @@ -207,10 +221,20 @@ fun FirReference.toSymbolForCall( private fun FirCallableSymbol<*>.toSymbolForCall( dispatchReceiver: FirExpression, declarationStorage: Fir2IrDeclarationStorage, - preferGetter: Boolean + preferGetter: Boolean, + explicitReceiver: FirExpression? = null ): IrSymbol? { val dispatchReceiverLookupTag = when (dispatchReceiver) { - is FirNoReceiverExpression -> null + is FirNoReceiverExpression -> { + val containingClass = containingClass() + if (containingClass != null && containingClass.classId != StandardClassIds.Any) { + // Make sure that symbol is not extension and is not from inline class + val coneType = ((explicitReceiver as? FirResolvedQualifier)?.symbol as? FirClassSymbol)?.defaultType() + coneType?.findClassRepresentation(coneType, declarationStorage.session) + } else { + null + } + } else -> { val coneType = dispatchReceiver.typeRef.coneType dispatchReceiver.typeRef.coneType.findClassRepresentation(coneType, declarationStorage.session) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 91b90828d99..b7cf532332d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -77,7 +77,8 @@ class CallAndReferenceGenerator( } val symbol = callableReferenceAccess.calleeReference.toSymbolForCall( - callableReferenceAccess.dispatchReceiver, session, classifierStorage, declarationStorage, conversionScope + callableReferenceAccess.dispatchReceiver, session, classifierStorage, declarationStorage, conversionScope, + explicitReceiver = callableReferenceAccess.explicitReceiver ) // val x by y -> // val `x$delegate` = y diff --git a/compiler/testData/codegen/box/callableReference/function/dispatchReceiverType.kt b/compiler/testData/codegen/box/callableReference/function/dispatchReceiverType.kt index 49fb2ba690d..f36f3cafcc1 100644 --- a/compiler/testData/codegen/box/callableReference/function/dispatchReceiverType.kt +++ b/compiler/testData/codegen/box/callableReference/function/dispatchReceiverType.kt @@ -1,6 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: IAE: tried to access class test.PX from class BoxKt$box$2 // MODULE: lib // FILE: X.java package test; diff --git a/compiler/testData/codegen/box/reflection/parameters/instanceParameterOfFakeOverride.kt b/compiler/testData/codegen/box/reflection/parameters/instanceParameterOfFakeOverride.kt index c29bbd430b7..aa819161ac4 100644 --- a/compiler/testData/codegen/box/reflection/parameters/instanceParameterOfFakeOverride.kt +++ b/compiler/testData/codegen/box/reflection/parameters/instanceParameterOfFakeOverride.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: Expected , actual // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/codegen/box/reflection/properties/kotlinPropertyInheritedInJava.kt b/compiler/testData/codegen/box/reflection/properties/kotlinPropertyInheritedInJava.kt index 574bd003bd5..9b239894340 100644 --- a/compiler/testData/codegen/box/reflection/properties/kotlinPropertyInheritedInJava.kt +++ b/compiler/testData/codegen/box/reflection/properties/kotlinPropertyInheritedInJava.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: Fail J::prop == K::prop (these are different properties) // TARGET_BACKEND: JVM // WITH_REFLECT