[FIR2IR] Initialize fake overrides for callable references

This commit is contained in:
Ivan Kochurkin
2021-12-02 23:35:59 +03:00
committed by Space
parent f68c8f8f01
commit 522d2064bb
5 changed files with 33 additions and 14 deletions
@@ -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)
@@ -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
@@ -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;
@@ -1,5 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: Expected <class B>, actual <class A>
// TARGET_BACKEND: JVM
// WITH_REFLECT
@@ -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