[FIR2IR] Initialize fake overrides for callable references
This commit is contained in:
@@ -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)
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
-2
@@ -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;
|
||||
|
||||
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: Expected <class B>, actual <class A>
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_REFLECT
|
||||
|
||||
|
||||
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user