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.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope 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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* 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.ConstantValueKind
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.runIf
internal fun <T : IrElement> FirElement.convertWithOffsets( internal fun <T : IrElement> FirElement.convertWithOffsets(
f: (startOffset: Int, endOffset: Int) -> T f: (startOffset: Int, endOffset: Int) -> T
@@ -220,31 +222,36 @@ fun FirReference.toSymbolForCall(
} }
} }
private fun FirResolvedQualifier.toLookupTag(): ConeClassLikeLookupTag? = (symbol as? FirClassSymbol)?.toLookupTag()
context(Fir2IrComponents) context(Fir2IrComponents)
private fun FirCallableSymbol<*>.toSymbolForCall( private fun FirCallableSymbol<*>.toSymbolForCall(
dispatchReceiver: FirExpression, dispatchReceiver: FirExpression,
preferGetter: Boolean, preferGetter: Boolean,
// Note: in fact LHS for callable references and explicit receiver for normal qualified accesses
explicitReceiver: FirExpression? = null, explicitReceiver: FirExpression? = null,
isDelegate: Boolean = false, isDelegate: Boolean = false,
isReference: Boolean = false isReference: Boolean = false
): IrSymbol? { ): IrSymbol? {
val fakeOverrideOwnerLookupTag = fir.importedFromObjectOrStaticData.takeIf { isStatic }?.let { val fakeOverrideOwnerLookupTag = when {
ConeClassLikeLookupTagImpl(it.objectClassId) // Static fake overrides
} ?: when (dispatchReceiver) { isStatic -> {
is FirNoReceiverExpression -> { fir.importedFromObjectOrStaticData?.let {
val containingClass = containingClassLookupTag() ConeClassLikeLookupTagImpl(it.objectClassId)
if (containingClass != null && containingClass.classId != StandardClassIds.Any) { } ?: (explicitReceiver as? FirResolvedQualifier)?.toLookupTag()
// Make sure that symbol is not extension and is not from inline class }
((explicitReceiver as? FirResolvedQualifier)?.symbol as? FirClassSymbol)?.toLookupTag() // Member fake override or bound callable reference
} else { dispatchReceiver !is FirNoReceiverExpression -> {
null 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 -> null
else -> {
if (isStatic && dispatchReceiver is FirResolvedQualifier) (dispatchReceiver.symbol as? FirClassSymbol)?.toLookupTag()
else dispatchReceiver.typeRef.coneType.let { it.findClassRepresentation(it, declarationStorage.session) }
}
} }
return when (this) { return when (this) {