FIR2IR: simplify f/o owner lookup tag extraction

This commit is contained in:
Mikhail Glukhikh
2022-11-09 13:06:44 +01:00
committed by Space Team
parent 4cb41f8e82
commit d35dedcb72
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.types.ConstantValueKind
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.runIf
internal fun <T : IrElement> FirElement.convertWithOffsets(
f: (startOffset: Int, endOffset: Int) -> T
@@ -220,31 +222,36 @@ fun FirReference.toSymbolForCall(
}
}
private fun FirResolvedQualifier.toLookupTag(): ConeClassLikeLookupTag? = (symbol as? FirClassSymbol)?.toLookupTag()
context(Fir2IrComponents)
private fun FirCallableSymbol<*>.toSymbolForCall(
dispatchReceiver: FirExpression,
preferGetter: Boolean,
// Note: in fact LHS for callable references and explicit receiver for normal qualified accesses
explicitReceiver: FirExpression? = null,
isDelegate: Boolean = false,
isReference: Boolean = false
): IrSymbol? {
val fakeOverrideOwnerLookupTag = fir.importedFromObjectOrStaticData.takeIf { isStatic }?.let {
ConeClassLikeLookupTagImpl(it.objectClassId)
} ?: when (dispatchReceiver) {
is FirNoReceiverExpression -> {
val containingClass = containingClassLookupTag()
if (containingClass != null && containingClass.classId != StandardClassIds.Any) {
// Make sure that symbol is not extension and is not from inline class
((explicitReceiver as? FirResolvedQualifier)?.symbol as? FirClassSymbol)?.toLookupTag()
} else {
null
val fakeOverrideOwnerLookupTag = when {
// Static fake overrides
isStatic -> {
fir.importedFromObjectOrStaticData?.let {
ConeClassLikeLookupTagImpl(it.objectClassId)
} ?: (explicitReceiver as? FirResolvedQualifier)?.toLookupTag()
}
// Member fake override or bound callable reference
dispatchReceiver !is FirNoReceiverExpression -> {
dispatchReceiver.typeRef.coneType.let { it.findClassRepresentation(it, declarationStorage.session) }
}
// Unbound callable reference to member (non-extension)
isReference && fir.receiverTypeRef == null -> {
// TODO: remove runIf with StandardClassIds.Any comparison after fixing ValueClass::equals case (KT-54887)
runIf(containingClassLookupTag()?.classId != StandardClassIds.Any) {
(explicitReceiver as? FirResolvedQualifier)?.toLookupTag()
}
}
else -> {
if (isStatic && dispatchReceiver is FirResolvedQualifier) (dispatchReceiver.symbol as? FirClassSymbol)?.toLookupTag()
else dispatchReceiver.typeRef.coneType.let { it.findClassRepresentation(it, declarationStorage.session) }
}
else -> null
}
return when (this) {